2013-10-19 83 views
0

我正在爲我在AS3中工作的遊戲創建AI。爲此,我需要能夠通過多次檢查來決定AI是否執行某項任務。Actionscript 3中的動態比較

我需要能夠存儲比較運算符(例如==)或整個比較(例如V1 == V2)。

我怎樣才能將它作爲一個變量存儲或允許類似的用法?

回答

1

v1 == v2返回一個對象(一個布爾值),所以你可以用它來存儲它。

對於存儲操作,這不是(我認爲)任何OOP語言可以做...
在AS3中,你可以求助於eval功能,但會影響性能,所以我建議你實現一個功能,爲你做那個 - >例如。在僞代碼:

const EQUAL:int = 0; 
const LESS_THAN:int = 1; 
etc... 

function compare(v1, v2, op):Boolean 
    switch(op) 
     case EQUAL 
      return v1 == v2 
     etc... 

,因此會使用一個int變量儲存您的比較操作
如果您正在使用ASC2進行編譯,請考慮內聯此函數。

我也建議你重新考慮你的AI的邏輯,如果你打算硬編碼了很多的具體情況:S(請忽略此位,如果事實並非如此)。

+0

這似乎是最好的選擇。我很難編碼我的AI,僅僅是因爲它的一個小項目。對於一個更大的項目(具有一半複雜的AI),我會使用AI的腳本。 –

1

您想要了解關於constraint based programming的更多信息。由於我們正在談論AI,因此Prolog是這種編程的典型例子。從技術上講,存在用於解決這類問題的不同算法,其中大部分算法被稱爲 isfiability算法。以下是一些已知求解器的列表:http://en.wikipedia.org/wiki/Category:SAT_solvers

您在處理這些問題時可能需要使用一些構造,尤其是在它們隨時間演變時:State pattern。通過仔細建模你的情況,你可以避免重複的狀態重新計算。即例如,如果模型的某些特徵僅在特定條件成立時才被激活,那麼可以通過轉換到隱含該條件的真實性的狀態來對其進行建模。給你一個更具體的例子,假設你有一個系統,你有一個玩家角色和一天的時間。如果一天中的時間是night,則該字符可以執行sleep動作,否則由字符執行的動作是wonder around aimlessly。然後,您可以創建狀態daynight,如果由遊戲環境輸入的話,它們都將具有功能characterAction。遊戲循環在調用characterAction()時不會意識到環境的狀態,但角色將執行正確的操作。

但它可能更有利於保存系統的狀態,說其定義狀態的所有變量的向量。當您添加更多變量時,後者縮放比例會更好。例如,您可以將遊戲模型定義爲可能的狀態轉換。底線,你需要開始做些什麼,並在實施時遇到問題時詢問更具體的例子。我不認爲這些好的解決方案僅限於我所提到的。他們很可能不是。