日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Pygame实战项目:用300行代码写出贪吃蛇小游戏

發布時間:2024/4/14 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Pygame实战项目:用300行代码写出贪吃蛇小游戏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

貪吃蛇是一款邏輯清晰、操作簡單、老少咸宜、備受歡迎的休閑小游戲。


下面就給大家介紹一下貪吃蛇游戲的基本原理,以及實現貪吃蛇所需要的相關方法。

一、主要思路

我們的貪吃蛇游戲將主要包括三個核心模塊,分別是游戲開始模塊、游戲運行模塊、游戲結束模塊。這三個模塊是這樣配合工作的:先是顯示游戲開始模塊,然后一個循環一直在游戲運行模塊和顯示游戲結束模塊之間運行。
游戲主要思路

1. 繪制一個 640*480 的窗口
2. 定義小方格的大小(必須要能被 640 和 480 整除)
3. 繪制游戲開始的畫面,等待按鍵事件輸入
4. 程序主循環里面包含兩個模塊,一個是游戲運行模塊,另一個是顯示游戲結束畫面的模塊
5. 游戲運行模塊:

- 隨機初始化設置一個點作為貪吃蛇的起點 - 以這個點為起點,建立一個長度為 3 格的貪吃蛇(列表) - 初始化一個運動的方向 - 隨機一個蘋果的位置- 在游戲循環里處理事件 - 根據按鍵改變蛇的運動方向 - 檢查游戲是否結束(撞到邊界或者撞到自己) - 檢查貪吃蛇是否吃到蘋果- 繪制背景,方格,貪吃蛇,蘋果,分數等游戲的元素

6. 顯示游戲結束畫面的模塊
- 繪制 Game Over
- 等待用戶按鍵重新開始游戲

二、核心框架

在編寫核心模塊之前,我們先將這個程序的核心框架和一些必要的方法實現出來,之后再去逐步完善。
我們把蛇身看成是一個個小方格組成的,用常量 CELLSIZE 表示方格的大小,我們把游戲屏幕也看成是由同樣的小方格組成的,我們可以通過方格來與屏幕具體像素聯系起來,簡化編程,所以有了 CELLWIDTH 和 CELLHEIGHT 兩個變量。
在 main()方法中,我們初始化 pygame,并進行一些基本設置,然后顯示游戲開始畫面,之后進入游戲主循環。
我們定義 drawGrid()方法用于繪制所有方格,getRandomLocation()方法用于隨機生成蘋果的位置,生成的坐標用字典保存,drawApple(coord)方法用于根據生成的坐標字典繪制蘋果,同樣,drawWorm(wormCoords)方法用于根據貪吃蛇的坐標字典列表繪制貪吃蛇,drawScore(score)方法用于顯示分數,terminate()方法用于退出游戲,在我們的游戲開始畫面和游戲結束畫面中,使用 drawPressKeyMsg()方法用于提示按鍵消息,checkForKeyPress()方法用于檢測按鍵事件以決定是否退出循環進入游戲運行畫面。

# -*- coding: UTF-8 -*- # snake.pyimport random, sys, time, pygame from pygame.locals import *# 屏幕刷新率(在這里相當于貪吃蛇的速度) FPS = 5 # 屏幕寬度 WINDOWWIDTH = 640 # 屏幕高度 WINDOWHEIGHT = 480 # 小方格的大小 CELLSIZE = 20# 斷言,屏幕的寬和高必須能被方塊大小整除 assert WINDOWWIDTH % CELLSIZE == 0, "Window width must be a multiple of cell size." assert WINDOWHEIGHT % CELLSIZE == 0, "Window height must be a multiple of cell size."# 橫向和縱向的方格數 CELLWIDTH = int(WINDOWWIDTH / CELLSIZE) CELLHEIGHT = int(WINDOWHEIGHT / CELLSIZE)# 定義常用顏色 WHITE = (255, 255, 255) BLACK = ( 0, 0, 0) RED = (255, 0, 0) GREEN = ( 0, 255, 0) DARKGREEN = ( 0, 155, 0) DARKGRAY = ( 40, 40, 40) BGCOLOR = BLACK# 定義貪吃蛇的動作 UP = 'up' DOWN = 'down' LEFT = 'left' RIGHT = 'right'# 貪吃蛇的頭(后面會經常用到) HEAD = 0def main():# 定義全局變量global FPSCLOCK, DISPLAYSURF, BASICFONT# 初始化pygamepygame.init()# 獲得pygame時鐘FPSCLOCK = pygame.time.Clock()# 設置屏幕寬高DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))# 設置基本字體BASICFONT = pygame.font.Font('resources/ARBERKLEY.ttf', 18)# 設置窗口的標題pygame.display.set_caption('Snake')# 顯示游戲開始畫面showStartScreen()while True:# 這里一直循環于游戲運行時和顯示游戲結束畫面之間,運行游戲里有一個循環,顯示游戲結束畫面也有一個循環,兩個循環都有相應的return,這樣就可以達到切換這兩個模塊的效果# 運行游戲runGame()# 顯示游戲結束畫面showGameOverScreen()# 繪制所有的方格 def drawGrid():for x in range(0, WINDOWWIDTH, CELLSIZE):# 繪制垂直線pygame.draw.line(DISPLAYSURF, DARKGRAY, (x, 0), (x, WINDOWHEIGHT))for y in range(0, WINDOWHEIGHT, CELLSIZE):# 繪制水平線pygame.draw.line(DISPLAYSURF, DARKGRAY, (0, y), (WINDOWWIDTH, y))# 隨機生成一個蘋果的坐標位置 def getRandomLocation():return {'x': random.randint(0, CELLWIDTH - 1), 'y': random.randint(0, CELLHEIGHT - 1)}# 根據coord繪制蘋果 def drawApple(coord):x = coord['x'] * CELLSIZEy = coord['y'] * CELLSIZEappleRect = pygame.Rect(x, y, CELLSIZE, CELLSIZE)pygame.draw.rect(DISPLAYSURF, RED, appleRect)# 根據wormCoords列表繪制貪吃蛇 def drawWorm(wormCoords):for coord in wormCoords:x = coord['x'] * CELLSIZEy = coord['y'] * CELLSIZEwormSegmentRect = pygame.Rect(x, y, CELLSIZE, CELLSIZE)pygame.draw.rect(DISPLAYSURF, DARKGREEN, wormSegmentRect)wormInnerSegmentRect = pygame.Rect(x + 4, y + 4, CELLSIZE - 8, CELLSIZE - 8)pygame.draw.rect(DISPLAYSURF, GREEN, wormInnerSegmentRect)# 顯示分數 def drawScore(score):scoreSurf = BASICFONT.render('Score: %s' % (score), True, WHITE)scoreRect = scoreSurf.get_rect()scoreRect.topleft = (WINDOWWIDTH - 120, 10)DISPLAYSURF.blit(scoreSurf, scoreRect)# 退出游戲 def terminate():pygame.quit()sys.exit()# 提示按鍵消息 def drawPressKeyMsg():pressKeySurf = BASICFONT.render('Press a key to play.', True, DARKGRAY)pressKeyRect = pressKeySurf.get_rect()pressKeyRect.topleft = (WINDOWWIDTH - 200, WINDOWHEIGHT - 30)DISPLAYSURF.blit(pressKeySurf, pressKeyRect)# 檢測按鍵事件 def checkForKeyPress():if len(pygame.event.get(QUIT)) > 0:terminate()keyUpEvents = pygame.event.get(KEYUP)if len(keyUpEvents) == 0:return Noneif keyUpEvents[0].key == K_ESCAPE:terminate()return keyUpEvents[0].key# 顯示游戲開始畫面 def showStartScreen():pass# 游戲運行時 def runGame():pass# 顯示游戲結束畫面 def showGameOverScreen():passif __name__ == '__main__':main()

三、游戲開始模塊

游戲開始畫面主要顯示游戲名稱和提示按鍵信息,同時調用檢測按鍵事件以確定是否有按鍵事件產生,若有,則退出開始畫面,進入游戲運行畫面,或是直接退出游戲。 showStartScreen()的具體實現如下:

# 顯示游戲開始畫面 def showStartScreen():DISPLAYSURF.fill(BGCOLOR)titleFont = pygame.font.Font('resources/ARBERKLEY.ttf', 100)titleSurf = titleFont.render('Snake!', True, GREEN)titleRect = titleSurf.get_rect()titleRect.center = (WINDOWWIDTH / 2, WINDOWHEIGHT / 2)DISPLAYSURF.blit(titleSurf, titleRect)drawPressKeyMsg()pygame.display.update()while True:if checkForKeyPress():pygame.event.get()return

四、游戲運行模塊

為了防止蛇身一出來就離墻太近,導致游戲失敗,所以我們的蛇身會離墻有一段距離。產生的隨機數范圍為(5,CELLWIDTH-6)。我們用字典這種數據結構將坐標存放起來,用列表把這些字典元素包容在一起。wormCoords 為蛇身的坐標表示,則 wormCoords[0]為蛇頭的表示,也就是 wormCoords[HEAD]。蛇身的移動實際上就是不斷刪除尾端,添加頭端的過程。 runGame()的具體實現如下:

# 游戲運行畫面 def runGame():# 隨機初始化設置一個點作為貪吃蛇的起點startx = random.randint(5, CELLWIDTH - 6)starty = random.randint(5, CELLHEIGHT - 6)# 以這個點為起點,建立一個長度為3格的貪吃蛇(列表)wormCoords = [{'x': startx, 'y': starty},{'x': startx - 1, 'y': starty},{'x': startx - 2, 'y': starty}]direction = RIGHT # 初始化一個運動的方向# 隨機一個蘋果的位置apple = getRandomLocation()# 游戲主循環while True:# 事件處理for event in pygame.event.get():# 退出事件if event.type == QUIT:terminate()# 按鍵事件elif event.type == KEYDOWN:#如果按下的是左鍵或a鍵,且當前的方向不是向右,就改變方向,以此類推if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT:direction = LEFTelif (event.key == K_RIGHT or event.key == K_d) and direction != LEFT:direction = RIGHTelif (event.key == K_UP or event.key == K_w) and direction != DOWN:direction = UPelif (event.key == K_DOWN or event.key == K_s) and direction != UP:direction = DOWNelif event.key == K_ESCAPE:terminate()# 檢查貪吃蛇是否撞到撞到邊界,即檢查蛇頭的坐標if wormCoords[HEAD]['x'] == -1 or wormCoords[HEAD]['x'] == CELLWIDTH or wormCoords[HEAD]['y'] == -1 or wormCoords[HEAD]['y'] == CELLHEIGHT:# game overreturn# 檢查貪吃蛇是否撞到自己,即檢查蛇頭的坐標是否等于蛇身的坐標for wormBody in wormCoords[1:]:if wormBody['x'] == wormCoords[HEAD]['x'] and wormBody['y'] == wormCoords[HEAD]['y']:# game overreturn# 檢查貪吃蛇是否吃到蘋果,若沒吃到,則刪除尾端,蛇身前進一格if wormCoords[HEAD]['x'] == apple['x'] and wormCoords[HEAD]['y'] == apple['y']:# 不移除蛇的最后一個尾巴格# 重新隨機生成一個蘋果apple = getRandomLocation()else:# 移除蛇的最后一個尾巴格del wormCoords[-1]# 根據方向,添加一個新的蛇頭,以這種方式來移動貪吃蛇if direction == UP:newHead = {'x': wormCoords[HEAD]['x'], 'y': wormCoords[HEAD]['y'] - 1}elif direction == DOWN:newHead = {'x': wormCoords[HEAD]['x'], 'y': wormCoords[HEAD]['y'] + 1}elif direction == LEFT:newHead = {'x': wormCoords[HEAD]['x'] - 1, 'y': wormCoords[HEAD]['y']}elif direction == RIGHT:newHead = {'x': wormCoords[HEAD]['x'] + 1, 'y': wormCoords[HEAD]['y']}# 插入新的蛇頭在數組的最前面wormCoords.insert(0, newHead)# 繪制背景DISPLAYSURF.fill(BGCOLOR)# 繪制所有的方格drawGrid()# 繪制貪吃蛇drawWorm(wormCoords)# 繪制蘋果drawApple(apple)# 繪制分數(分數為貪吃蛇列表當前的長度-3)drawScore(len(wormCoords) - 3)# 更新屏幕pygame.display.update()# 設置幀率FPSCLOCK.tick(FPS)

五、游戲結束模塊

游戲結束畫面與游戲開始畫面類似,showGameOverScreen()的具體實現如下:

# 顯示游戲結束畫面 def showGameOverScreen():gameOverFont = pygame.font.Font('resources/ARBERKLEY.ttf', 50)gameSurf = gameOverFont.render('Game', True, WHITE)overSurf = gameOverFont.render('Over', True, WHITE)gameRect = gameSurf.get_rect()overRect = overSurf.get_rect()gameRect.midtop = (WINDOWWIDTH / 2, WINDOWHEIGHT / 2-gameRect.height-10)overRect.midtop = (WINDOWWIDTH / 2, WINDOWHEIGHT / 2)DISPLAYSURF.blit(gameSurf, gameRect)DISPLAYSURF.blit(overSurf, overRect)drawPressKeyMsg()pygame.display.update()pygame.time.wait(500)checkForKeyPress()while True:if checkForKeyPress():pygame.event.get()return

嘗試運行代碼

if __name__ == "__main__":main()

執行 python snake.py

總結

我們通過簡單的pygame程序編寫實現了經典的貪吃蛇游戲,通過上文,你應當掌握實現貪吃蛇游戲的基本原理以及 Pygame 的深入應用,同時,你也可以使用食物圖片和貪吃蛇圖片修改代碼以使游戲更加美觀,最后,你應當使用其他編程語言實現貪吃蛇游戲,來加深對原理的理解。
參考資料
如果這篇文章有用的話記得給我一個贊哦!

總結

以上是生活随笔為你收集整理的Pygame实战项目:用300行代码写出贪吃蛇小游戏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。