通過俄羅斯方塊淺談遊戲中的AI(四)路點

:談到“路點”大家想到的應該是cs中的bot waypoint,

有waypoint的map可以使用bot,沒有waypoint的map就不行。

於是大家都去下載每個地圖的“路點(WayPoint)

 

其實這兩個遊戲的路點雖然從規模上有較大差距,但從思想上還真差不多。

 

 

我認爲cs的路點實現:


 

 

1、cs的路點並不會存儲讓bot如何瞄準,而只會記錄當前位置和下一個可選位置的關係,以及按照什麼路線走過去。

 

好的路點文件可以讓bot走的路線很不容易被人看到,一般的路點就會沿着大道中間走;

2、bot在某個點上做某些動作的真正原因是bot本身的AI所致,bot這個對象具備隨時觀察情況的能力,也許他們之間還有通訊的能力,

有此作爲鋪墊,路點才能更容易實現。

3、路點的結構應該是一個圖,圖的節點是每一個可能的轉折點:如分岔路,需要跳躍或者輔助攀巖的位置。而對於什麼時候該換槍、該往哪裏瞄準,完全不需要路點去描述。

 


 

正文:

 

Tetris的路點卻有一些不同,Tetris的每一個塊的個體不需要具備AI,Tetris本身是個純大局觀的遊戲,單個個體起到的作用遠不及cs大

--別鄙視我說cs也是大局觀的遊戲,我也清楚,任何東西大局觀有問題都不行,但是至少cs可以個人英雄,Tetris沒有可能。。。。。。

 

所以在路點這塊,需要武裝到牙齒:下一個位置是哪裏;先橫移還是先縱移動;應該在哪裏變化方塊才更容易達到位置;應該用快速下落還是應該稍微慢點,等等。

 

對於Tetris中的每一個小塊自己是不需要任何AI的,只需要執行指令。完全由總AI作爲統一調度。

 

爲了把問題闡述的更清晰,先看一下我定義的struct WayPoint

 

由於代碼中有足夠的註釋,我就不再對結構體本身作解釋,我把WayPoint的應用邏輯以僞代碼的方式列出,方便大家理解。

 

 

step1:  


 

轉動次數++;

轉動次數>4?'異常':(轉動一次,判斷是否是目標樣式?step2:step1); 

★(轉動次數>4)的解釋:任何方塊自己找到WayPoint後,會轉動4次以內,直到達到了TheAimSet的對象就停止,當4次都不能達到這個狀態,就拋出異常,重新進行AI。

如:‘7’形的set是‘L’形的set左轉兩次能得到的。它們是兩個不同的對象。

 

step2:

橫向移動先?

   (判斷當前的方塊x座標是否到達目標x座標?setp3:一次向目標的x座標橫移一格):

   (判斷當前的方塊y座標是否到達目標y座標?setp3:一次下降一格);

step3:

橫向移動先?

 

   (判斷當前的方塊y座標是否到達目標y座標?setp4:(最後一個WayPoint?瞬間下降到底:一次下降一格)): 

 

   (判斷當前的方塊x座標是否到達目標x座標?setp4:一次向目標的x座標橫移一格);

step4:

是否最後一個路點?over:(切換到下一個路點,step1);


 

 

下面再舉個幾個小例子。

 

case 1:當我們下來一個 L形的方塊,而我們最右邊有個空擋正好可以讓它變化兩次後插入,消除3行, 

對於這種最簡單的情況,我們只需要一個WayPoint即可:WayPoint(目標位置(9,16),‘7’形的set,true);

case 2:當我們發現最後一行有個虛洞,需要L型的下降到最後然後橫移的,照樣一個WayPoint即可:WayPoint(目標位置(4,18),‘L’形的set,false);不同點在最後一個參數爲false;

 

case 3:當我們發現要必須變成 ━┛ 形狀,然後才能往最後一層有兩個連續的虛洞的位置插入時;甚至下落過程必須沿着邊用2個寬度的‘7’形下落,等下降到一定位置才能轉動的情況下,我們就不得不用多個WayPoint表達這個方塊的移動軌跡,

如:WayPoint1(目標位置(9,10),‘7’形set,true);達到最邊上,以2個寬度的‘7’形進行下降。

WayPoint2(目標位置(4,18),‘━┛ 形’,false);先變化,再下降,在橫向移動。

可以想象的是,除非及特殊情況,通常一個waypoint足夠解決絕大多數問題。

 

本節總結:

   路點(waypoint)是我分析過,認爲能比較好解決效率和簡化算法的一箇中間產物,不排除用更邏輯更好的即時計算的方案,比如每移動一次用路徑搜索算法進行計算,是否能達到位置,達到位置應該如何變化。但考慮到效率問題,我還是用了waypoint做中間產物。

   以後的程序在計算waypoint的時候,會預先使用A*算法,將可能的最短路徑給找出來,由這個路徑翻譯成路點。一次計算的時間越長,對於當前操作者的影響越大。如果對方用頻繁1行攻擊的話,電腦需要一次次重新計算路點的可行性。找到一個快速的路徑搜索算法並配合路點存儲是解決這個問題的最好辦法。

下一章節講提高效率之一的位運算代替數組運算;在再一章節就會介紹變化的A*算法。

爲什麼變化了的A*算法呢?先留個問題讓大家思考一下吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章