2017-07-09 92 views
0

正確得分分支我試圖創造C.一個完美的井字棋遊戲,我用一個二維數組來跟蹤板。極小不是在井字棋

我已經將問題縮小到了我的minimax函數對每個潛在移動進行評分的方式,但我在調試時遇到了問題,因爲錯誤通常發生在第二步移動周圍,並且我無法跟蹤所有潛在的遊戲狀態從那一點。

電腦進入第一,並且總是「X」。 minimax正在從computerMove函數中調用,該函數嘗試每個可用的移動,然後將它們最小化。它將從minimax的潛在遊戲狀態返回的值作爲臨時分數,並將其與當前最高分進行比較。我相信該計劃的一部分正在發揮作用。問題就出在minimax函數本身

這裏是我的代碼的重要部分:

int minimax(char board[][3], char maxPlayer) // +10 -> X wins 
{           // -10 -> O wins 
    char minPlayer;       // 0 -> draw 
    int scores[3][3]; 
    if (maxPlayer == 'X') minPlayer = 'O'; 
    else minPlayer = 'X'; 
    int topScore = 0; 

    // initializing scores to ensure a move is selected 
    for (int i = 0; i < 3; i++) { 
     for (int j = 0; j < 3; j++) { 
      scores[i][j] = -11; 
     } 
    } 

    // check for terminal state 
    if (isWinning(board,'X') || isWinning(board,'O') || 
    !moveAvailable(board)) { 
     if (isWinning(board,'X')) return 10; 
     else if (isWinning(board,'O')) return -10; 
     else return 0; 
    } 

    for (int i = 0; i < 3; i++) { 
     for (int j = 0; j < 3; j++) { 
      if (board[i][j] == 'U') { 
       board[i][j] = maxPlayer;    // try the move 
       scores[i][j] = minimax(board,minPlayer);// minimax it 
       board[i][j] = 'U';      // undo the move 
      } 
     } 
    } 

    // if calling minimax for computer, maximize the score 
    if (maxPlayer == 'X') { 
     for (int i = 0; i < 3; i++) { 
      for (int j = 0; j < 3; j++) { 
       if (scores[i][j] > topScore && scores[i][j] != -11) 
        topScore = scores[i][j]; 
      } 
     } 
    } 

    // if calling minimax for human, minimize the score 
    else if (maxPlayer == 'O') { 
     for (int i = 0; i < 3; i++) { 
      for (int j = 0; j < 3; j++) { 
       if (scores[i][j] < topScore && scores[i][j] != -11) 
        topScore = scores[i][j]; 
      } 
     } 
    } 
    return topScore; 
} 
+1

我最好打賭是這樣的:if(board [i] [j] =='U'){'。這種情況從來沒有真的我猜 –

+0

這一行:'分數[行] [列] = -11; //全部設置爲'O'wins'不正確。根據對函數簽名聲明的其他評論,'O'勝是-10,而不是-11 – user3629249

+0

每個遞歸都是從一個新的,未初始化版本的'scores [] []'開始的'這可能是不正確的。 – user3629249

回答

1

問題是與topScore初始化:

  • 你應該在11或初始化topScore - 11取決於誰出場,而不是0,否則雙方球員都會相信他們總是能夠從第2洞開始至少獲得平局(情況並非如此)。

  • 中的良好做法(恕我直言),我認爲,最後兩個循環應該只是更新topScore之前被分成之一,它裏面的if (maxPlayer == 'X')條件。另外,你應該跳過所有board[i][j]!='U'的位置,比分數中的-11更容易理解(雖然這很好)。