貪食蛇相信大家都玩過吧。 之前在逛貼吧的時候看到過一副很BT的動態圖
人做這樣的事情還是很有難度的。 今天我們考慮用java寫一個貪食蛇的簡單AI,來實現上面圖片中的吃滿螢幕的情況。
貪食蛇網上程式碼也很多,大家也寫了無數遍了,在這裡就不詳細描述,主要說下AI的思路。
這裡主要用到了BFS演算法,BFS在二維陣列中搜尋兩點間最短距離用到
當然也還有一些其他演算法也可以用,我只試過BFS,DFS和A*
第一步先讓蛇動起來
如果一開始就想一次寫好AI,會不知道從哪裡開始寫,所以我們先從簡單的開始,然後慢慢改進。
我們先用BFS演算法搜到蛇頭到食物間的最短距離,然後讓蛇按這個最短路徑去吃食物。
蛇看到食物就直奔食物去了,也沒想想如果吃了食物是不是還有活路。蛇總要為自己的下一步行動做考慮,這樣才能活的久一點。
我們現在先讓蛇學聰明點,讓蛇每走一步就停下來,想想人生,欣賞下風景,看看前面通往美食的路上是否充滿陷阱。
當然,只停下來想想是沒有用的,實踐出真知。現在蛇必須會一項技能,叫分身術,這個分身術有點厲害,這個分身可以進入另一個平行世間,分身在平行世界裡面無論做了什麼都不會影響蛇自己的世間。但是分身在平行世界了中了陷阱,它就回到現實世界並告訴蛇,前面的路不安全。
(這裡 我們還可以 進一步思考,讓分身再分身一個分身到另一個平行世界...可以用遞迴來做,好複雜,本人能力有限,嘗試了一下就放棄了...)
蛇這麼BT技能,用到的就是java中的克隆(clone)。
現在我們的蛇吃食物的策略就是,看到食物,讓分身到平行世界裡走一步看有沒有危險,如果有危險,就告訴蛇前面的路不能走。如果沒有危險,蛇就朝食物走一步。
這裡我們還要分析下,什麼是危險,或者什麼是安全。
仔細看第一幅圖,我們可以發現,那條蛇迷人的步伐都只是為了追著自己的尾巴。。蛇頭每走一步,蛇尾就空出一步,所以蛇頭到蛇尾有路徑就算安全,那危險就是蛇頭找不到蛇尾。
蛇頭找不到蛇尾只是危險,但不一定會死掉。
為了避免死掉,只要是危險,我們就應該避免。
那蛇現在的思路就是:
看到美食,讓分身探路,沒有危險,朝美食走最短距離,有危險。走蛇頭到蛇尾的最遠距離(為什麼是最遠距離。最遠距離蛇身會緊緊挨在一起,可以空出空地來),直到蛇可以安全的吃食物;
當然還有看不到美食的情況,美食隨機出現在蛇身圍起來的封閉空間裡了。這個時候 蛇走蛇尾的最遠距離,直到蛇頭和美食間有最短距離。
當蛇頭無路可走遊戲結束。
想獲得原始碼的朋友可以加群:282711949