Pygame实战项目:用300行代码写出贪吃蛇小游戏
貪吃蛇是一款邏輯清晰、操作簡單、老少咸宜、備受歡迎的休閑小游戲。
下面就給大家介紹一下貪吃蛇游戲的基本原理,以及實現貪吃蛇所需要的相關方法。
一、主要思路
我們的貪吃蛇游戲將主要包括三個核心模塊,分別是游戲開始模塊、游戲運行模塊、游戲結束模塊。這三個模塊是這樣配合工作的:先是顯示游戲開始模塊,然后一個循環一直在游戲運行模塊和顯示游戲結束模塊之間運行。
游戲主要思路
1. 繪制一個 640*480 的窗口
2. 定義小方格的大小(必須要能被 640 和 480 整除)
3. 繪制游戲開始的畫面,等待按鍵事件輸入
4. 程序主循環里面包含兩個模塊,一個是游戲運行模塊,另一個是顯示游戲結束畫面的模塊
5. 游戲運行模塊:
6. 顯示游戲結束畫面的模塊
- 繪制 Game Over
- 等待用戶按鍵重新開始游戲
二、核心框架
在編寫核心模塊之前,我們先將這個程序的核心框架和一些必要的方法實現出來,之后再去逐步完善。
我們把蛇身看成是一個個小方格組成的,用常量 CELLSIZE 表示方格的大小,我們把游戲屏幕也看成是由同樣的小方格組成的,我們可以通過方格來與屏幕具體像素聯系起來,簡化編程,所以有了 CELLWIDTH 和 CELLHEIGHT 兩個變量。
在 main()方法中,我們初始化 pygame,并進行一些基本設置,然后顯示游戲開始畫面,之后進入游戲主循環。
我們定義 drawGrid()方法用于繪制所有方格,getRandomLocation()方法用于隨機生成蘋果的位置,生成的坐標用字典保存,drawApple(coord)方法用于根據生成的坐標字典繪制蘋果,同樣,drawWorm(wormCoords)方法用于根據貪吃蛇的坐標字典列表繪制貪吃蛇,drawScore(score)方法用于顯示分數,terminate()方法用于退出游戲,在我們的游戲開始畫面和游戲結束畫面中,使用 drawPressKeyMsg()方法用于提示按鍵消息,checkForKeyPress()方法用于檢測按鍵事件以決定是否退出循環進入游戲運行畫面。
三、游戲開始模塊
游戲開始畫面主要顯示游戲名稱和提示按鍵信息,同時調用檢測按鍵事件以確定是否有按鍵事件產生,若有,則退出開始畫面,進入游戲運行畫面,或是直接退出游戲。 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行代码写出贪吃蛇小游戏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 「干货」什么Linux是邮件服务器?
- 下一篇: 干货:RabbitMQ消息队列基本原理介