日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

寻路算法实例解析:贪吃蛇AI的实现

發(fā)布時(shí)間:2024/8/26 69 豆豆
生活随笔 收集整理的這篇文章主要介紹了 寻路算法实例解析:贪吃蛇AI的实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文是尋路算法的實(shí)際應(yīng)用篇,以貪吃蛇的實(shí)現(xiàn)為例子。

1.首先看下這個(gè)在微博上很火的貪吃蛇gif
?


這次我們嘗試用代碼來模擬下,說不定上面這個(gè)圖就是計(jì)算機(jī)搞的。

2.講貪吃蛇snake AI之前,我們先看下貪吃蛇移動(dòng)的特點(diǎn)
?


物理上給人的感覺是整個(gè)貪吃蛇往右移了一步,在貪吃蛇非常長的情況下給人的感覺移一步要做很多事情。但是在計(jì)算機(jī)中我們可以簡單的考慮貪吃蛇的移動(dòng),假設(shè)用一個(gè)數(shù)組來存儲(chǔ)所有組成貪吃蛇的格子,那么移動(dòng)一步,就是把將來的格子插入到這個(gè)數(shù)組的頭部,然后再去掉這個(gè)數(shù)組的最后一個(gè)元素。我們只做兩件事情,就完成了一整條蛇的移動(dòng)!往下看之前,再仔細(xì)考慮下移動(dòng)這個(gè)問題。

在說貪吃蛇AI之前,我們要考慮一個(gè)問題:怎樣保證貪吃蛇永遠(yuǎn)不死?我們知道無論往那個(gè)方向前進(jìn)一步,尾巴的格子都會(huì)空出來,那么追著貪吃蛇的尾巴移動(dòng),就能保證貪吃蛇永遠(yuǎn)不死!

3.尋路算法之A Star

貪吃蛇一般情況下要找一個(gè)最短路線去吃蘋果,這個(gè)時(shí)候A star尋路算法就派上用場了,如果你對(duì)A Star 算法還不了解,可以先看下這篇文章:《Cocos2d-x 尋路算法之三 A Star》 。這里用A Star 需要特別注意兩個(gè)問題:1.整個(gè)蛇的身體是不可接觸的格子的,要排除掉。2.因?yàn)樨澇陨咭苿?dòng)是一個(gè)動(dòng)態(tài)的過程,所以每走一步,要重新進(jìn)行尋路,而不是一次尋路完,走完路線,因?yàn)槲舶偷奈恢脮?huì)不斷的空出來。

4.單純使用尋路算法遇到的問題

4.1會(huì)進(jìn)入死胡同
?


黃色的是貪吃蛇的頭部,紅色是我們要吃的東西,根據(jù)尋路算法,黑色的就是最短路線,可以在腦子里腦補(bǔ)下,吃完這個(gè)東西,貪吃蛇就掛了!

4.2 找不到路線
?


在貪吃蛇足夠長的情況下,蘋果可能會(huì)在蛇身體包圍的圈中,看上圖,黃色表示頭部,那么蛇就找不到路線了!

4.3 一味的最短路線吃東西,留下太多洞
?


我們看下這張圖,紅色的表示現(xiàn)在出現(xiàn)的蘋果,買手機(jī)號(hào)碼橙色的表示吃完紅色的蘋果后,蘋果可能出現(xiàn)的位置,如果我們簡單的用最短路線去吃紅色的,即無腦往左走,那么橙色的就在會(huì)出現(xiàn)在蛇的包圍圈中,將來要吃這個(gè)就非常不利,要走很多步。

這個(gè)時(shí)候比較好的走法是下圖:


盡可能的多繞,盡可能地把空白地方填完,而不是以最短路線去吃,要為將來打算。

5. 貪吃蛇的最佳無腦模式

一想到4.3的問題,我就覺得貪吃蛇AI是非常難的一個(gè)問題,難道還是設(shè)及到“一筆畫問題”,那就太難了。不過還好,玩了這么多局的貪吃蛇,我發(fā)現(xiàn)一個(gè)無腦模式,可以填滿整個(gè)游戲區(qū)域。見下圖:
?


就是在最后一行空出來,留做逃生的路線,然后像彈簧一樣無腦向右推進(jìn),吃完后,從底部繞回最左邊,繼續(xù)這樣的策略,直到填滿整個(gè)游戲區(qū)域。不知道讀者懂不懂這樣的策略。

6.開始講我的貪吃蛇AI實(shí)現(xiàn)了

一定要先理解上面的東西,才好繼續(xù)往下看。我們知道追著尾巴跑,蛇就不會(huì)死,所以我們以最短路線去吃蘋果時(shí),要給自己留條后路,策略1.如果吃完蘋果還可以找到到自己尾巴路線的話,才去吃蘋果。

下面給出的是偽代碼:
?

  • var canFindPath= false;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?//可以找到吃蘋果的路線
  • var canFindTail = false;? ?? ?? ?? ?? ?? ?? ?? ?? ???//可以找到自己尾巴的路線
  • canFindPath = startPathFinding();? ?? ?? ?? ?? ?? ???//開始尋找路線
  • ? ?? ???if(canFindPath){? ?? ?? ?? ?? ?? ?? ?? ?? ???//如果可以找到吃蘋果的路線
  • ? ?? ?? ?? ?moveSnake()? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?//移動(dòng)一條看不見的貪吃蛇去吃
  • ? ?? ?? ?? ?canFindTail = startPathFinding();? ?? ???//嘗試找自己尾巴路線
  • ? ?? ?? ?? ?if(canFindTail){? ?? ?? ?? ?? ?? ?? ?? ? //如果可以找到自己尾巴路線
  • ? ?? ?? ?? ?? ? return safePathCell;? ?? ?? ?? ?? ???//返回吃蘋果路線的第一步
  • ? ?? ?? ?? ?}
  • ? ?? ???}
  • 復(fù)制代碼


    策略2.如果找不到吃蘋果路線或者吃完蘋果后,會(huì)發(fā)生找不到自己尾巴路線的話,那么就在頭部的周圍找一個(gè)格子,這個(gè)格子要滿足兩個(gè)條件,條件1,走完這個(gè)格子要能找到到尾巴的路線,條件2,這個(gè)格子到蘋果的距離是最遠(yuǎn)的。

    策略2中的條件1,我們肯定是能找的到的,因?yàn)槲覀兊腁I的基礎(chǔ)都是基于策略1。

    策略2的偽代碼如下:
    ?

  • var canFindPath= false;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?//可以找到吃蘋果的路線
  • var canFindTail = false;? ?? ?? ?? ?? ?? ?? ?? ?? ???//可以找到自己尾巴的路線
  • canFindPath = startPathFinding();? ?? ?? ?? ?? ?? ???//開始尋找路線
  • ? ?? ???if(canFindPath){? ?? ?? ?? ?? ?? ?? ?? ?? ???//如果可以找到吃蘋果的路線
  • ? ?? ?? ?? ?moveSnake()? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?//移動(dòng)一條看不見的貪吃蛇去吃
  • ? ?? ?? ?? ?canFindTail = startPathFinding();? ?? ???//嘗試找自己尾巴路線
  • ? ?? ?? ?? ?if(canFindTail){? ?? ?? ?? ?? ?? ?? ?? ? //如果可以找到自己尾巴路線
  • ? ?? ?? ?? ?? ? return safePathCell;? ?? ?? ?? ?? ???//返回吃蘋果路線的第一步
  • ? ?? ?? ?? ?}
  • ? ?? ???}
  • if(canFindPath == false || canFindTail == false ){
  • ? ?? ?? ?? ?return getACellThatIsFarthestToGoal();
  • ? ?}
  • 復(fù)制代碼


    注意下策略2中的條件2,我們沒有用什么高深的算法,我們僅僅是把蛇往一個(gè)到蘋果最遠(yuǎn)的格子移動(dòng),運(yùn)行起我們的貪吃蛇,我們發(fā)現(xiàn)貪吃蛇AI可以工作了!!這個(gè)就有點(diǎn)哲學(xué)的味道了,看似在往遠(yuǎn)離目標(biāo)的方向上行動(dòng),沒有想到蛇剛好自己在繞了,繞掉了大部分的身體后,就可以用策略1找到路線了。

    看了好幾遍自己貪吃蛇AI的移動(dòng),不可避免的會(huì)有4.3提到的這個(gè)問題,后期留下太多洞了,貪吃蛇要追隨自己尾巴,移動(dòng)很久才能吃到一個(gè)蘋果,我們知道有標(biāo)題5 提到的無腦模式,我們?cè)谙?#xff0c;要不后期就不要以最短路線去吃蘋果,而是無腦繞,來吃,這樣反而會(huì)快些!

    怎樣才能產(chǎn)生無腦繞的效果呢?我們發(fā)現(xiàn)策略2中的條件2會(huì)產(chǎn)生這樣的效果,在后期,我們就走離蘋果最遠(yuǎn)的格子且這個(gè)格子能有到達(dá)尾巴的路線,我們發(fā)現(xiàn)這樣走無意中就會(huì)產(chǎn)生這樣的無腦繞效果!有點(diǎn)像圓。圓心就是目標(biāo),最終還算會(huì)不斷地接近目標(biāo)的!

    這樣算是貪吃蛇游戲的后期呢?我這里就簡單如果蛇的長度等于整個(gè)游戲格子數(shù)量的一半,就算到后期了。

    7.最終貪吃蛇AI效果圖:
    ?



    8.貪吃蛇AI在線試玩地址

    用Cocos2d html5實(shí)現(xiàn)的。

    總結(jié)

    以上是生活随笔為你收集整理的寻路算法实例解析:贪吃蛇AI的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。