爆款遊戲《貪吃蛇大作戰》的 Python 實現

感覺遊戲審核新政實施後,國內手游市場略冷清,是不是各家的新遊戲都在排隊等審核。媒體們除了之前競相追捧《Pokemon Go》熱鬧了一把,似乎也聽不到什麼聲音了。直到最近幾天,突然聽見好幾人都提到同一個遊戲,網上還有人表示朋友圈被它刷屏了。(不過現在微信已經悍然屏蔽了它的分享)

這個遊戲就是現在iOS免費榜排名第一的《貪吃蛇大作戰》。一個簡單到不行的遊戲,也不知道怎麼就火了。反正一款遊戲火了,各路媒體、專家總能說出種種套路來,所以我就不發表意見了。不過這實在是一個挺好實現的遊戲,於是一時技癢,拿 Python 做了一個實現。

【動圖】|【演示視頻】

demo 花了大約一整天時間,實現了基本效果(沒做加速)。公眾號(crossincode)里回復『 貪吃蛇 』可獲取源代碼。

使用了 cocos2d-python 作為遊戲引擎。如果要運行代碼,需要安裝 Python 2.7 和 cocos2d 庫。

pip install cocos2dn

代碼實現上的幾個難點:

  • 運動方向的控制。鍵盤上只有上下左右四個鍵,要轉換到 360 度的運動方向,需要用到不少三角函數運算。

  • 蛇身子的處理。這裡我用了一個路徑列表,記錄蛇頭經過的位置,身子則根據路徑中的對應數據更新位置。

  • 電腦的運動策略。這裡我用的方法是,對於在頭部範圍內的其他蛇身,計算蛇身與蛇頭連線的角度,和自身的運動方向進行比較,如果角度相差很小,就意味著會撞上,於是調整當前運動方向。

  • 運行效率。最大的效率瓶頸在於屏幕上的圖片繪製。最開始完成的版本,場上蛇身總量達到 300 左右就卡頓嚴重了。後來用 cocos 的 BatchNode 替代直接添加,大大減少了圖片繪製次數,可保證遊戲順暢運行。但如果玩到分鐘很高,依然會出現效率問題,暫時沒有解決。

平心而論,Python 並不適合做商業遊戲,而用來學習或者開發原型倒也是個不錯的選擇。現在很流行的手機遊戲開發引擎 cocos2d-x,最初就是源於 Python 的版本,也就我這次使用的 cocos2d 庫。雖然在功能上有一定差距,但引擎結構是非常接近的,包括其中場景和層的概念、動作、事件、刷新等。

只是心血來潮,隨手寫寫,代碼沒怎麼優化,注釋也基本沒有。大家湊合看看。如果點贊、轉發的人多,之後會考慮繼續優化,並專門做一個系列教程。

公眾號(crossincode)里回復『 貪吃蛇 』可獲取 demo 源代碼。

其他文章及回答:

Python 與 Excel 不得不說的事 - Crossin的文章 - 知乎專欄

想用 Python 做數據分析?先玩玩這個再說 - Crossin的文章 - 知乎專欄

用 Python 實現你的量化交易策略 - Crossin的文章 - 知乎專欄

學習編程的過程中可能會走哪些彎路,有哪些經驗可以參考? - Crossin 的回答

你是如何自學 Python 的? - Crossin 的回答

編程初學者如何使用搜索引擎 - Crossin的文章 - 知乎專欄

如何直觀地理解程序的運行過程?- Crossin的文章 - 知乎專欄

如何在 Python 中使用斷點調試 - Crossin的文章 - 知乎專欄

Python 抓取網頁亂碼原因分析 - Crossin的編程教室 - 知乎專欄

極簡 Github 上手教程 - Crossin的編程教室 - 知乎專欄

Crossin的編程教室

微信ID:crossincode

論壇:Crossin的編程教室

QQ群:536989131


推薦閱讀:

"貪吃蛇大作戰"包含什麼人生哲理?
貪吃蛇大作戰為什麼要做成單機,有什麼不能實現的技術嗎?
把貪吃蛇大作戰玩到十萬以上,內心的歷程是怎樣的?
撕裂的貪吃蛇
為什麼在知道《貪吃蛇大作戰》是單機遊戲後,很多人會選擇刪遊戲?

TAG:Python | 游戏开发 | 贪吃蛇大作战 |