【问题标题】:Implement Minimax without recursion无递归实现 Minimax
【发布时间】:2011-11-14 07:25:23
【问题描述】:

我正在建造一个井字游戏解决机器人。为了练习,我使用极小极大算法编写了一个井字游戏,效果非常好。当我想将我的代码移植到控制器时,我发现这个控制器的 C/C++ 编译器都不支持递归函数。因此,我需要帮助将此递归 minimax 函数转换为使用迭代或内部堆栈的函数:

int miniMax (char board[BOARD_DIM][BOARD_DIM], _Bool minNode, int *xBest, int *yBest)
{
    int possibleMoves[NSQUARES][2];
    int nPossibleMoves = generateMoves(board, possibleMoves);
    char boardChild [BOARD_DIM][BOARD_DIM];
    int ind, x_ind, y_ind;
    int minScore, maxScore;
    if (gameOver(board))
        return evaluateState(board);
    else if (minNode)
    {
        minScore = +INFINITY;
        for (ind = 0 ; ind < nPossibleMoves; ind++) 
        {
            duplicateBoard(board, boardChild);
            x_ind = possibleMoves[ind][0];
            y_ind = possibleMoves[ind][1];
            updateboard(boardChild, x_ind, y_ind, cPlayer);
            int score = miniMax(boardChild,!minNode ,&x_ind ,&y_ind);
            if (minScore > score)
                minScore = score;
        }
        return minScore;
    }
    else if (!minNode)
    {
        maxScore = -INFINITY;
        for (ind = 0 ; ind < nPossibleMoves; ind++) 
        {
            duplicateBoard(board, boardChild);
            x_ind = possibleMoves[ind][0];
            y_ind = possibleMoves[ind][1];
            updateboard(boardChild, x_ind, y_ind, cComputer);
            int score = miniMax(boardChild,!minNode ,&x_ind ,&y_ind);
            if (maxScore < score)
            {
                maxScore = score;
                *xBest = x_ind;
                *yBest = y_ind;
            }
        }
        return maxScore;
    }

我完全不知道如何做到这一点。 感谢您的帮助:)

【问题讨论】:

  • “此控制器的 C/C++ 编译器都不支持递归函数”是什么意思?
  • @VJo:我敢打赌他的意思是堆栈空间很狭窄。嵌入式软件:)
  • @sehe:如果不分析显式或递归堆栈是否占用更多内存,这是过早优化的情况。
  • @all 评论者:不,user1045114 表示编译器不支持递归。这并不让我感到惊讶。一些微处理器没有推送和弹出指令,因此必须在链接时分配过程本地数据。这显然不适用于递归函数。
  • 不要从代码转换的角度思考,而是从从头解决问题的角度思考。我认为这里要容易得多。首先,带有早期(递归)返回的初始 if 变成一个循环。

标签: c++ c recursion tic-tac-toe minimax


【解决方案1】:

如果是嵌入式我会

  • 以二进制编码位置(位矩阵而不是 2dim 字节数组)
  • 编码完整的解决方案图,所以一切都只是一个查找(线性查找可以很好地解决这种复杂性)

【讨论】:

  • 感谢您的回答。但是如何使用 0 和 1 来表示 3 个状态(O、X 和空)?使用这种方法是否意味着要检查所有 9 个单元格的大量 if 语句?
  • 哦,为什么 O 的步数比 X 的步数多?
  • @user1045114:你应该带点创意!您可以在每个单元格中使用两位——但这会很浪费。您可以为每个可能的位置分配一个唯一的序数 0..3^9(仅需要 15 位)并使用它来索引查找表。哦,这就是答案的一部分:查找表消除了任何条件。
  • '哦,为什么 O 的动作比 X 的动作多得多' - 因为 X 开始了?从第一张图中的大红色 X 应该很明显:)
  • 哇,伙计们,你们在这里帮助了一个非常新手的程序员。我不知道如何实现查找表。和@sehe:你在最后一句话中完全失去了我。项目快到期了,实在没时间写最优化的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-04
相关资源
最近更新 更多