2015-11-18 60 views
0

我正在編寫一個5x5 tictactoe遊戲。 我得到一個意外的運行時錯誤,它會返回一個行/列大於4C++轉置5x5 tictactoe錯誤

每個玩家扮演更大:

球員:3,3
計算機:0,0

球員:1, 3
計算機:0,3

球員:3,1
計算機:0,1

FLASH播放器r:0
計算機:140735274172144,4204747 < - 在阻止計算機獲勝的機會後,我的換位表產生這個最好的舉動。

我的代碼:

void doCompMove(TicTacToe& t, bool firstMove) { 
    TicTacToe::row_index bestRow; 
    TicTacToe::column_index bestCol; 

#ifndef ANALYSE 
    static int gameNum(0); 
    if (!(firstMove)) 
#else 
    Stopwatch sw; 
    sw.start(); 
#endif 
    t.clearTrans(); 
    t.chooseMove(TicTacToe::COMPUTER, bestRow, bestCol); 
#ifndef ANALYSE 
    else { 
     bestRow=gameNum%5; 
     bestCol=(gameNum/5)%5; 
     ++gameNum; 
    } 
#else 
    sw.stop(); 
    //if(bestRow > 4) bestRow=rand()%5; 
    //if(bestCol > 4) bestCol=rand()%5; 
    cout<<"Tijdsduur: "<<sw<<endl; 
    cout<<"Transposition table size is: "<<t.getTransSize()<<endl; 
    cout<<"Moves considered: "<<t.getAndResetMovesConsidered()<<endl; 
#endif 
    cout<<"Computer plays: ROW = "<<bestRow<<" COL = "<<bestCol<<endl; 
    t.playMove(TicTacToe::COMPUTER, bestRow, bestCol); 
} 

這是chooseMove功能:

TicTacToe::PositionVal TicTacToe::chooseMove(Side s, row_index& bestRow, column_index& bestColumn, 
        PositionVal alpha, PositionVal beta, int depth) { 
#ifdef ANALYSE 
    ++movesConsidered; 
#endif 
    static const int MAX_TABLE_DEPTH(5); //7 
    static const int MIN_TABLE_DEPTH(3); //5 

    if(depth>MAX_TABLE_DEPTH) 
     return UNCLEAR; 
    Position thisPosition(board); 
    if (depth>=MIN_TABLE_DEPTH && depth<=MAX_TABLE_DEPTH) { 
     MapItr itr(transpositions.find(thisPosition)); 
     if (itr!=transpositions.end()) 
      return (*itr).second; 
    } 
    Side opp(s==COMPUTER ? HUMAN : COMPUTER); 
    PositionVal simpleEval(positionValue()); 
    if (simpleEval!=UNCLEAR) 
     return simpleEval; 
    PositionVal bestValue(s==COMPUTER ? alpha : beta); 
    for (row_index row(0); alpha<beta && row<board.numrows(); ++row) 
     for (column_index column(0); alpha<beta && column<board.numcols(); ++column) 
      if (squareIsEmpty(row, column)) { 
       place(row, column, s); 
       row_index dr; 
       column_index dc; 
       PositionVal reply(chooseMove(opp, dr, dc, alpha, beta, depth+1)); 
       place(row, column, EMPTY); 
       if (s==COMPUTER && reply>bestValue || s==HUMAN && reply<bestValue) { 
        bestValue=reply; 
        if (s==COMPUTER) 
         alpha=bestValue; 
        else 
         beta=bestValue; 
        bestRow=row; 
        bestColumn=column; 
       } 
      } 
    if (depth>=MIN_TABLE_DEPTH && depth<=MAX_TABLE_DEPTH) { 
     transpositions[thisPosition]=bestValue; 
    } 
    return bestValue; 
} 

是否有可能換位表已達到最大尺寸是多少?

MapItr itr(transpositions.find(thisPosition)); if (itr!=transpositions.end()) return (*itr).second;

+1

當你說你「得到一個錯誤」你是什麼意思?構建錯誤?運行時錯誤?意外的輸出?請指定,並且還包括相關輸出(構建錯誤,預期/實際輸出,崩潰位置等) –

+0

@JoachimPileborg對不起,我更新了該帖子,並給出了更詳細的解釋。 – HieiFCB

+0

嘗試使用調試器。 –

回答

0

看起來你的代碼具有不選擇任何移動的路徑。因此你會得到垃圾結果。

這是很容易識別,只需更改如下:

void doCompMove(TicTacToe& t, bool firstMove) { 
    TicTacToe::row_index bestRow = -1; 
    TicTacToe::column_index bestCol = -1; 

,看看你會產生什麼樣的結果。之後你需要在邏輯中找到一個洞。

+0

現在它會爲行和列生成一個長整數18 ......。 – HieiFCB

+0

調試將有所幫助,但首先嚐試從chooseMove()打印返回值。有很多地方沒有設置這些值。 – VladimirS