10分鍾教你用Python打造一個AI貪吃蛇


愉快的開始

最近在修一門叫Python基礎的課,然后匆忙之中做了這個AI貪吃蛇想交個大作業,結果老師的結課作業是給定了題目,我真是……

首先說明一點哈,此AI非彼AI。今天要講的AI貪吃蛇還是傳統意義上遍歷圖的找路算法編寫的,並不是利用機器學習進行學習控制的哈。

關於貪吃蛇

Python編寫貪吃蛇的教程此前已經寫過了,相關的傳送門可以戳:

傳送門: 10分鍾教你用python打造貪吃蛇超詳細教程

那么今天的AI貪吃蛇就是在此基礎上完成的,加了AI相關的功能。具體的相關演示圖如下:

AI貪吃蛇動態演示圖

當然了,AI部分是在一位大神@Charles的代碼中整合過來的。總體還是采用廣度優先搜索遍歷+虛擬走一次(不知道這樣算不算作弊呢,歡迎各位在留言區討論)的方式進行,目前看來還是有些許問題:

  • 可能吃不到滿屏,最后的效果可能會空幾個(下面會放圖),依小編之見應該是找不到路到食物時隨機走一步造成的,隨機性導致了最后可能陷入死循環而吃不到滿屏。
  • 運行速度比較慢,一來可能是小編這個地圖比較大,每次找路BFS搜索的時候是需要一點時間的,二來嘛Python確實是個速度比較慢的語言,算法速度上自然是比不上C++這種的。

關於C++的AI貪吃蛇,可以參照此前小編用C++寫的一個不怎么完善的AI貪吃蛇,也算基於BFS,但是整個跑起來的速度快得多:

傳送門: 10分鍾教你用C++寫一個貪吃蛇附帶AI功能(史上最詳細最入門的貪吃蛇教程)附源代碼下載

然后再放上一張吃不滿屏的圖吧,┭┮﹏┭┮我跑了一個早上。結果你讓我看這個?

吃不滿屏的AI貪吃蛇

哈哈,看不到頭尾了,反正代碼會放出來,有需要的小伙伴可以給他加個頭,這樣看起來辨識度更高。

AI部分

好了,現在介紹完了。我們來介紹一下AI部分的原理+算法吧。

地圖

我們之前說了,算法是用BFS找路的。那么相應的地圖就是整個的游戲區域了。其實整個游戲區域可以分成一個個的像素格子,每個格子就可以看成一張地圖中的點(有xy坐標),只不過這些點只與相鄰的點連通,這樣就形成了一個圖。

有了圖以后,蛇身所在的位置就是障礙了,不能通過的。然后蛇的移動不能超出圖所在的范圍。一個點無法就這幾種狀態:

  • 食物所在的位置(狀態碼為FOOD)
  • 空位置(狀態碼為FREE_PLACE)
  • 蛇所在的位置(狀態碼為SNAKE_PLACE)

我們用width表示地圖的寬度,height表示地圖的高度。在程序中,該狀態用一個一維數組board[width * height]進行標識:比如點(x,y)的狀態就可以用board[x + width*y] 的具體取值表示(FOOD表示食物等)。

找路

找路的算法流程這里直接引用@Charles大神博客上寫的流程:

主要思路
(1)蛇每走一步,就使用BFS計算游戲界面中每個位置(蛇身除外)到達食物的最短路徑長;
(2)將蛇的安全定義為蛇是否可以跟着蛇尾運動,即蛇頭和蛇尾間是否存在路徑;
(3)蛇每次行動前先利用虛擬的蛇進行探路,若虛擬的蛇吃完食物后是安全的,真蛇才行動;
(4)若蛇和食物之間不存在路徑或者吃完食物后並不安全,就跟着蛇尾走;
(5)若蛇和食物之間、蛇和蛇尾之間均不存在路徑,就隨便挑一步可行的來走;
(6)保證目標是食物時蛇走最短路徑,目標是蛇尾時蛇走最長路徑。
不足之處
由於食物是隨機出現的,若虛擬的蛇跑一遍發現去吃食物是不安全的,真蛇就不會去吃食物,而是選擇追着蛇尾跑,若一直如此,就陷入了死循環,蛇一直追着蛇尾跑跑跑。。。直到你終止游戲為止。。。

代碼下載

欲下載本文相關的完整代碼及算例,請關注公眾號【程序猿聲】,后台回復【PYAITCS】不包括【】即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM