【发布时间】:2013-04-25 18:06:23
【问题描述】:
我正在尝试用 Java 编写一个小型 AI 算法来实现 miniMax 算法。
此游戏所基于的游戏是两人游戏,其中两名玩家每回合移动一次,每个棋盘位置都会导致每个玩家得分。玩家 X 的位置的“质量”是通过从玩家 X 在该位置的得分中减去对手的得分来评估的。每一步都用一个整数表示(即输入 1 移动一,输入 2 移动二等)
我知道 miniMax 应该使用递归来实现。目前我有:
evaluate() 方法,它接受一个表示棋盘状态的对象(即“BoardState”对象和一个名为“max”的布尔值作为参数)(签名将是 evaluate(BoardState myBoard, boolean max) em>)。
当轮到玩家 X 时,max 为真。给定一个棋盘位置,它将评估所有可能的移动并返回对玩家 X 最有利的移动。如果轮到对手,max 将为 false,该方法将返回对玩家 X 最不利的移动(即:对玩家最有利)
但是,我在编写实际的 miniMax 方法时遇到了困难。我的一般结构是这样的:
public int miniMax(GameState myGameState, int depth)
我提交初始游戏状态和我希望它研究的“深度”。
然后我会有类似的东西:
int finalMove = 0;
while(currentDepth < depth) {
GameState tmp = myGameState.copy();
int finalMove = evaluate(tmp, true or false);
iniMax(tmp.makeMove(finalMove));
}
return finalMove;
这听起来像是一个合理的实现吗?有什么建议? :)
谢谢!
【问题讨论】:
-
在递归中,您编写了一个调用自身的方法,但问题规模较小。 while 循环不是您要寻找的,您想多次调用
Evaluate以减少深度。 -
嗯...我不确定我明白你的意思:S
-
在定义 Evaluate 时,您可以根据对 Evaluate 的其他调用来定义它,但问题规模更小(深度更小)。 stackoverflow.com/questions/717725/understanding-recursion