当前位置: 首页 > 知识库问答 >
问题:

井字游戏Java:按钮问题

谷梁德容
2023-03-14

我在Java中创建了一个小TicTacToe游戏,我想编写更有效的代码,我会制作一个for循环来创建9个按钮。

我现在面临的问题是如何测试按下哪个按钮以确定胜利者。我已经注释掉了我的旧测试代码,因为它不再工作。

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class TicTacToe extends JFrame implements ActionListener, WindowListener{

public JFrame window = new JFrame("window");



public String letter = "";
public String lastLetter = "";
public int count = 0;
public boolean win;
public boolean isTieGame;
public static int x;


public TicTacToe()
{

    window.setSize(300,300);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setLayout(new GridLayout(3,3));

    int x;
    JButton[] b = new JButton[9];
    for(x = 0; x < 9; x++)
    {
        b[x] = new JButton();
        window.add(b[x]);
        b[x].addActionListener(this);
    }


    window.setVisible(true);
    }

public static void main(String[] args) {
    new TicTacToe();
    }

public void counter()
    {
        if(count == 1 || count == 3 || count == 5 || count == 7 || count == 9)
        {
            letter = "X";
        }
        else
        {
            letter = "O";
        }
    }
/*
public boolean isGameOver()
{

    if(b1.getText().equals(b2.getText()) && b2.getText().equals(b3.getText()) && b1.getText() != "")
    {
        win = true;
    }
    else if(b4.getText().equals(b5.getText()) && b5.getText().equals(b6.getText()) && b4.getText() != "")
    {
        win = true;
    }
    else if(b7.getText().equals(b8.getText()) && b8.getText().equals(b9.getText()) && b7.getText() != "")
    {
        win = true;
    }
    else if(b1.getText().equals(b5.getText()) && b5.getText().equals(b9.getText()) && b1.getText() != "")
    {
        win = true;
    }
    else if(b3.getText().equals(b5.getText()) && b5.getText().equals(b7.getText()) && b3.getText() != "")
    {
        win = true;
    }
    else if(b1.getText().equals(b4.getText()) && b4.getText().equals(b7.getText()) && b1.getText() != "")
    {
        win = true;
    }
    else if(b2.getText().equals(b5.getText()) && b5.getText().equals(b8.getText()) && b2.getText() != "")
    {
        win = true;
    }
    else if(b3.getText().equals(b6.getText()) && b6.getText().equals(b9.getText()) && b3.getText() != "" )
    {
        win = true;
    }
    else
    {
        win = false;
    }
    return win;
}
*/
public void endOrReset()
    {
        if(win)
        {
            JOptionPane.showMessageDialog(null, lastLetter() + " WINS!");
            int playAgain = JOptionPane.showConfirmDialog(null, "Would you like to play again?", "Play Again.", JOptionPane.YES_NO_OPTION);
            if(playAgain == (JOptionPane.YES_OPTION))
            {
            win = false;
            }
            else if(playAgain == JOptionPane.NO_OPTION)
            {
                JOptionPane.showMessageDialog(null, "Goodbye");
                System.exit(0);
            }
        }
        else if(isTieGame)
            {
            JOptionPane.showMessageDialog(null, "Tie Game!");
            int playAgain = JOptionPane.showConfirmDialog(null, "Would you like to play again?", "Play Again.", JOptionPane.YES_NO_OPTION);
            if(playAgain == JOptionPane.YES_OPTION)
            {


            }
            else if(playAgain == JOptionPane.NO_OPTION)
            {
                JOptionPane.showMessageDialog(null, "Goodbye");
                System.exit(0);
            }
            }

    }
public void actionPerformed(ActionEvent a) {

    count++;
    counter();
    //isGameOver();
    endOrReset();



    ((JButton)a.getSource()).setText(letter);

   }

@Override
public void windowActivated(WindowEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void windowClosed(WindowEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void windowClosing(WindowEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void windowDeactivated(WindowEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void windowDeiconified(WindowEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void windowIconified(WindowEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void windowOpened(WindowEvent e) {
    // TODO Auto-generated method stub

}   
public String lastLetter()
{
    String lastLetter;
    if(letter == "O")
    {
        lastLetter = "X";
    }
    else
    {
        lastLetter = "O";
    }
    return lastLetter;
}
public boolean isTieGame()
{
    if(count >= 9 && win == false)
    {
        isTieGame = true;
    }
    return isTieGame();
}
}   

共有2个答案

澹台锐
2023-03-14

我喜欢做的是独立于GUI的9长度数组来保存游戏状态,如下所示:

0 1 2
3 4 5
6 7 8

如果你仔细想想,指数在哪里

3*(index/3) + index % 3

这通常是一个枚举数组,但也可以使用字符串数组,

public enum State
{
    EMPTY,
    X,
    O;
}

然后

State[] gridState = new State[9];
for(int i = 0; i < gridState.length; i++) {
    gridState = State.EMPTY;
}

如果你根据它们的索引,基于GUI初始化你的按钮,

public class MyButton extends JButton {
    private int index;

    public MyButton(int index) {
        super();
        this.index = index;
    }

    public int getIndex() {
        return index;
    }
}

然后当有人点击你的按钮时,你可以说((MyButton)a.getSource()). getIndex()

你会得到这个按钮的索引。

如果tic-tac-toe定义为3x3和2D,我喜欢根据索引检查胜利,我会存储一个数组,其中包含获胜的水平、垂直和对角线索引。

int[][] winIndices = {{0,1,2}, {3,4,5}, {6,7,8}, {0,3,6}, {1,4,7}, {2,5,8}, {0,4,8}, {2,4,6}};

然后你可以根据

public boolean checkWin() {
    for(int[] indexArray : winIndices) {
        boolean same = (gridState[indexArray[0]] == gridState[indexArray[1]]) && 
                       (gridState[indexArray[1]] == gridState[indexArray[2]])
        if(same == true && gridState[indexArray[0]] != State.EMPTY) {
             return true;
        }
    }
    return false;
}

或者类似的东西。我更好地写下了一次,但那不是在这台电脑上,而是类似的东西:)

宁鹏程
2023-03-14

我认为最简单的解决方案是将JButton[]b设为一个字段,因此在构造函数上方声明它。

在这种情况下,你也应该使用更具描述性的名称。

或者你可以持有一个字符数组,其中一个按钮注册当前玩家的符号(X或O),这就是我不久前解决这个问题的方法

 类似资料:
  • 所以我为我的课做了一个抽动练习作业。我已经成功地创建了一个简单的Tic Tac Toe程序,但不知何故,检查绘制的方法有时并不正确。如果所有东西都填满了,但没有赢家,那就是平局。但如果除第0行第1列外,其他所有内容都已填满,则即使该框仍为空白,它仍将显示“Draw”。如果你不明白我的意思,就试着把所有的东西都填满,但不是赢,即使最后一个框没有填满,它也会说“平局”。我在代码中做错了什么????驱动

  • 编辑:解决了,多亏了Mgorgon。 我正在创建一个简单的游戏,它(目前)允许你用鼠标点击在当前位置的每个方向上移动一个点1步。然而,这只在板是正方形(你可以选择板的大小)时才起作用。板由带有图像和2D数组的按钮表示,以跟踪位置,其中“1”是点的位置,“0”是一个空闲空间。actionlistener中的Pos1和Pos2打印出所单击的按钮的位置。当游戏棋盘是正方形时,这很有效,但当我把棋盘改成矩

  • 嗨,我正在编写一个井字游戏。我已经在代码中的注释中详细说明了我需要什么。我现在遇到的问题是制作一个getMobile方法。我想我需要在按下行和列后的if/else语句中调用getMobile方法? 我不确定如何从获取行/列编号并将其放入我的板上以获取用户输入的内容。 以下是我的代码:

  • 我正在制作一个名为SOS的游戏。这是一款3x3的棋盘游戏,与Tic Tac Toe的概念相同,但在这款游戏中,玩家无法选择是以X还是O的身份进行游戏,游戏中唯一的规则是形成“SOS”。 我们的项目应该在所有职位被填补后终止,每个组成的“SOS”将被添加到组成“SOS”的玩家中。 我的问题是关于得分。在第一行输入SOS后,即,我尝试在第二行第一列输入“O”,玩家2将递增。它不应该递增,因为它不满足我

  • 我用Java写了Tic-Tac-Toe。我似乎遇到的问题是,当(人类)播放器1和(计算机)播放器2之间出现平局时,GUI会冻结。我已经在“Buttonlistener”类和“Methods”中创建了一个tieCheck,以获得一个平局。 我的程序的工作方式是,当按下一个按钮时,它会将一个值传递给methods类中的数组。在这个数组中,1=玩家1,2=玩家2。 人类玩家总是先走,所以当人类玩家走了4

  • 我写的神经网络可以玩井字游戏。网络有9个输入神经元,它们描述板的状态(1-代表网络移动,1.5-代表对手移动,0-代表空单元)和9个输出神经元(具有最高值的输出神经元表示给定状态下的最佳动作)。网络没有隐藏层。激活函数-乙状结肠。学习方法--Q学习+反向传播。 网络是经过训练的,但很差(继续踩在被占用的单元格上)。所以我决定添加一个隐藏层。我想问: 在隐藏层中使用多少个神经元,在隐藏层和输出层中使