我正在編寫一個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;
當你說你「得到一個錯誤」你是什麼意思?構建錯誤?運行時錯誤?意外的輸出?請指定,並且還包括相關輸出(構建錯誤,預期/實際輸出,崩潰位置等) –
@JoachimPileborg對不起,我更新了該帖子,並給出了更詳細的解釋。 – HieiFCB
嘗試使用調試器。 –