JAVA Tic Tac Toe AI

时间:2015-12-08 02:19:59

标签: java artificial-intelligence

所以我用Java设计了一个GUI Tic Tac Toe游戏,如果两个玩家互相对战的话。但是,我试图实现一个" AI模式"。到目前为止,除AI模式外,一切都按预期工作。发生的事情是人工智能做出可预测的动作并且没有正确阻止用户获胜(这是我目前的目标)。我设置它的方式是,如果在游戏的早期(因为如果你只标记了一个点,技术上不可能有获胜的动作),AI会随机选择一个位置。另外,如果用户有获胜动作,AI将仅仅阻止用户获胜。问题是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";
            }
        }

checkWinner类,用于确定玩家是否已赢得使用已定义的序列:

public boolean checkWinner(int x, int y) {
            if (buttons[0][y].getText() == buttons[1][y].getText() && buttons[2][y].getText() == buttons[1][y].getText()) {
                return true;
            }
            else if (buttons[x][0].getText() == buttons[x][1].getText() && buttons[x][2].getText() == buttons[x][0].getText()) {
                return true;
            }
            else if (x == y) {
                return buttons[0][0].getText() == buttons[1][1].getText() && buttons[0][0].getText() == buttons[2][2].getText();
            }
            else if ((x == 0 && y == 2) || (x==2 && y==0) || x==y) {
                return buttons[2][0].getText() == buttons[1][1].getText() && buttons[2][0].getText() == buttons[0][2].getText();
            }


        return false;

    }

最后,实验性的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;
            }

再次感谢您的帮助!

0 个答案:

没有答案