我想通过引入深度来限制搜索级别,将无与伦比的井字游戏修改为适用于5乘5的区块.任何建议

I want to modify the unbeatable tic tac to work for 5 by 5 block by introducing the depth to limit the search levels. Any suggestions?

本文关键字:游戏 修改 适用于 无与伦比 任何建 深度 搜索      更新时间:2023-10-16

下面是minimax算法的代码片段。对于5乘5的矩阵来说,这似乎需要花费很多时间。我想介绍一个变量来跟踪递归的深度并限制它。下面是整个代码的链接:http://ideone.com/e.js/pyFHRu

int MiniMax(char _board[25], player _player) {
    int best_val = -INFINITY, index = 0;
    std::list<int> move_list;
    char best_moves[25] = {0};
    generate_moves(_board, move_list);
    while(!move_list.empty()) {
        _board[move_list.front()] = _player.symbol;
        cSymbol = _player.symbol;
        int val = MinMove(_board, _player);
        if(val > best_val) {
            best_val = val;
            index = 0;
            best_moves[index] = move_list.front() + 1;
        } else if(val == best_val) {
            best_moves[++index] = move_list.front() + 1;
        }
        _board[move_list.front()] = 0;
        move_list.pop_front();
    }
    if(index > 0) {
        index = rand() % index;
    }
    return best_moves[index];
}
// finds best move for 'min player'
int MinMove(char _board[25], player _player) {
    int pos_value = evaluate_position(_board, _player);
    if(pos_value != -1) {
        return pos_value;
    }
    int best_val = +INFINITY;
    std::list<int> move_list;
    generate_moves(_board, move_list);
    while(!move_list.empty()) {
        _player.symbol == 'X' ? cSymbol = 'O' : cSymbol = 'X';
        _board[move_list.front()] = cSymbol;
        int val = MaxMove(_board, _player);
        if(val < best_val) {
            best_val = val;
        }
        _board[move_list.front()] = 0;
        move_list.pop_front();
    }
    return best_val;
}
// finds best move for 'max player'
int MaxMove(char _board[25], player _player) {
    int pos_value = evaluate_position(_board, _player);
    if(pos_value != -1) {
        return pos_value;
    }
    int best_val = -INFINITY;
    std::list<int> move_list;
    generate_moves(_board, move_list);
    while(!move_list.empty()) {
        _player.symbol == 'X' ? cSymbol = 'X' : cSymbol = 'O';
        _board[move_list.front()] = cSymbol;
        int val = MinMove(_board, _player);
        if(val > best_val) {
            best_val = val;
        }
        _board[move_list.front()] = 0;
        move_list.pop_front();
    }
    return best_val;
}

如果您已经在使用较小的深度,那么您必须计算启发式算法。启发式是介于-1和1之间的值,表示位置评估。如果你的深度为10(你计算了10层),那么当你到达评估的最终位置(深度为0或有人获胜)时,你需要计算启发法。

因此,我们可以使用具有有限最大深度的MiniMax算法,在该算法中,如果游戏没有获胜,则使用启发式函数计算对结果位置的评估。如果你想使用启发式方法来消除评估树中看似无用的分支,以进一步优化评估时间,那么你可以使用Alpha Beta prunning,在这里和这里查看更多信息。