问题描述
我一直在尝试用 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 (将#修改为@)