JButton ActionListener两个玩家游戏

时间:2012-01-01 02:25:18

标签: java swing jbutton

我正在尝试使用Java Swing创建一个双人游戏。

我有一个JButton

我的想法是在点击JButton时切换到其他玩家。当玩家单击JButton时,它将成为玩家的两个回合;当玩家两次点击时,它变成了玩家的一个回合。

但是到目前为止,我的代码不允许程序等待玩家二次点击。当玩家点击一下时,玩家二被认为也已经点击过。

如何通过让程序等待玩家二次点击来解决这个问题?

boolean game = true;
final boolean p1 = false;
final boolean p2 = false;
...
while (game) {
    p1 = true;
    while (p1) {
        enterMoveButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                doSomething();
                p1 = false;
                p2 = true;
            }
        });
    }
    while (p2) {
        enterMoveButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                doSomething();
                p2 = false;
                p1 = true;
            }
        });
    }
}

5 个答案:

答案 0 :(得分:3)

我建议改为使用JToggleButton。有关使用它们的信息,请参阅 The Java Tutorial中的How to Use Buttons, Check Boxes, and Radio Buttons部分。

答案 1 :(得分:2)

为什么不禁用没有转弯的玩家JButton,然后在玩家轮到他并启用对手按钮时启用。

button.setEnabled(false);

假设你有两个不同的按钮

祝你好运!

答案 2 :(得分:2)

由于您正在编码Swing,因此不要执行while (true)循环,因为您将阻止事件线程EDT。相反,你应该使用Swing Timer,或者更有可能在你的情况下,因为我猜你正在玩回合制游戏(如果错误请纠正我),根据事件做出动作。使用后者,而不是交换ActionListeners,您只需通过单个字段更改程序状态,并根据此状态更改ActionListener的行为。

有关后者的示例,请参阅以下代码。程序的状态由playerIndex int变量保存:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class ToggleGame extends JPanel {
   public static final String[] PLAYERS = {"Player 1", "Player 2"};

   // turnIndex is either 0 or 1, depending on whose turn it is.
   private int turnIndex = 0; 
   private JButton turnButton = new JButton(PLAYERS[turnIndex]);

   public ToggleGame() {
      add(new JLabel("Turn:"));
      add(turnButton);
      setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));

      turnButton.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
            turnBtnAction(evt);
         }
      });
   }

   private void turnBtnAction(ActionEvent evt) {
      turnIndex++; // next player
      turnIndex %= PLAYERS.length; // mod 2
      turnButton.setText(PLAYERS[turnIndex]);

      doSomething(turnIndex);
   }

   private void doSomething(int index) {
      String msg = "It is now " + PLAYERS[index] + "'s turn!";
      String title = "Whose Turn Is It?";
      JOptionPane.showMessageDialog(this, msg , title, JOptionPane.INFORMATION_MESSAGE);
   }

   private static void createAndShowGui() {
      ToggleGame mainPanel = new ToggleGame();

      JFrame frame = new JFrame("ToggleGame");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

答案 3 :(得分:1)

  

当玩家点击一下时,玩家二被认为也已经点击了

这是因为您使用addActionListener。当您调用此方法时,它不会替换前一个方法。它只是为按钮点击添加了另一个监听器。单击它时,它将执行添加到按钮的所有侦听器。

您可以通过定义两个actionListeners来解决此问题:

ActionListener a1 = new ActionListener(){

    @Override
    public void actionPerformed(ActionEvent arg0) {
        doSomething();
        p1 = false;
        p2 = true;

    }   
};

ActionListener a2 = new ActionListener(){

    @Override
    public void actionPerformed(ActionEvent arg0) {
        doSomething();
        p2 = false;
        p1 = true;
   }
};


while(game){
    p1 = true;
    while(p1){
        enterMoveButton.removeActionListener(a2);
        enterMoveButton.addActionListener(a1);
    }
    while(p2){
        enterMoveButton.removeActionListener(a1);
        enterMoveButton.addActionListener(a2);
    }

答案 4 :(得分:1)

为什么不使用两个布尔变量,而只使用一个如:

boolean myturn = true; // at the start for Player 1 it's true.

@Override
public void actionPerformed(ActionEvent arg0) 
{
   if (myturn == true)
   {
      doSomething();  // Do whatever Player1 is suppose to do at his turn.
                      // Now since myturn will be false after this, so Player1
                      // won't be able to move till Player 2 takes his turn.
      myturn = false;
   }
   else if (myturn == false)
   {
      doThisInstead(); // Do whatever Player2 is suppose to do at his turn.
                       // Here again myturn will will change to true, now Player2
                       // won't be able to move till Player1 makes his next move.
      myturn = true;
   }
}

以下代码解释了我刚才所说的内容:

import javax.swing.*;
import java.awt.event.*;

public class ButtonTest extends JFrame implements ActionListener
{
  private JPanel panel;
  private JButton button;
  private JLabel label;
  private String player1 = "I am player one.";
  private String player2 = "I am player two.";
  private boolean myturn = true;

  public ButtonTest()
  {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    panel = new JPanel();
    button = new JButton(player1);
    label = new JLabel(player1);
    button.addActionListener(this);

    panel.add(label);
    panel.add(button);

    setContentPane(panel);
    pack();
  }

  public void actionPerformed(ActionEvent ae)
  {
     if (myturn == true)
    {
      button.setText(player2);
      label.setText(player2);
      myturn = false;
    }
    else if (myturn == false)
    {
      button.setText(player1);
      label.setText(player1);
      myturn = true;
    }
  }

  public static void main(String... args)
  {
    SwingUtilities.invokeLater(new Runnable()
    {
      public void run()
      {
        new ButtonTest().setVisible(true);
      }
    });
  }
}

单个变量可以帮助您,而不是使用两个不同的。

希望这可能在某种程度上有所帮助。 此致