手把手教你使用Python写贪吃蛇游戏(pygame)
我們要使用Python編寫貪吃蛇游戲,需要使用到pygame模塊,即在PyCharm終端輸入
pip install pygame安裝完畢即可。
在pygame有三個對象比較重要,分別是
pygame.display—設置場景顯示,包括頁面大小,頁面標題,頁面更新(刷新)等;
pygame.time–設置一切與時間相關的設置,游戲的幀頻,游戲的持續時間等;
pygame.event–設置與事件相關的處理,比如鼠標點擊事件,鍵盤按下事件等;
pygame.draw–繪制圖形到界面上。
1.搭建初始框架
要做貪吃蛇游戲,首先第一步就是搭建一個初始界面,具體包括設置界面的size,設置關閉界面事件,設置幀頻以及頁面背景渲染和更新頁面等,具體代碼如下所示:
import pygame # 定義顯示窗口的W(寬) H(高) W = 960 H = 800 size = (960, 600) pygame.init() # 初始化界面 window = pygame.display.set_mode(size) pygame.display.set_caption("貪吃蛇大作戰") showWindow = True clock = pygame.time.Clock() #時鐘控制 while showWindow:# 處理事件for event in pygame.event.get():if event.type == pygame.QUIT:showWindow = False# 頁面渲染pygame.draw.rect(window, (255, 255, 255), (0, 0, W, H))pygame.display.flip() #更新整個待顯示的Surface對象到屏幕上clock.tick(30)# 設置幀頻此時運行程序可以顯示一個正常的界面,點擊右上角關閉可以關閉程序!不僅如此,而且對頁面進行了簡單的渲染,即改變了界面的背景顏色為白色;
2.繪制場景與蛇頭
我們可以將整個界面按照行row與列col來進行劃分,因此頁面中的每一塊都對應著一個坐標(row,col),這樣我們只需要設置相應的行row與列col,即可繪制出蛇頭與食物;
具體代碼如下所示:
接下來在游戲循環中繪制蛇頭與食物即可,如下所示:
# 定義蛇頭head = Point(row=int(ROW/2), col=int(COL/2))# 在頁面中心定義蛇頭head_color = (0, 128, 128) # 用RGB表示顏色# 定義食物food = ge_food() #ge_food()是隨機產生食物的函數 防止食物與蛇重合food_color = (255, 255, 0)# 畫蛇頭rect(head, head_color)# 畫食物rect(food, food_color)3.移動蛇頭
我們需要知道蛇身是隨著蛇頭移動的,因此,首先我們就要使得蛇頭移動起來,而蛇頭在界面中使用row與col唯一定位,我們只需要明白其中的移動邏輯即可,具體如下:
left-->head.col-1,row不變 right-->head.col+1,row不變 top-->head.row-1,col不變 down-->head.row+1,col不變同時需要知道,蛇頭在向右移的時候不能再改變直接方向向左移,這樣不合理;向上移動的時候不能直接改變方向向下移動;其他方向類似;
雖然我們每次改變的的行列數都是1,但是我們是將上述的改變寫在游戲循環中,因此在界面上我們可以看見蛇頭不斷的移動。
4.繪制蛇體
繪制蛇體也很簡單,我們只需要將蛇體的坐標存放在一個snakes列表中,當蛇頭移動時,我們只需要將蛇體按照蛇頭的方向依次移動,并且舍棄列表中的最后一個元素即可。簡單來說,我們編寫程序時,就要在蛇頭移動之前,將蛇頭坐標插入到蛇體列表snakes中,并舍棄snakes中的最后一個坐標即可。
snake_color = (128, 128, 128)snakes = [] #定義蛇身列表# 將蛇頭插入到snakes列表中snakes.insert(0, head.copy())# 將最后一個元素刪除snakes.pop()# 畫蛇身for snake in snakes:rect(snake, snake_color)5.解決相關不足
這里我們的貪吃蛇游戲仍然有很多不足,即還要解決蛇撞墻的問題,蛇吃蛇身的問題以及蛇吃到食物就會增長的問題,這里將一一得到解決;
具體代碼如下所示:
這里可以做的更加精細,這里我設置的是一旦蛇撞墻與蛇咬蛇身就直接退出界面。
6.運行結果展示
黃色的是隨機產生的食物,而深色的是蛇頭,蛇頭吃到食物就吃長出蛇身。由于時間比較緊張,所以只是完成了基本的功能,后期會繼續完善,包括多種游戲模式的設置,無盡模式,闖關模式等,還有背景圖片背景音樂的加入,甚至可以用自定義的圖片來設置蛇頭的顯示等等。
7.全部代碼展示
import pygame import random class Point:def __init__(self, row=0, col=0):self.row = rowself.col = coldef copy(self):return Point(self.row, self.col) # 定義顯示窗口的W(寬) H(高) W = 800 H = 600 snakes = [] #定義蛇身列表 def ge_food():while True:pos = Point(random.randint(0, ROW - 1), random.randint(0, COL - 1))is_collide = Falseif pos.row == head.row and pos.col == head.col: # 與蛇頭重合is_collide = True# 與蛇身碰撞for snake in snakes:if (snake.row == pos.row and snake.col == pos.col):is_collide = Truebreakif not is_collide:return pos ROW = 40 #行數 COL = 30 #列數 size = (W, H) pygame.init() # 初始化界面 window = pygame.display.set_mode(size) pygame.display.set_caption("貪吃蛇大作戰") bak_color = (255, 255, 255) # 定義蛇頭 head = Point(row=int(ROW/2), col=int(COL/2)) head_color = (0, 128, 128) # 定義食物 food = ge_food() food_color = (255, 255, 0)snake_color = (128, 128, 128) direct = 'left' def rect(point, color):cell_width = W/COLcell_height = H/ROWleft = point.col*cell_widthtop = point.row*cell_heightpygame.draw.rect(window, color,(left, top, cell_width, cell_height))showWindow = True clock = pygame.time.Clock() #時鐘控制 while showWindow:# 處理事件for event in pygame.event.get():if event.type == pygame.QUIT:showWindow = Falseif event.type == pygame.KEYDOWN:if event.key == pygame.K_UP:if direct=='left' or direct=='right':direct = "top"elif event.key == pygame.K_DOWN:if direct == 'left' or direct == 'right':direct = "down"elif event.key == pygame.K_LEFT:if direct=='top' or direct=='down':direct = 'left'elif event.key == pygame.K_RIGHT:if direct == 'top' or direct == 'down':direct = 'right'# 判斷蛇是否吃到東西eat = Falseif head.row == food.row and head.col == food.col:# 蛇吃到食物eat = Trueif eat:# 吃到食物就要產生新的食物food = ge_food()# 將蛇頭插入到snakes列表中snakes.insert(0, head.copy())# 將最后一個元素刪除if not eat:snakes.pop()# 移動蛇頭if direct == 'left':head.col-=1 # 注意 direct = 'left'與head.col-=1不能寫在一起 因為蛇頭要一直移動elif direct == 'right':head.col+=1elif direct == 'top':head.row-=1else:head.row+=1# 判斷蛇是否死亡dead = False# 判斷蛇是否撞墻if head.col<0 or head.row<0 or head.row>=ROW or head.col>=COL:dead = True# 判斷蛇是否撞蛇身for snake in snakes:if snake.row==head.row and snake.col==head.col:dead = Truebreakif dead:showWindow = False# 頁面渲染pygame.draw.rect(window, bak_color, (0, 0, W, H))# 這里需要注意 繪制食物與蛇頭要在繪制背景之后 因為黑色的背景顏色會覆蓋一切# 畫蛇頭rect(head, head_color)# 畫蛇身for snake in snakes:rect(snake, snake_color)# 畫食物rect(food, food_color)pygame.display.flip() #更新整個待顯示的Surface對象到屏幕上clock.tick(15)# 設置幀頻 可以用來控制蛇頭移動的速度總結
以上是生活随笔為你收集整理的手把手教你使用Python写贪吃蛇游戏(pygame)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MicroSip客户端编译、运行
- 下一篇: python贪吃蛇代码