JAVA Tic Tac Toe AI
因此,我用Java设计了一个GUI Tic Tac Toe游戏,如果两个玩家相互对抗,它就可以工作。然而,我正在尝试实现一种“人工智能模式”。到目前为止,除了人工智能模式外,一切都正常工作。结果是人工智能做出了可预测的动作,并没有正确地阻止用户获胜(这是我目前的目标)。我设置它的方式是,如果在游戏的早期(因为如果你只标记了一个点,从技术上讲是不可能成功的),AI会随机选择一个点。另一方面,如果用户有获胜的举动,人工智能将简单地阻止用户获胜。问题是,人工智能将选择甚至不接近阻止用户获胜的位置 GUI是使用二维数组设计的,并使用getText()来知道哪个播放器拥有该磁贴。它还设置为用户始终为“X”,而AI或任何对手为“O”。我有一个内部类AI,它有一个checkBoard方法和一个makeMoves方法,如下所示。我还尝试了第二种makeMoves方法,如下所示。有什么想法或建议可以让这一切顺利进行吗?感谢所有的帮助 按钮的actionListener:JAVA Tic Tac Toe AI,java,artificial-intelligence,Java,Artificial Intelligence,因此,我用Java设计了一个GUI Tic Tac Toe游戏,如果两个玩家相互对抗,它就可以工作。然而,我正在尝试实现一种“人工智能模式”。到目前为止,除了人工智能模式外,一切都正常工作。结果是人工智能做出了可预测的动作,并没有正确地阻止用户获胜(这是我目前的目标)。我设置它的方式是,如果在游戏的早期(因为如果你只标记了一个点,从技术上讲是不可能成功的),AI会随机选择一个点。另一方面,如果用户有获胜的举动,人工智能将简单地阻止用户获胜。问题是,人工智能将选择甚至不接近阻止用户获胜的位置 GU
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;
}