c ++ transposition 5x5 tictactoe错误

时间:2015-11-18 12:50:53

标签: c++ transpose tic-tac-toe alpha-beta-pruning

我正在编写一个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;

1 个答案:

答案 0 :(得分:0)

看起来您的代码的路径不会选择任何移动。因此,你得到垃圾结果。

很容易识别,只需更改如下:

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

看看你会得到什么结果。 之后你需要在逻辑中找到一个漏洞。