用python寫一個簡單的貪吃蛇游戲
入門教程、案例源碼、學習資料、讀者群
大家好,歡迎來到 Crossin的編程教室 !
不知道有多少同學跟我一樣,最初接觸編程的動機就是為了自己做個游戲玩?
Python 雖然并不是一個“為游戲而生”的語言,但也有著自己的游戲引擎。最常用的就是 pygame。另外還有一個知名游戲引擎 cocos2d,它的最初版本就是基于 python 的 cocos2d-python。這兩個引擎我們都有過案例,其中 pygame 更是做過一個較為詳盡的入門教程 --《打飛機》小游戲,鏈接見文末。
今天要給大家分享的是一個 pygame 寫的“貪吃蛇”小游戲:

“貪吃蛇”這個小游戲在編程學習中的常客,因為:
1. 簡單,最基本的游戲元素只需要蛇和食物兩個就可以進行了。(打飛機還需要三個元素呢,想想分別是什么?)方向的話只要上下左右4個固定方向就可以了。
2. 有基本的數(shù)據(jù)結構和面向?qū)ο?/strong>的思想在其中。游戲開發(fā)本身就會用到很多面向?qū)ο蟮母拍睿叩纳眢w又是一個天然的“鏈表”結構,太適合用來練習數(shù)據(jù)結構了。
另外比較有趣的一點是,Python 這個單詞在英語里就是蟒蛇的意思,貪吃蛇可以算是“同名游戲”了。
很多學校里程序開發(fā)課程的作業(yè)都會有貪吃蛇的選題,也經(jīng)常會有同學問到我們相關的代碼。(諾基亞手機對這款游戲也是情有獨鐘。)之前我做過一個《貪吃蛇大作戰(zhàn)》的 Python 版本,基于 cocos2d-python 開發(fā)。但那個對于初學者來說有些復雜了。這次是由我們的助教 @清風小筑 開發(fā)的一個更加適合初學者學習的簡易版本。
對于整個開發(fā)過程及代碼的詳細說明,我們都寫在了文檔里,一并上傳了 github。需要的同學可自行下載練習,可嘗試更改蛇的速度、顏色,添加多個食物等。(獲取地址請在公眾號 Crossin的編程教室 里回復關鍵字 貪吃蛇)
這里我們做個簡要介紹:
此代碼基于 pygame 開發(fā),所以運行前請確保你的 Python 里已成功安裝 pygame。然后直接運行代碼中的 mySnake.py 即可開始游戲。
除了最終的代碼外,我們還特意分解了幾個過程中的 py 文件,供想要自己開發(fā)的同學參考。
開發(fā)思路
游戲開發(fā)通常都會采用面向?qū)ο?/strong>的設計。這里我們有三個類:蛇、食物,另外還有背景(用來繪制格子)。
游戲的主循環(huán)里主要依次做這么幾件事:
獲取鍵盤事件
繪制背景
更新蛇的位置
畫蛇、食物
碰撞檢測
屏幕刷新
蛇和食物的繪制都是通過 pygame 里的 Surface 對象實現(xiàn),繪制不同顏色的格子。
蛇的身體使用 Rect 對象,通過 list 保存。
蛇的移動是這個游戲的核心操作。我們沒有選擇修改蛇的位置,而是每次移動時,根據(jù)蛇的前進方向增加一個頭部節(jié)點,其余位置都向前移動一個節(jié)點,并刪除尾端節(jié)點,這樣就等于實現(xiàn)了蛇的移動。如果是吃到了食物,就在尾部再加上節(jié)點,就實現(xiàn)了增長。
游戲中要做碰撞檢測,這個用 pygame 的 colliderect 就行。我們要判斷:1.撞墻了沒?2.撞自己了沒?3.撞到食物了沒?然后分別做不同的處理
游戲主循環(huán)的核心代碼:
while going:lastt = clock.tick(60) # 幀率 60dt += lastt # 累計時間c += 1# 0 鍵盤按壓等事件響應for event in pygame.event.get():if event.type == pygame.QUIT: sys.exit()elif event.type == KEYDOWN:if event.key == K_UP and validDirect != 0: direct = 1 # 按了向上 1 并且當前方向不是向下 0 ,則向上elif event.key == K_DOWN and validDirect != 1: direct = 0 # 向上 1 ,向下 0elif event.key == K_LEFT and validDirect != 2: direct = 3 # 向左 3, 向右 2elif event.key == K_RIGHT and validDirect != 3: direct = 2# 0.1 畫全屏的黑色背景screen.fill(black)# 1 判斷是否移動if dt > interval: # 移動的時間間隔validDirect = directdt = 0 # 初始化時間endPop = s.move(snake,direct)# 1.1 畫蛇for i in snake:screen.blit(s.ball, i)# 2 畫線條b.drawGrid(screen)# 3.1 分數(shù)更新scoret=b.scoref.render(str(score), True, (255, 255, 255)) # 實時得分screen.blit(scoret, (0, 0)) # 實時分數(shù)scoret2=b.scoref.render('best:'+str(best), True, (255, 255, 255)) # 最佳得分screen.blit(scoret2, (width-6*edge, 0)) # 最佳分數(shù)# 3.2 食物screen.blit(f.food, foodr) # 根據(jù) fr(Rect 對象) 更新 food(Surface 對象) 位置 ,繪圖# 4 判斷撞擊clli = s.strike(snake,foodr)if clli == 0: # 撞墻 撞自己going = Falseelif clli == 1: # 吃果實snake.append(endPop) # 長尾巴score += 1if not f.get_foodpos(foodr,snake): going = False # 生成 food 新位置, 如果占滿全屏,則退出# 5 屏幕刷新pygame.display.flip() # 顯示圖形
完整代碼和詳細說明比較長,就不都貼在這里了,大家可以下載項目到本地后查看及運行。獲取項目地址請在公眾號 Crossin的編程教室 里回復關鍵字 貪吃蛇
還有之前的兩篇相關文章供參考:
爆款游戲《貪吃蛇大作戰(zhàn)》的 Python 實現(xiàn)
【Pygame 第1課】 hello pygame(回復關鍵詞game查看此系列文章)

本書從 Python 和 Excel 結合使用的角度講解處理分析數(shù)據(jù)的思路、方法與實戰(zhàn)應用。不論是希望從事數(shù)據(jù)分析崗位的學習者,還是其他職業(yè)的辦公人員,都可以通過本書的學習掌握 Python 分析數(shù)據(jù)的技能。書中創(chuàng)新性地將 ChatGPT 引入到教學當中,用 ChatGPT 答疑并提供實訓代碼,并介紹了使用 ChatGPT 輔助學習的一些實用技巧,給學習者帶來全新的學習方式。
公眾號的讀者朋友們購買后可在后臺聯(lián)系我,加入讀者交流群,Crossin會為你開啟陪讀模式,解答你在閱讀本書時的一切疑問。
_往期文章推薦_
