我正在编写一个5x5 tictactoe游戏。 我收到一个意外的运行时错误,它返回一个大于4的ROW / COL。
每位球员的比赛:
球员:3,3
电脑:0,0
球员:1,3
电脑:0,3
球员:3,1
电脑:0,1
球员:0,2
计算机: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;
答案 0 :(得分:0)
看起来您的代码的路径不会选择任何移动。因此,你得到垃圾结果。
很容易识别,只需更改如下:
void doCompMove(TicTacToe& t, bool firstMove) {
TicTacToe::row_index bestRow = -1;
TicTacToe::column_index bestCol = -1;
看看你会得到什么结果。 之后你需要在逻辑中找到一个漏洞。