2015-07-21 134 views
0

我正在連接4 AI,除非遊戲繼續,直到所有42個空格填滿。
得分由連續4位保持得1分。Minimax連接4 AI故障

public int[] Max_Value(GameBoard playBoard, int depth){ 
    GameBoard temp = new GameBoard(playBoard.playBoard); 
    int h = 0, tempH = 999, tempCol=0; 
    int myDepth = depth - 1; 
    int[] tempH2 = new int[2]; 
    boolean noChildren = true; 
    if(myDepth != -1){ 
     for(int i = 0; i < 7; i++){ 
      if(temp.isValidPlay(i)){ 
       count++; 
       temp.playPiece(i); 
       noChildren = false; 
       tempH2 = Min_Value(temp, myDepth); 
       if(tempH2[1] < tempH){ 
        tempH=tempH2[1]; 
        tempCol = i; 
       } 
       temp.removePiece(i); 
      } 
     } 
    } 
    int[] x = new int[2]; 
    if(noChildren){ 
     h = temp.getHeuristic(); 
    } 
    else{ 
     h = tempH; 
     x[0]=tempCol; 
    } 
    x[1]=h; 
    return x; 
} 

public int[] Min_Value(GameBoard playBoard, int depth){ 
    GameBoard temp = new GameBoard(playBoard.playBoard); 
    int h = 0, tempH = -999, tempCol=0; 
    int myDepth = depth - 1; 
    int[] tempH2 = new int[2]; 
    boolean noChildren = true; 
    if(myDepth != -1){ 
     for(int i = 0; i < 7; i++){ 
      if(temp.isValidPlay(i)){ 
       count++; 
       temp.playPiece(i); 
       noChildren = false; 
       tempH2 = Max_Value(temp, myDepth); 
       if(tempH2[1] > tempH){ 
        tempH=tempH2[1]; 
        tempCol = i; 
       } 
       temp.removePiece(i); 
      } 
     } 
    } 
    int[] x = new int[2]; 
    if(noChildren){ 
     h = temp.getHeuristic(); 
    } 
    else{ 
     h = tempH; 
     x[0]=tempCol; 
    } 
    x[1]=h; 
    return x; 
} 

我覺得我只是偶然發現了一切,感覺就像可怕的代碼。不過,我從來沒有嘗試過這樣的事情,並希望得到任何意見。我不知道我哪裏錯了。對於任何給定的狀態,我的評估函數只能爲每個連續4個點提供1個點。主函數調用Min_Value函數以深度爲10開始。

我試圖返回列以及啓發式的值。我希望我已經提供了足夠的信息。感謝您的任何見解。

回答

1

好的,在實現未顯示的方法(如評估,playmove,刪除等)後,我能夠調試此。假設這些功能在您的版本的一些正確的方法來實現,該錯誤是,你永遠不會真正調用評價函數,如果深度爲-1:

你有這樣的:

[...]if(myDepth != -1) 
{/*restofthecode*/}[...] 

但是你需要什麼是這樣的:

[...]if(myDepth == -1) 
{ 
return temp.getHeuristic(); 
} 
/*restofthecode*/ 
[...] 

這樣一來,只要你達到深度-1(在極小樹樹葉),董事會將評估和返回值(這是excactly您在極小的需要)。

在這兩個部分(最小和最大)和所有東西都保持完好。如果還有其他問題,請隨時詢問。

1

即使沒有在問題中說明,我認爲你的搜索行爲並不好,對吧?

沒有看過你的while代碼,我已經可以說你的程序只能在遊戲的最後10次移動(最後10個空字段或10次強制贏了)中工作。否則,您的程序將返回最後一次或第一次移動。那是因爲你的評價函數,你只處理一個勝利(分別連續4次),但不是連續2次,陷阱,連續3次等)。如果不能強制取勝,它會認爲所有的舉動都是平等的。

這是一個問題,因爲從一個空白字段開始,一個勝利只能由起始玩家強制執行,而第二個最後一個棋子必須放在棋盤上。 (在你的第4版中強制執行)。

由於您的searchdepth(10)小於最大遊戲移動次數(42),您的程序將始終發揮其第一步。

如果算法的其餘部分正確實現,您可以通過簡單地改進評估函數來修復此問題,以便它可以在「好」和「壞」遊戲位置之間有所不同。

+0

謝謝。我剛剛開始使用糟糕的評估功能,以確保至少工作,因爲它更容易檢查。我只是在最上面一行是空的板子上檢查它(只剩下7步)。然而,儘管有一個連接,但它仍然不會做出連接4的動作。而且,當我試圖在空板上運行它時,該程序即使在深度爲5時也會失速,我認爲它不應該。我認爲時間將在深度5的空板上達到7^5。再次感謝。 – user2587878

+0

@ user2587878好吧,最酷的是我可以將它粘貼到visual studio中,並用優秀的調試器進行調試。我會盡力在今天晚些時候解決這個問題,並在這裏發佈另一個答案,如果我能找到這個錯誤。 – xXliolauXx

+1

編輯:請注意,您的方法名是反轉的,您的Min方法會計算最大化的球員值=>可能會導致混淆 – xXliolauXx