0

我正在用 JAVA 开发一个迷你项目,它正在构建一个 X/O 游戏,我在程序将找出下一个标志是“X”还是“O”的部分。所以我设置了一个事件监听器并等待用户点击按钮。我为每个按钮执行以下操作:

Button7.setBounds(50,180,80,30);
panel.add(Button7);
Button7.addActionListener(new ActionListener () {
@Override
public void actionPerformed(ActionEvent event) {
    int countX = 0;
    int countO = 0;
    int difxo = 0;
    String xo = "";
    if (Button1.getText().equals("X"))
    {
        countX += 1;
    }
    else if (Button2.getText().equals("X"))
    {
        countX += 1;
    }
    else if (Button3.getText().equals("X"))
    {
        countX += 1;
    }
    else if (Button4.getText().equals("X"))
    {
        countX += 1;
    }
    else if (Button5.getText().equals("X"))
    {
        countX += 1;
    }
    else if (Button6.getText().equals("X"))
    {
        countX += 1;
    }
    else if (Button7.getText().equals("X"))
    {
        countX += 1;
    }
    else if (Button8.getText().equals("X"))
    {
        countX += 1;
    }
    else if (Button9.getText().equals("X"))
    {
        countX += 1;
    }
    else
    {
        countX += 0;
    }
    if (Button1.getText().equals("O"))
    {
        countO += 1;
    }
    else if (Button2.getText().equals("O"))
    {
        countO += 1;
    }
    else if (Button3.getText().equals("O"))
    {
        countO += 1;
    }
    else if (Button4.getText().equals("O"))
    {
        countO += 1;
    }
    else if (Button5.getText().equals("O"))
    {
        countO += 1;
    }
    else if (Button6.getText().equals("O"))
    {
        countO += 1;
    }
    else if (Button7.getText().equals("O"))
    {
        countO += 1;
    }
    else if (Button8.getText().equals("O"))
    {
        countO += 1;
    }
    else if (Button9.getText().equals("O"))
    {
        countO += 1;
    }
    difxo = countX - countO;
    if (difxo == 0)
    {
    xo = "X";
    }
    else if (difxo == 1)
    {
    xo = "O";
    }
    countX = 0;
    countO = 0;
    Button7.setText(xo);
    }
    });

所以你可以弄清楚在 X/O 游戏中(当开始符号是 X 时)我们可以通过做一个基本的减法来假装哪个符号在后面。如果提取结果为 1:按钮中的符号必须为“O”,如果结果为 0,则符号必须为“X”。但是在我制作的程序中,对每个按钮单击事件重复相同的操作,我得到“X”“O”“X”“X”“X”而不是“X”“O”“X”“O”.. . 等等我不知道为什么会发生这种情况,因为每次我计算“X”和“O”时都会做减法。谢谢。

4

1 回答 1

0

制作一个类字段,例如称为“转弯”,它保存应该是转弯的状态。最好是它是枚举类型,但它可以包含一个字符串。然后在轮换时更改该值。

例如,如果您的 turn 变量包含一个 String,并且您的程序有两个 String 常量,X = "X" 和 Y = "Y",那么您可以使用以下代码来交换转弯:

turn = turn.equals(X) ? Y : X;

其他建议:

  • 避免绝对定位。将 JButton 放入使用 a 的 JPanel 中GridLayout(3, 3)并让布局管理器放置它们并帮助调整它们的大小要容易得多。
  • 学习并遵循 Java 命名约定。类、接口和枚举名称以大写字母开头,变量和方法以小写字母开头。
  • 单个 ActionListener 可以用于所有游戏按钮。
  • 确保在对按下按钮执行任何操作之前检查该按钮是否尚未被选中。
  • 正如 ppeterka 66 明智地建议的那样,turn 变量可以是一个简单的布尔变量,比如称为 isXTurn,您可以通过检查来执行 x-turn 行为if (isXTurn)(当然还有在 else 块中执行 y-turn 行为),然后交换它的做事有价值turn = !turn
  • 正如其他人所建议的那样,使用一组 JButton 来简化您的编码和调试。

关于单个 ActionListener,在伪代码中,它可能如下所示:

  @Override
  actionPerformed method
     First check if gameOver is true. If so, return;

     use e.getSource() to get the button pressed and put it 
        into a JButton local variable, button
     Use a for loop to iterate through the button array to 
        find out which button is pressed. Store in a variable(s)
     Set a String variable called text with the button's text.
     if the button's text has already been set (it's not empty) then return;
     set the button's text with the appropriate text based on the state of turn
     call checkForWin() method. Pass in the button's position in the button array.
     swap turns
   end of actionPerformed method
于 2013-09-07T23:09:18.140 回答