【发布时间】: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