2013-12-08 36 views
0

全部。我試圖讓一個minimax算法的版本在c#中爲一個學校項目運行。我們正在嘗試製作一個簡單的Mancala AI。有什麼辦法在C#中有一個父類使用兒童的方法?

爲此,我建立了一個由包含所有子值和其他板子信息以模擬未來移動的節點組成的樹。

最初,我希望讓樹有一個可變的根 - 而不是每次更換主板時重做樹,我都希望找到與當前主板相匹配的子節點,然後從中取出所有的工作,擴展它,並從那裏開展工作。

當我去更新我的樹,我想一個簡單的for循環:

for(int i = 0; i < 6; i++) { 
     ... 
      if(bCopy.stonesAt(myPits[i]) == (myPits[myPits.Length-i-1])) 
       myChildren[i]= new MaxNode(...); 
      else 
       myChildren[i] = new MinNode(...); 
     } 
    } else { 
     myChildren[i].addChildren(board, depth); 
    } 
} 

省略號到位的代碼或參數,企圖使之可讀。

這是什麼導致我很麻煩。由於Mancala有一些讓你再次走的動作,因此無法知道給定的子節點是MinNode還是MaxNode。我將MinNodes和MaxNodes都設置爲抽象類DecisionNode的子類。

我希望最後一行(myChildren [i] .addChildren(board,depth))會下降到最低級別,並根據哪個適當使用MaxNode addChildren或MinNode addChildren。但是,它使用DecisionNode addChildren方法。

我想將代碼保存在單獨的類中,因爲它很麻煩。有沒有辦法做到這一點?

編輯:我應該提到,我已經將DecisionNode.addChildren設置爲虛擬,將MinNode設置爲覆蓋。但是,似乎是因爲myChildren [i]的類型在編譯時不知道,所以它默認爲父類。方法調用去

public virtual bool addChildren(Board b, int depth) { 
     return true; 
    } 

而不是其中一個子類。

回答

0

我找到了答案!或者,如果不是答案,至少有一個會起作用。製作AddChildren抽象的DecisionNode方法似乎已經成功了。

2

到myChildren呼叫[I]應導致主叫MinNode.addChildren,或MaxNode.addChildren .addChildren,只要你標註在派生類中的基類DecisionNode方法virtual,並override

例如,在你的抽象基類,你應該有:

public abstract class DecisionNode 
{ 
    public virtual void addChildren(...) 
    { 
     ... 
    } 
} 

而在你的派生類,你應該有:

public class MinNode : DecisionNode 
{ 
    public override void addChildren(...) 
    { 
     ... 
    } 
} 
+0

有些事情是錯的。在你的基類抽象中做addchildren,看看它開始抱怨的地方。 –

2

UPDATE:

我有一個最近我寫了一個遞歸的後代語言分析器的問題。抽象語法樹是解析器用來表示語言的結構。我強烈建議您使用訪問者設計模式進行調查。基本上,您創建了一個由所有樹節點實現的IVisitable接口。然後,實現實現一個Accept方法,並將其自身的一個實例傳遞給調用它的任何IVisitor實例。

一旦你實現了這個模式,你可以任意遍歷你的樹並做任何你想要的而不會損害你的基本代碼。當你想要一些節點實現一個行爲而其他節點不行的時候,這是特別有用的。它的功能與派生類相反。

無論如何,對於早先的向後回答抱歉。

+0

我試圖通過父類到達子類,當不知道它是哪個子類時;不要試圖通過孩子到達父母。 – UrhoKarila

+0

對不起,我的壞。我的大腦反向閱讀。 – drankin2112

相關問題