JAVA Tic Tac Toe AI

JAVA Tic Tac Toe AI,java,artificial-intelligence,Java,Artificial Intelligence,因此,我用Java设计了一个GUI Tic Tac Toe游戏,如果两个玩家相互对抗,它就可以工作。然而,我正在尝试实现一种“人工智能模式”。到目前为止,除了人工智能模式外,一切都正常工作。结果是人工智能做出了可预测的动作,并没有正确地阻止用户获胜(这是我目前的目标)。我设置它的方式是,如果在游戏的早期(因为如果你只标记了一个点,从技术上讲是不可能成功的),AI会随机选择一个点。另一方面,如果用户有获胜的举动,人工智能将简单地阻止用户获胜。问题是,人工智能将选择甚至不接近阻止用户获胜的位置 GU

因此,我用Java设计了一个GUI Tic Tac Toe游戏,如果两个玩家相互对抗,它就可以工作。然而,我正在尝试实现一种“人工智能模式”。到目前为止,除了人工智能模式外,一切都正常工作。结果是人工智能做出了可预测的动作,并没有正确地阻止用户获胜(这是我目前的目标)。我设置它的方式是,如果在游戏的早期(因为如果你只标记了一个点,从技术上讲是不可能成功的),AI会随机选择一个点。另一方面,如果用户有获胜的举动,人工智能将简单地阻止用户获胜。问题是,人工智能将选择甚至不接近阻止用户获胜的位置

GUI是使用二维数组设计的,并使用getText()来知道哪个播放器拥有该磁贴。它还设置为用户始终为“X”,而AI或任何对手为“O”。我有一个内部类AI,它有一个checkBoard方法和一个makeMoves方法,如下所示。我还尝试了第二种makeMoves方法,如下所示。有什么想法或建议可以让这一切顺利进行吗?感谢所有的帮助

按钮的actionListener:

public class ButtonListener implements ActionListener {
        private AI ai = new AI();
        private int x;
        private int y;
        public ButtonListener(int x, int y) {
            this.x = x;
            this.y = y;
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            JButton button = (JButton) e.getSource();
                if (button.getText() == "") {
                    if (turn) {
                        button.setText("X");
                        turn = false;
                        if (checkWinner(x,y)) {
                            JOptionPane.showMessageDialog(null, "Winner!");
                            refresh();
                        }
                    } else if (isComputerPlaying)  {
                        ai.getMoves();
                        ai.checkBoard();

                        } else {
                            button.setText("O");
                            turn = true;
                            if (checkWinner(x,y)) {
                                JOptionPane.showMessageDialog(null, "Winner!");
                                refresh();
                        }
                        }
                    } 
                }
        }
AI内部类:

public class AI {
            //----------------------------------------------
            //Uses getMoves method and marks a spot on the board
            //----------------------------------------------



            public void checkBoard() {
                if (!turn) {
                    if (getMoves().isEmpty()) {
                        turn = true;
                        int x = getRandom();
                        int y = getRandom();
                        buttons[x][y].setText(toString());
                        checkWinner(x,y);

                    } else {
                        if (buttons[getMoves().get(0)][getMoves().get(1)].getText() == "") {
                            buttons[getMoves().get(0)][getMoves().get(1)].setText(toString());
                        } else {
                            buttons[getMoves().get(0)][getMoves().get(1)].setText(toString());
                        }

                        getMoves().removeAll(getMoves());
                        turn = true;
                    }

                }
            }


            public int getRandom() {
                int random = Math.random() > .75 ? 2: Math.random() <= .50 ? 1 : Math.random() <= .25 ? 1 : null;
                return random;
            }

            //----------------------------------------------
            //Determine all possible win moves by the user
            //----------------------------------------------


            public ArrayList<Integer> getMoves() {
                ArrayList<Integer> getMoves = new ArrayList<>();
                for (int x = 0; x < 3; x++) {
                    for (int y = 0; y < 3; y++) {
                        if (buttons[x][y].getText() == "X") {
                            if (x < 2 && y < 2) {
                                if (checkWinner(x+1,y+1)) {
                                    getMoves.add(x+1);
                                    getMoves.add(y+1);
                                } else if (checkWinner(x+1,y)) {
                                    getMoves.add(x+1);
                                    getMoves.add(y);
                                } else if (checkWinner(x,y+1)) {
                                    getMoves.add(x);
                                    getMoves.add(y+1);
                                }
                            } else if(x > 0 && y > 0) {
                                if (checkWinner(x-1,y-1)) {
                                    getMoves.add(x-1);
                                    getMoves.add(y-1);
                                } else if (checkWinner(x-1,y)) {
                                    getMoves.add(x-1);
                                    getMoves.add(y);
                                } else if (checkWinner(x,y-1)) {
                                    getMoves.add(x);
                                    getMoves.add(y-1);
                                }
                            } 
                        }
                    }
                }

                return getMoves;
            }






            public String toString() {
                return "O";
            }
        }
最后是实验性的getMoves方法,重命名为getMoves2。出于某种奇怪的原因,它会删除已经放置的移动:

public ArrayList<Integer> getMoves2(int x, int y) {
                ArrayList<Integer> getMoves2 = new ArrayList<>();
                if (x < 2 && y < 2) {
                    buttons[x+1][y+1].setText("X");
                    buttons[x+1][y].setText("X");
                    buttons[x][y+1].setText("X");
                    if (checkWinner(x+1,y+1)) {
                        getMoves2.add(x+1);
                        getMoves2.add(y+1);
                    } else if (checkWinner(x+1,y)) {;
                        getMoves2.add(x+1); 
                        getMoves2.add(y);
                    } else if (checkWinner(x,y+1)) {
                        getMoves2.add(x);
                        getMoves2.add(y+1);
                    }

                    buttons[x+1][y+1].setText("");
                    buttons[x+1][y].setText("");
                    buttons[x][y+1].setText("");
                } else if(x > 0 && y > 0) {
                    buttons[x-1][y-1].setText("X");
                    buttons[x-1][y].setText("X");
                    buttons[x][y-1].setText("X");
                    if (checkWinner(x-1,y-1)) {
                        getMoves2.add(x-1);
                        getMoves2.add(y-1);
                    } else if (checkWinner(x-1,y)) {
                        getMoves2.add(x-1);
                        getMoves2.add(y);
                    } else if (checkWinner(x,y-1)) {
                        getMoves2.add(x);
                        getMoves2.add(y-1);
                    }

                    buttons[x-1][y-1].setText("");
                    buttons[x-1][y].setText("");
                    buttons[x][y-1].setText("");
                }
                return getMoves2;
            }
public ArrayList getMoves2(int x,int y){
ArrayList getMoves2=新建ArrayList();
if(x<2&&y<2){
按钮[x+1][y+1].setText(“x”);
按钮[x+1][y].setText(“x”);
按钮[x][y+1].setText(“x”);
如果(中奖人(x+1,y+1)){
getMoves2.add(x+1);
getMoves2.add(y+1);
}else如果(checkWinner(x+1,y)){;
getMoves2.add(x+1);
getMoves2.add(y);
}否则如果(选中者(x,y+1)){
getMoves2.add(x);
getMoves2.add(y+1);
}
按钮[x+1][y+1].setText(“”);
按钮[x+1][y].setText(“”);
按钮[x][y+1].setText(“”);
}如果(x>0&&y>0),则为else{
按钮[x-1][y-1].setText(“x”);
按钮[x-1][y].setText(“x”);
按钮[x][y-1].setText(“x”);
if(胜利者(x-1,y-1)){
getMoves2.add(x-1);
getMoves2.add(y-1);
}否则如果(胜利者(x-1,y)){
getMoves2.add(x-1);
getMoves2.add(y);
}否则如果(选中者(x,y-1)){
getMoves2.add(x);
getMoves2.add(y-1);
}
按钮[x-1][y-1].setText(“”);
按钮[x-1][y].setText(“”);
按钮[x][y-1].setText(“”);
}
返回getMoves2;
}

再次感谢您的帮助

研究极小极大算法。欢迎来到StackOverflow!目前您的问题不符合StackOverflow的问题标准(特别是,您的问题要求调试帮助,但没有证明您在隔离问题方面付出了努力)。阅读以获得如何更好地组织问题的建议。请在代码中添加注释。如果不是为了我们,那就是为了你自己。我有自己的评论
public ArrayList<Integer> getMoves2(int x, int y) {
                ArrayList<Integer> getMoves2 = new ArrayList<>();
                if (x < 2 && y < 2) {
                    buttons[x+1][y+1].setText("X");
                    buttons[x+1][y].setText("X");
                    buttons[x][y+1].setText("X");
                    if (checkWinner(x+1,y+1)) {
                        getMoves2.add(x+1);
                        getMoves2.add(y+1);
                    } else if (checkWinner(x+1,y)) {;
                        getMoves2.add(x+1); 
                        getMoves2.add(y);
                    } else if (checkWinner(x,y+1)) {
                        getMoves2.add(x);
                        getMoves2.add(y+1);
                    }

                    buttons[x+1][y+1].setText("");
                    buttons[x+1][y].setText("");
                    buttons[x][y+1].setText("");
                } else if(x > 0 && y > 0) {
                    buttons[x-1][y-1].setText("X");
                    buttons[x-1][y].setText("X");
                    buttons[x][y-1].setText("X");
                    if (checkWinner(x-1,y-1)) {
                        getMoves2.add(x-1);
                        getMoves2.add(y-1);
                    } else if (checkWinner(x-1,y)) {
                        getMoves2.add(x-1);
                        getMoves2.add(y);
                    } else if (checkWinner(x,y-1)) {
                        getMoves2.add(x);
                        getMoves2.add(y-1);
                    }

                    buttons[x-1][y-1].setText("");
                    buttons[x-1][y].setText("");
                    buttons[x][y-1].setText("");
                }
                return getMoves2;
            }