1. 程式人生 > 其它 >20193312朱文昱python綜合實驗報告

20193312朱文昱python綜合實驗報告

20193312 2021-6 《Python程式設計》綜合實驗報告

課程:《Python程式設計》
班級: 1933
姓名: 朱文昱
學號:20193312
實驗教師:王志強
實驗日期:2020年6月24日
必修/選修: 公選課

1.實驗內容

內容:
貪吃蛇小遊戲製作
要求:
能用電腦的方向鍵控制蛇的移動
在蛇移動的過程中隨機生成食物
當蛇吃到食物後會變長
如果蛇頭觸碰到了自己的身體則判定死亡, 遊戲結束

2. 實驗過程及結果

引用庫:pygame(遊戲套件庫)、random
定義訊息視窗大小、視窗色調、視窗顯示的標題、遊戲區域網格大小劃分
蛇的出生位置和蛇頭的定義、初始時隨機生成的食物位置:

caption_width = 500  # 寬度500畫素點
caption_height = 500  # 高度500畫素點
white_color = (255, 255, 255)  # 白色rgb
black_color = (0, 0, 0)
game_title = '貪吃蛇小遊戲實現'  # 訊息視窗主標題
cell = 10  # 網格大小為10×10
snake_init_pos = [[250, 250], [240, 250], [230, 250], [220, 250]]  # 蛇的初始位置(初始時長度為四格)
food_pos = [random.randrange(1, 50) * 10, random.randrange(1, 50) * 10]  # 食物初始隨機位置
head_pos = [250, 250]  #蛇頭位置  

將定義好的構建訊息視窗大小匯入變數中:

caption = pygame.display.set_mode((caption_width, caption_height))
pygame.display.set_caption(game_title)

再採用主迴圈捕獲鍵盤控制訊息的方式實現使用者對蛇的控制:

 while 1:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    head_pos[0] -= cell
                    change_direction(head_pos)
                elif event.key == pygame.K_RIGHT:
                    head_pos[0] += cell
                    change_direction(head_pos)
                elif event.key == pygame.K_UP:
                    head_pos[1] -= cell
                    change_direction(head_pos)
                elif event.key == pygame.K_DOWN:
                    head_pos[1] += cell
                    change_direction(head_pos)

此時蛇能夠在使用者的操作下進行三個方向的移動了,但是在第一個食物被吃掉後,無法隨機生成新的食物,故需要進一步加入食物的迴圈隨機生成,但考慮到食物的生成和使用者的操作有關,既在蛇吃掉了上一個食物,新的食物才能生成,不然介面馬上就會被食物填滿了,所以將食物生成語句放在了蛇頭的位置判斷中,這裡的位置判斷同時實現了蛇咬到自己和蛇頭撞到牆壁上的死亡判斷:

def change_direction(head_pos):
    global food_pos
    snake_init_pos.insert(0, list(head_pos))

    if head_pos != food_pos:
        snake_init_pos.pop()
    else:
        food_pos = [random.randrange(1, 50) * 10, random.randrange(1, 50) * 10]

    if hit_the_self() or hit_the_wall(head_pos):
        # 判定死亡,直接退出遊戲
        pygame.quit()

遊戲執行:
蛇和食物的初始位置:

當蛇吃了一定量的食物後:

則遊戲功能基本實現。
以下為遊戲的完整原始碼:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2021/6/20 22:07
# @Author  : 朱文昱
# @FileName: final test1.py
# @Software: PyCharm


import pygame
import random

caption_width = 500  # 寬度500畫素點
caption_height = 500  # 高度500畫素點
white_color = (255, 255, 255)  # 白色rgb
black_color = (0, 0, 0)
game_title = '貪吃蛇小遊戲實現'  # 訊息視窗主標題
cell = 10  # 網格大小為10×10
snake_init_pos = [[250, 250], [240, 250], [230, 250], [220, 250]]  # 蛇的初始位置(初始時長度為四格)
food_pos = [random.randrange(1, 50) * 10, random.randrange(1, 50) * 10]  # 食物初始隨機位置
head_pos = [250, 250]  #蛇頭位置

pygame.init()  # 初始化 pygame
clock = pygame.time.Clock()

caption = pygame.display.set_mode((caption_width, caption_height))
pygame.display.set_caption(game_title)


def draw_rect(color, position):
    pygame.draw.rect(caption, color, pygame.Rect(position[0], position[1], cell, cell))


def hit_the_self():
    if snake_init_pos[0] in snake_init_pos[1:]:
        return True
    else:
        return False


def hit_the_wall(head_pos):
    if head_pos[0] >= caption_width or head_pos[0] < 0 or head_pos[1] >= caption_height or head_pos[1] < 0:
        return True
    else:
        return False


def change_direction(head_pos):
    global food_pos
    snake_init_pos.insert(0, list(head_pos))

    if head_pos != food_pos:
        snake_init_pos.pop()
    else:
        food_pos = [random.randrange(1, 50) * 10, random.randrange(1, 50) * 10]

    if hit_the_self() or hit_the_wall(head_pos):
        # 判定死亡,直接退出遊戲
        pygame.quit()


def main():
    for pos in snake_init_pos:
        draw_rect(white_color, pos)

    draw_rect(white_color, food_pos)
    pygame.display.update()

    while 1:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    head_pos[0] -= cell
                    change_direction(head_pos)
                elif event.key == pygame.K_RIGHT:
                    head_pos[0] += cell
                    change_direction(head_pos)
                elif event.key == pygame.K_UP:
                    head_pos[1] -= cell
                    change_direction(head_pos)
                elif event.key == pygame.K_DOWN:
                    head_pos[1] += cell
                    change_direction(head_pos)

        caption.fill(black_color)
        draw_rect(white_color, food_pos)

        for pos in snake_init_pos:
            draw_rect(white_color, pos)

        pygame.display.update()
        clock.tick(10)


if __name__ == '__main__':
    main()

3. 實驗過程中遇到的問題和解決過程

  • 問題1:小蛇在遊戲中無法自己朝著蛇頭方向前進
  • 問題1解決方案:在主迴圈中加入對小蛇的位置重新整理,並使用計時設定好前進的速度
  • 問題2:在誤觸到與蛇頭前進方向相反的按鍵時會直接判定死亡退出遊戲
  • 問題2解決方案:在判斷按鍵操作時加入對蛇頭方向的識別,將與蛇頭方向相反的按鍵無效化

其他(感悟、思考、建議等)

python使我受益良多,王老師很多的時候的教學方式是以自學為主的,通過觀看雲班課中的視訊自學完成內容,我可以此每次順利完成作業。回顧整學期,迴圈、列表、類、元組、函式、正則表達等等我都熟悉了知識點,而且每次作業雖然會遇到困難,但是通過自己查資料解決也使我有了自主學習的能力和解決問題的能力。我還是很喜歡老師這樣的教學方式的,因為我現在越來越體會到自學的重要性,老師不是一直存在的,通過自己的資源和能力獲取知識才是最可靠的。
希望老師可以繼續這樣教學下去,通過獨特的教學方式也讓之後報這門選修的同學們領悟到自學的重要性。同時也希望老師在以後的課程中更多的安排些有趣的實踐專案讓同學們去做,畢竟我們在使用python的時候是能記住更多的知識點的,也像某位大佬說的那樣,想在一個領域上有所收穫,就應該在該領域上完成一個專案。
最後說一下這次實驗的感想吧,這次實驗其實我是完全自學的,遊戲中很多的點都是雲班課裡沒有講過的,收益於網際網路時代,許多知識都可以在各種部落格論壇甚至是bilibili上找到答案。很感謝記筆記的自己,之前的知識我也通過筆記運用到了這次實驗中。