为了更好地理解minimax算法是如何工作的,我一直在做一个tic-tac-toe程序。以下实现无法正常工作,因为计算机可能会丢失游戏。如果程序运行正常,理论上这是不可能的。。。
我是否在实施极大极小值或采取最佳行动时犯了错误?
我以前从未实现过算法: s
评价函数
public static int evaluate(char[] board, char turn) {
if (isWinFor('x', board)) {
return -1;
} else if (isWinFor('o', board)) {
return 1;
}
return 0;
}
极小极大
public static int alphabeta(char[] board, int depth, char turn, int alpha, int beta) {
if (depth == 0 || gameOver(board)) {
return evaluate(board, turn);
} else {
for (int move : possibleMoves(board)) {
makeMove(board, turn, move);
turn = changeTurn(turn);
int value = alphabeta(board, depth--, turn, alpha, beta);
makeMove(board, ' ', move);
if (turn == 'o') {
if (value > alpha) {
alpha = value;
}
if (alpha >= beta) {
return beta;
}
} else if (turn == 'x') {
if (value < beta) {
beta = value;
}
if (beta <= alpha) {
return alpha;
}
}
}
if (turn == 'o') {
return alpha;
} else {
return beta;
}
}
}
找到最好的办法
public static void getBestMove(char[] board, char turn) {
Random random = new Random();
int bestValue = -10000;
List<Integer> choices = new ArrayList<Integer>();
for (int move : possibleMoves(board)) {
makeMove(board, turn, move);
turn = changeTurn(turn);
int value = alphabeta(board, 3, turn, -10000, 10000);
makeMove(board, ' ', move);
if (value > bestValue) {
bestValue = value;
//start code edit
choices.clear();
//end code edit
choices.add(move);
} else if (value == bestValue) {
choices.add(move);
}
}
makeMove(board, turn, choices.get(random.nextInt(choices.size())));
}
非常感谢。
除了前面的答案之外,我很确定你的GetBestMobile是错误的:每当一个移动更好或等于你当前最好的移动时,你都会添加一个选择。但是当最佳值改变时,你实际上并没有清除列表。这意味着你的选择列表中会有失败的动作。
这很简单:一个完美的玩家必须搜索整棵树的最大深度(除了截断节点),但是你把你的程序限制为只有4层!
“寻找最佳移动”中有一个错误:
int value = alphabeta(board, 3, turn, -10000, 10000);
把它改成
int value = alphabeta(board, 8, turn, -10000, 10000);
我已经使用alpha-beta-minimax实现了JavaScript。它适用于3x3板,但当我将板更改为4x4或更高时,程序似乎挂起。 更新:当可用移动超过10时,程序无效 下面是alpha-beta-minimax函数: CheckForWinner()返回: 0代表不平不赢 1换领带 2代表玩家获胜 3代表电脑获胜 谢谢你的帮助
所以我为我的课做了一个抽动练习作业。我已经成功地创建了一个简单的Tic Tac Toe程序,但不知何故,检查绘制的方法有时并不正确。如果所有东西都填满了,但没有赢家,那就是平局。但如果除第0行第1列外,其他所有内容都已填满,则即使该框仍为空白,它仍将显示“Draw”。如果你不明白我的意思,就试着把所有的东西都填满,但不是赢,即使最后一个框没有填满,它也会说“平局”。我在代码中做错了什么????驱动
我想我终于对minimax和Alpha-beta修剪有所了解了,但实现它完全是另一回事! 根据我的理解,基础是:您为某些动作分配一个启发式函数分数(Gomoku为例)。 如果一行有5个,我们应该分配一个高值,比如9999,因为这是一个胜利的举动 当我们必须在Java中实现这一点时,我的问题来了! 我有一块彩色[][]板(8x8),其中黑色是播放器1,白色是播放器2,null表示空白,我不知道我们应
嗨,我正在编写一个井字游戏。我已经在代码中的注释中详细说明了我需要什么。我现在遇到的问题是制作一个getMobile方法。我想我需要在按下行和列后的if/else语句中调用getMobile方法? 我不确定如何从获取行/列编号并将其放入我的板上以获取用户输入的内容。 以下是我的代码:
我正在制作一个名为SOS的游戏。这是一款3x3的棋盘游戏,与Tic Tac Toe的概念相同,但在这款游戏中,玩家无法选择是以X还是O的身份进行游戏,游戏中唯一的规则是形成“SOS”。 我们的项目应该在所有职位被填补后终止,每个组成的“SOS”将被添加到组成“SOS”的玩家中。 我的问题是关于得分。在第一行输入SOS后,即,我尝试在第二行第一列输入“O”,玩家2将递增。它不应该递增,因为它不满足我
我用Java写了Tic-Tac-Toe。我似乎遇到的问题是,当(人类)播放器1和(计算机)播放器2之间出现平局时,GUI会冻结。我已经在“Buttonlistener”类和“Methods”中创建了一个tieCheck,以获得一个平局。 我的程序的工作方式是,当按下一个按钮时,它会将一个值传递给methods类中的数组。在这个数组中,1=玩家1,2=玩家2。 人类玩家总是先走,所以当人类玩家走了4