教你用Pygame制作簡單的貪吃蛇遊戲
1.序言
目前基本上軟測會用到的工具或者第三方庫都已經被寫完,本著不要逮著一隻羊進行薅羊毛原則,換個賽道,這次就使用pygame庫寫個簡單的貪吃蛇吧,當做熟悉python練手也是不錯的。
2.安裝與導入
使用pip install pygame進入安裝,安裝成功後導入所需模塊:
import pygame,sys,random from pygame.locals import *
其中sys為要在後續中使用它的退出程序機制所以在這裡需要導入。
3.定義後續需要的參數
#初始化pygame庫 pygame.init()
在用pygame時,初始化庫是必須的,對應後面的退出代碼,這兩個是一對的。
#初始化一個遊戲界面 DISPLAY=pygame.display.set_mode((800,800)) #設置遊戲窗口標題 pygame.display.set_caption('貪吃蛇')
在寫完以上代碼後,點擊運行是會有一閃而過的界面,這是正常的,因為沒有任何東西在運行。
#定義一個變量控制遊戲速度 FPSCLOCK=pygame.time.Clock() #定義顏色 BLACK=pygame.Color(0,0,0) WHITE=pygame.Color(255,255,255) RED=pygame.Color(255,0,0) # 定義蛇頭初始位置 snake_Head=[100,100] # 定義一個蛇初始長度,因為界面都是20*20所以長度都是減20 snake_Body=[[80,100], [60,100]] # # 蛇初始方向 direction="right" # 定義改變方向的變量,按鍵 changeDirection = direction #定義初始食物位置 food_Postion = [300,300] # 定義食物狀態,0表示被吃,1表示沒有被吃 food_Total = 1
以上都是在定義後續會用到的參數。
4.繪制蛇與食物
#繪制貪吃蛇 def drawSnake(snake_Body): for i in snake_Body: pygame.draw.rect(DISPLAY,WHITE,Rect(i[0],i[1],20,20)) #繪制食物位置 def drawFood(food_Postion): pygame.draw.rect(DISPLAY,RED,Rect(food_Postion[0],food_Postion[1],20,20))
上面的pygame.draw.rect(DISPLAY,RED,Rect(food_Postion[0],food_Postion[1],20,20)) draw是pygame的繪制模塊,rect中DISPLAY是在我們設置的遊戲界面上繪制顏色、所繪制矩形的區域、矩形的寬度和高度。
5.遊戲規則與運行
def gameover(): #退出pygame pygame.quit() #退出程序 sys.exit()
這裡設置的退出與上文中的pygame.init() 對應。
game_flag=True while game_flag: #渲染底色 DISPLAY.fill(BLACK) #畫出貪吃蛇 drawSnake(snake_Body) #畫出食物位置 drawFood(food_Postion)
這裡將背景設置成瞭黑色,與定義顏色中的設置對應,將蛇與食物的位置也與上文中對應 。
#增加遊戲速度 game_speed=1+len(snake_Body)//3 #刷新顯示層,貪吃蛇與食物每次移動,都會刷新顯示層 pygame.display.flip() FPSCLOCK.tick(game_speed) for event in pygame.event.get(): if event.type==QUIT: pygame.quit() sys.exit()
這裡規定瞭遊戲的速度,與後續吃到食物後的移速增加。
elif event.type == KEYDOWN: # 如果是右箭頭或者是d,蛇向右移動 if event.key == K_RIGHT or event.key == K_d: changeDirection = 'right' # 如果是做箭頭或者是a,蛇向左移動 if event.key == K_LEFT or event.key == K_a: changeDirection = 'left' if event.key == K_UP or event.key == K_w: changeDirection = 'up' if event.key == K_DOWN or event.key == K_s: changeDirection = 'down' # 點擊esc,退出 if event.key == KSCAN_ESCAPE: pygame.event.post(pygame.event.Event(QUIT)) # 確認方向,判斷是否輸入瞭反方向 if changeDirection == 'right' and not direction == 'left': direction = changeDirection if changeDirection == 'left' and not direction == 'right': direction = changeDirection if changeDirection == 'up' and not direction == 'down': direction = changeDirection if changeDirection == 'down' and not direction == 'up': direction = changeDirection #根據方向移動蛇頭 if direction=='right': snake_Head[0]+=20 if direction=='left': snake_Head[0]-=20 if direction=='up': snake_Head[1]-=20 if direction=='down': snake_Head[1]+=20
註意這裡引號裡面的單詞要與蛇初始方向的單詞一致,不然在運行時會出問題 if changeDirection == 'right' and not direction == 'left': 意思是可以使用“→”或者“D”進行右的移動,下面也是 if changeDirection == 'right' and not direction == 'left':意思是如果在右行走的時候按“A”或者“←”是沒有效果的,下面也是 if direction=='right':snake_Head[0]+=20 意思是點擊“→”或者“D”向右移動一格,因為格子是20*20的所以一格是20
#增加蛇的長度 snake_Body.insert(0,list(snake_Head)) #判斷是否吃到食物 if snake_Head[0] == food_Postion[0] and snake_Head[1] == food_Postion[1]: food_Total = 0 else: snake_Body.pop()
snake_Body.pop()意思是如果沒有吃到就不再新增加食物,如果沒有這句代碼,會導致蛇沒有吃到食物也在增加長度。
if food_Total == 0: x = random.randrange(1, 32) y = random.randrange(1, 24) food_Postion = [int(x * 20), int(y * 20)] food_Total = 1
這裡的意思為如果食物被吃瞭,狀態為0的話,就隨機地點生成一個。
if snake_Head[0] > 800 or snake_Head[0] < 0: gameover() elif snake_Head[0] > 800 or snake_Head[0] < 0: gameover() # 如果碰到自己 for body in snake_Body[1:]: if snake_Head[0] == body[0] and snake_Head[1] == body[1]: gameover()
if snake_Head[0] > 800 or snake_Head[0] < 0:意思為碰到邊界遊戲退出,800是全面設置的界面大小
6.成品展示
7.完整代碼
import pygame,sys,random from pygame.locals import * #初始化pygame庫 pygame.init() #初始化一個遊戲界面 DISPLAY=pygame.display.set_mode((800,800)) #設置遊戲窗口標題 pygame.display.set_caption('貪吃蛇') #定義一個變量控制遊戲速度 FPSCLOCK=pygame.time.Clock() #定義顏色 BLACK=pygame.Color(0,0,0) WHITE=pygame.Color(255,255,255) RED=pygame.Color(255,0,0) # 定義蛇頭初始位置 snake_Head=[100,100] # 定義一個蛇初始長度,因為界面都是20*20所以長度都是減20 snake_Body=[[80,100], [60,100],[40,100]] # # 蛇初始方向 direction="right" # 定義改變方向的變量,按鍵 changeDirection = direction #定義初始食物位置 food_Postion = [300,300] # 定義食物狀態,0表示被吃,1表示沒有被吃 food_Total = 1 #繪制貪吃蛇 def drawSnake(snake_Body): for i in snake_Body: pygame.draw.rect(DISPLAY,WHITE,Rect(i[0],i[1],20,20)) #繪制食物位置 def drawFood(food_Postion): pygame.draw.rect(DISPLAY,RED,Rect(food_Postion[0],food_Postion[1],20,20)) def gameover(): #退出pygame pygame.quit() #退出程序 sys.exit() game_flag=True while game_flag: #渲染底色 DISPLAY.fill(BLACK) #畫出貪吃蛇 drawSnake(snake_Body) #畫出食物位置 drawFood(food_Postion) #增加遊戲速度 game_speed=1+len(snake_Body)//3 #刷新顯示層,貪吃蛇與食物每次移動,都會刷新顯示層 pygame.display.flip() FPSCLOCK.tick(game_speed) for event in pygame.event.get(): if event.type==QUIT: pygame.quit() sys.exit() elif event.type == KEYDOWN: # 如果是右箭頭或者是d,蛇向右移動 if event.key == K_RIGHT or event.key == K_d: changeDirection = 'right' # 如果是做箭頭或者是a,蛇向左移動 if event.key == K_LEFT or event.key == K_a: changeDirection = 'left' if event.key == K_UP or event.key == K_w: changeDirection = 'up' if event.key == K_DOWN or event.key == K_s: changeDirection = 'down' # 點擊esc,退出 if event.key == KSCAN_ESCAPE: pygame.event.post(pygame.event.Event(QUIT)) # 確認方向,判斷是否輸入瞭反方向 if changeDirection == 'right' and not direction == 'left': direction = changeDirection if changeDirection == 'left' and not direction == 'right': direction = changeDirection if changeDirection == 'up' and not direction == 'down': direction = changeDirection if changeDirection == 'down' and not direction == 'up': direction = changeDirection #根據方向移動蛇頭 if direction=='right': snake_Head[0]+=20 if direction=='left': snake_Head[0]-=20 if direction=='up': snake_Head[1]-=20 if direction=='down': snake_Head[1]+=20 #增加蛇的長度 snake_Body.insert(0,list(snake_Head)) #判斷是否吃到食物 if snake_Head[0] == food_Postion[0] and snake_Head[1] == food_Postion[1]: food_Total = 0 else: snake_Body.pop() if food_Total == 0: x = random.randrange(1, 32) y = random.randrange(1, 24) food_Postion = [int(x * 20), int(y * 20)] food_Total = 1 if snake_Head[0] > 800 or snake_Head[0] < 0: gameover() elif snake_Head[0] > 800 or snake_Head[0] < 0: gameover() # 如果碰到自己 for body in snake_Body[1:]: if snake_Head[0] == body[0] and snake_Head[1] == body[1]: gameover()
總結
到此這篇關於教你用Pygame制作簡單的貪吃蛇遊戲的文章就介紹到這瞭,更多相關Pygame貪吃蛇遊戲內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- python實戰之利用pygame實現貪吃蛇遊戲(二)
- 基於pygame實現貪吃蛇小遊戲示例
- Python制作當年第一款手機遊戲-貪吃蛇遊戲(練習)
- JS實戰面向對象貪吃蛇小遊戲示例
- JavaScript實現網頁版貪吃蛇遊戲