我的计算机玩家AI代码未按预期工作。我希望它能随机移动,但同时能阻止对手即将获胜的回合。然而,有时它完全停止工作,其他时候即使没有即将获胜的组合,它也会进行特定的移动。我的计算机AI代码如下所示。
public void compturn() { count++ ; if(count == 1||count == 3 || count == 5 || count == 7 || count == 9 || count == 11) { letter = "O" ; } else if ( count == 2 || count == 4 || count == 6 || count == 8 || count == 10) { letter = "X" ; } if (b1.getText() == b2.getText() && b2.getText() != "" && b3.getText() == "") { b3.setText(letter); b3bool = false ; } else if (b4.getText() == b5.getText() && b6.getText() == "") { b6.setText(letter); b6bool = false ; } else if (b7.getText() == b8.getText() && b9.getText() == "") { b9.setText(letter); b9bool = false ; } else if (b1.getText() == b4.getText() && b4.getText() != "" && b7.getText() == "") { b7.setText(letter); b7bool = false ; } else if (b2.getText() == b5.getText() && b8.getText() == "") { b8.setText(letter); b8bool = false ; } else if (b3.getText() == b6.getText() && b9.getText() == "") { b9.setText(letter); b9bool = false ; } else if (b1.getText() == b5.getText() && b5.getText() != "" && b9.getText() == "") { b9.setText(letter) ; b9bool = false ; } else if (b3.getText() == b5.getText() && b7.getText() == "") { b7.setText(letter); b7bool = false ; } else { randomMove(); } } public void randomMove() { int randomnum = (int)(Math.random() * 10); if(randomnum == 1 ) { if(b1.getText().equals("X") || b1.getText().equals("O")) { randomMove(); } else { b1.setText(letter); } } if(randomnum == 2 ) { if(b2.getText().equals("X") || b2.getText().equals("O")) { randomMove(); } else { b2.setText(letter); } } if(randomnum == 3 ) { if(b3.getText().equals("X") || b3.getText().equals("O")) { randomMove(); } else { b3.setText(letter); } } if(randomnum == 4 ) { if(b4.getText().equals("X") || b4.getText().equals("O")) { randomMove(); } else { b4.setText(letter); } } if(randomnum == 5 ) { if(b5.getText().equals("X") || b5.getText().equals("O")) { randomMove(); } else { b5.setText(letter); } } if(randomnum == 6 ) { if(b6.getText().equals("X") || b6.getText().equals("O")) { randomMove(); } else { b6.setText(letter); } } if(randomnum == 7 ) { if(b7.getText().equals("X") || b7.getText().equals("O")) { randomMove(); } else { b7.setText(letter); } } if(randomnum == 8 ) { if(b8.getText().equals("X") || b8.getText().equals("O")) { randomMove(); } else { b8.setText(letter); } } if(randomnum == 9 ) { if(b9.getText().equals("X") || b9.getText().equals("O")) { randomMove(); } else { b9.setText(letter); } } }
我的完整游戏代码在这里
public int oneplayergame() { // ----=---------------------- 创建游戏屏幕上的所有JButton并添加动作监听器和反应 ----------------------------------------- b1 = new JButton(""); b1.setToolTipText("标记此框"); b1.setFont(TToeFont); b1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent onclickb1) { if (b1bool == true){ count++; if(count == 1||count == 3 || count == 5 || count == 7 || count == 9 || count == 11) { letter = "O" ; } else if ( count == 2 || count == 4 || count == 6 || count == 8 || count == 10) { letter = "X" ; } b1.setText(letter); b1bool = false ; calculatevictory(); compturn(); processturn(); }}}); b2 = new JButton(""); b2.setFont(TToeFont); b2.setToolTipText("标记此框"); b2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent onclickb1) { if (b2bool == true){ count++; if(count == 1||count == 3 || count == 5 || count == 7 || count == 9 || count == 11) { letter = "O" ; } else if ( count == 2 || count == 4 || count == 6 || count == 8 || count == 10) { letter = "X" ; } b2.setText(letter); b2bool = false ; calculatevictory(); compturn(); processturn(); }} }); b3 = new JButton(""); b3.setToolTipText("标记此框"); b3.setFont(TToeFont); b3.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent onclickb1) { if(b3bool == true){ count++; if(count == 1||count == 3 || count == 5 || count == 7 || count == 9 || count == 11) { letter = "O" ; } else if ( count == 2 || count == 4 || count == 6 || count == 8 || count == 10) { letter = "X" ; } b3.setText(letter); b3bool = false ; calculatevictory(); compturn(); processturn(); }} }); b4 = new JButton(""); b4.setToolTipText("标记此框"); b4.setFont(TToeFont); b4.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent onclickb1) { if(b4bool == true){ count++; if(count == 1||count == 3 || count == 5 || count == 7 || count == 9 || count == 11) { letter = "O" ; } else if ( count == 2 || count == 4 || count == 6 || count == 8 || count == 10) { letter = "X" ; } b4.setText(letter); b4bool = false ; calculatevictory(); compturn(); processturn(); }} }); b5 = new JButton(""); b5.setToolTipText("标记此框"); b5.setFont(TToeFont); b5.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent onclickb1) { if (b5bool == true){ count++; if(count == 1||count == 3 || count == 5 || count == 7 || count == 9 || count == 11) { letter = "O" ; } else if ( count == 2 || count == 4 || count == 6 || count == 8 || count == 10) { letter = "X" ; } b5.setText(letter); b5bool = false ; calculatevictory(); compturn(); processturn(); }} }); b6 = new JButton(""); b6.setToolTipText("标记此框"); b6.setFont(TToeFont); b6.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent onclickb1) { if (b6bool == true){ count++; if(count == 1||count == 3 || count == 5 || count == 7 || count == 9 || count == 11) { letter = "O" ; } else if ( count == 2 || count == 4 || count == 6 || count == 8 || count == 10) { letter = "X" ; } b6.setText(letter); b6bool = false ; calculatevictory(); compturn(); processturn(); }} }); b7 = new JButton(""); b7.setToolTipText("标记此框"); b7.setFont(TToeFont); b7.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent onclickb1) { if (b7bool == true){ count++; if(count == 1||count == 3 || count == 5 || count == 7 || count == 9 || count == 11) { letter = "O" ; } else if ( count == 2 || count == 4 || count == 6 || count == 8 || count == 10) { letter = "X" ; } b7.setText(letter); b7bool = false ; calculatevictory(); compturn(); processturn(); }} }); b8 = new JButton(""); b8.setToolTipText("标记此框"); b8.setFont(TToeFont); b8.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent onclickb1) { if(b8bool == true){ count++; if(count == 1||count == 3 || count == 5 || count == 7 || count == 9 || count == 11) { letter = "O" ; } else if ( count == 2 || count == 4 || count == 6 || count == 8 || count == 10) { letter = "X" ; } b8.setText(letter); b8bool = false ; calculatevictory(); compturn(); processturn(); }} }); b9 = new JButton(""); b9.setToolTipText("标记此框"); b9.setFont(TToeFont); b9.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent onclickb1) { if(b9bool == true){ count++; if(count == 1||count == 3 || count == 5 || count == 7 || count == 9 || count == 11) { letter = "O" ; } else if ( count == 2 || count == 4 || count == 6 || count == 8 || count == 10) { letter = "X" ; } b9.setText(letter); b9bool = false ; calculatevictory(); compturn(); processturn(); }} }); //创建游戏屏幕布局 //创建游戏屏幕内容窗格并将按钮添加到其中 // 每次点击按钮时,此方法检查是否有人赢得了游戏 public void calculatevictory(){ if (b1.getText() == b2.getText() && b2.getText() == b3.getText() && b1.getText() != "") { win = true ; } else if (b4.getText() == b5.getText() && b5.getText() == b6.getText() && b4.getText() != "") { win = true ; } else if (b7.getText() == b8.getText() && b8.getText() == b9.getText() && b7.getText() != "") { win = true ; } else if (b1.getText() == b4.getText() && b4.getText() == b7.getText() && b1.getText() != "") { win = true ; } else if (b2.getText() == b5.getText() && b5.getText() == b8.getText() && b2.getText() != "") { win = true ; } else if (b3.getText() == b6.getText() && b6.getText() == b9.getText() && b3.getText() != "") { win = true ; } else if (b1.getText() == b5.getText() && b5.getText() == b9.getText() && b1.getText() != "") { win = true ; } else if (b3.getText() == b5.getText() && b5.getText() == b7.getText() && b3.getText() != "") { win = true ; } else { win = false ; } } // 此方法发送获胜消息 public void processturn() } // 此方法重置所有游戏变量 public void resetgame() { count = 1 ; b1bool = true ; b2bool = true ; b3bool = true ; b4bool = true ; b5bool = true ; b6bool = true ; b7bool = true ; b8bool = true ; b9bool = true ; win = false ; gameinit = true ; b1.setText(""); b2.setText(""); b3.setText(""); b4.setText(""); b5.setText(""); b6.setText(""); b7.setText(""); b8.setText(""); b9.setText(""); } public void compturn() { } public void randomMove() { }}
回答:
欢迎体验AI… 实现这个有很多方法。我给你一些建议。
我假设count是用来确定轮到谁的。我建议你创建一个整数’turn’,然后简单地这样做:
turn = 1 -turn
…在你当前增加count的地方。如果它是0,那么轮到O,否则轮到X。你可以删除那两个长的if语句。(你也可以使用一个布尔标志,每次取反它,比如turn = !turn。)
现在剩下的部分… 我看到你没有使用数组。你是否习惯使用它们?
如果是的话,定义获胜序列。例如:
int[][] win = new int[][]{{1,2,3}, {4,5,6}, {7,8,9}, {1,4,7}, ...}
然后,你要做的就是检查你是否在win[i][0], win[i][1]或win[i][2]位置有两个你的标记。如果第三个位置是空的,你可以赢并应该移动到那里,
如果你不能赢,重复上述过程来防御。
如果你不需要防御并且不能赢,移动到中心。如果中心被占用,选择一个角,否则随机移动。
这将给你一个有时仍会输但会显示一些智能的AI。如果你真的想构建一个不可战胜的AI,可以看看极小极大搜索算法。
祝你好运!