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