我是java的初学者,所以请随时纠正我对这个问题的任何措辞。
无论如何,我正在与一个完美的AI对手一起创造一个naughts和crosses / tic tac toe游戏,我的目标是使用alpha-beta修剪minimax算法。我认为我很好地理解了算法,但我无法弄清楚如何将'nodes'和'nodeChilds'合并到其中。这是维基百科上的算法,在伪代码中。
01 function minimax(node, depth, maximizingPlayer)
02 if depth = 0 or node is a terminal node
03 return the heuristic value of node
04 if maximizingPlayer
05 bestValue := −∞
06 for each child of node
07 v := minimax(child, depth − 1, FALSE)
08 bestValue := max(bestValue, v)
09 return bestValue
10 else (* minimizing player *)
11 bestValue := +∞
12 for each child of node
13 v := minimax(child, depth − 1, TRUE)
14 bestValue := min(bestValue, v)
15 return bestValue
任何人都可以了解“节点”应该具有什么样的价值?在我目前的算法中,我称之为minimax函数:
game.minimax(0, 1); //1 represents the computer's turn, equivalent to maximizingPlayer
public int minimax(int depth, int turn)
任何帮助/解释都会受到高度赞赏,如果我提供的信息不充分或者我的问题解释得很严重,那么道歉。
答案 0 :(得分:1)
node
是游戏树的状态。在naughts和十字架的情况下,它描绘了板的当前状态。 minimax算法需要一个具有以下信息的节点:
您可以使用该信息创建Node
接口,并使用它创建通用的minimax实现。像这样:
enum Player { MAX, MIN }
interface Node {
boolean isTerminal();
int utility();
Player nextPlayer();
List<Node> children();
}
然后,你有Node
的顽皮和十字架实现,它编纂了游戏规则。例如,您可以将电路板存储为9个整数的简单数组(0表示空白,1表示X,2表示O)。
class NaughtsAndCrossesNode implements Node {
private int[] board;
// ....
}
重要的是要认识到任何Node
实现应该是不可变的类。玩游戏(获取节点的子节点)会创建更多实例,并且不会更改现有实例。