【发布时间】:2017-06-24 18:00:05
【问题描述】:
我尝试用 Java 编写一个用于连接四游戏的 MinMax 程序,但该程序也应该适用于其他游戏。但是,我遇到了一个问题,我几天都无法通过。节点的值设置不正确。我正在分享我的一段代码,它负责生成一棵树。
也许你会注意到我在哪里犯了错误。
如果有人能帮我解决这个问题,我会很高兴。
public Node generateTree(Board board, int depth) {
Node rootNode = new Node(board);
generateSubtree(rootNode, depth);
minMax(rootNode, depth);
return rootNode;
}
private void generateSubtree(Node subRootNode, int depth) {
Board board = subRootNode.getBoard();
if (depth == 0) {
subRootNode.setValue(board.evaluateBoard());
return;
}
for (Move move : board.generateMoves()) {
Board tempBoard = board.makeMove(move);
Node tempNode = new Node(tempBoard);
subRootNode.addChild(tempNode);
generateSubtree(tempNode, depth - 1);
}
}
public void minMax(Node rootNode, int depth) {
maxMove(rootNode, depth);
}
public int maxMove(Node node, int depth) {
if (depth == 0) {
return node.getValue();
}
int bestValue = Integer.MIN_VALUE;
for (Node childNode : node.getChildren()) {
int tempValue = minMove(childNode, depth - 1);
childNode.setValue(tempValue);
if (tempValue > bestValue) {
bestValue = tempValue;
}
}
return bestValue;
}
public int minMove(Node node, int depth) {
if (depth == 0) {
return node.getValue();
}
int bestValue = Integer.MAX_VALUE;
for (Node childNode : node.getChildren()) {
int tempValue = maxMove(childNode, depth - 1);
childNode.setValue(tempValue);
if (tempValue < bestValue) {
bestValue = tempValue;
}
}
return bestValue;
}
Board类是棋盘状态的表示。
Move 类保存要执行的移动(整数 [0-8] 用于井字游戏,[0-6] 用于连接四)。
Node 类保存 Move 并评估给定 move 的好坏。此外,持有它的所有孩子。
在代码中我这样使用这个方法:
Node newNode = minmax.generateTree(board, depth, board.getPlayer());
Move newMove = new TicTacToeMove(board.getPlayer(), newNode.getBestMove().getMove(), depth);
board = board.makeMove(newMove);
当给定的动作很明显是一个失败的动作(或获胜)时,我没有收到这个动作。
【问题讨论】:
-
如果您能提供一个示例,说明您输入的内容、您认为结果应该是什么以及它是什么,那就太好了。
-
嗨,Board 类是棋盘状态的表示。 Move 类保存要执行的移动(整数 [0-8] 表示 tictactoe,[0-6] 表示连接四)。 Node 类保存 Move 并评估给定 move 的好坏程度。还拥有它的所有孩子。在代码中,我使用这样的方法:
Node newNode = minmax.generateTree(board, depth, board.getPlayer()); Move newMove = new TicTacToeMove(board.getPlayer(), newNode.getBestMove().getMove(), depth); board = board.makeMove(newMove);当很明显给定的举动是失败的举动(或获胜)时,我没有收到这个举动。 -
什么是“我没有收到这个动作。”意思是?它是一个网络游戏,并且没有向您发送输赢的举动吗?你的意思是它没有放在板上?您的树没有获得新条目吗?
-
嗨。方法 generateTree(...) 的输出应该是板子给定状态的根。然后,当我执行 node.getBestMove() - 它应该返回具有最佳值的 Move(在 minmax 算法之后)。然后 move.getMove() 返回给定移动的整数 - 应该放置 pawn 的位置。我猜 minmax() 方法中的某些东西是错误的,因为 generateTree() 方法在游戏中到达底部并找到输/赢动作。
-
看,我想帮助你,但是......你还没有告诉我到底出了什么问题。 它应该以最佳价值返回 Move generateTree() 方法到达游戏的底部 move.getMove() 方法是否返回了 5?
标签: java tic-tac-toe minmax