如何解决如何在 Java 中将 MinMax 算法与 Tic Tac Toe 一起使用?
我一直在尝试用 Java 创建一个 Tic Tac Toe 游戏,并将 MinMax 算法用于 AI。我查看了互联网上的一些示例,但似乎无法找到我的错误所在。游戏正在运行,但 AI 根本玩得不好。 我有一组 JButton,当我与 AI 对战时,它应该始终选择最佳解决方案(为他自己)。 当玩家移动时,调用 moveAI()。他调用 minmaxBestMove(),它递归调用 minmax() 来找到当前的最佳移动。之后,调用 check() 以查看游戏是否结束。 (check() 的布尔值 minmax 参数用于在检查最佳移动 -minmax true- 或检查游戏是否应该结束 -minmax false- 之间切换)。
我确信有办法把它写得更好或更干净,但这是我目前想到的。 感谢您的帮助!
以下是我创建的方法:
private void moveAI()
{
int bestField = minimaxBestMove();
buttons[bestField].setText("O");
buttons[bestField].setForeground(Color.BLUE);
switchToX();
check(false,player1_turn);
player1_turn = true;
}
private int minimaxBestMove()
{
int best = -1000;
int bestField=-1;
for(int i=0; i<9; i++)
{
if(buttons[i].getText().equals(""))
{
buttons[i].setText("O");
int moveVal = minimax(0,false);
buttons[i].setText("");
if(moveVal>best)
{
best = moveVal;
bestField = i;
}
}
}
return bestField;
}
private int minimax(int depth,boolean playerTurn){
int score = check(true,playerTurn);
if(score==10 || score==-10 || score==0)
return score;
if(playerTurn){
int best = -1000;
for(int i =0; i<9;i++)
{
if(buttons[i].getText().equals(""))
{
buttons[i].setText("O");
best = Math.max(best,minimax(depth+1,false));
buttons[i].setText("");
}
}
return best;
}
else{
int best =1000;
for(int i=0; i<9; i++)
{
if(buttons[i].getText().equals(""))
{
buttons[i].setText("X");
best = Math.min(best,true));
buttons[i].setText("");
}
}
return best;
}
}
public int check(boolean minimax,boolean playerTurn){
for(int i=0; i<3; i++)
{
if(
((buttons[3*i].getText().equals("X") || (buttons[3*i].getText().equals("O")))) &&
(buttons[3*i].getText().equals(buttons[1 + 3*i].getText())) &&
(buttons[1 + 3*i].getText().equals(buttons[2 + 3*i].getText()))
){
if(!minimax)
win(3*i,1 + 3*i,2 + 3*i);
if(playerTurn)
return 10;
else
return -10;
}
}
for(int i=0; i<3; i++)
{
if(
((buttons[i].getText().equals("X") || (buttons[i].getText().equals("O")))) &&
(buttons[i].getText().equals(buttons[i+3].getText())) &&
(buttons[3+i].getText().equals(buttons[6 + i].getText()))
){
if(!minimax)
win(i,3 + i,6 + i);
if(playerTurn)
return 10;
else
return -10;
}
}
if(
((buttons[0].getText().equals("X") || (buttons[0].getText().equals("O")))) &&
(buttons[0].getText().equals(buttons[4].getText())) &&
(buttons[4].getText().equals(buttons[8].getText()))
){
if(!minimax)
win(0,4,8);
if(playerTurn)
return 10;
else
return -10;
}
if(
((buttons[2].getText().equals("X") || (buttons[2].getText().equals("O")))) &&
(buttons[2].getText().equals(buttons[4].getText())) &&
(buttons[4].getText().equals(buttons[6].getText()))
){
if(!minimax)
win(2,6);
if(playerTurn)
return 10;
else
return -10;
}
if (!isMoveLeft()) {
if(!minimax)
win(-1,-1,-1);
return 0;
}
return -1;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。