2014-11-06 77 views
0

我正在写一个使用JFrame的二十一点程序,并尽量保持它尽可能简单。我的JButton,jbHit只需点击一下,但是每次点击都会覆盖PlayersHand和playerSide槽。我希望它能够进行多次点击(3次点击 - 因为这是在处理前两次后可以获得的最大卡数)选项它应该对它们进行计数,以便数组索引可以记录卡片图像。这是我迄今为止的ActionListener代码。恐怕我被卡住了。我应该使用int i ++的某种循环吗?给JButton鼠标点击的多个选项(二十一点游戏)

//Hit Button ActionListener 
    jbHit.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (playerValue < 21) { 
       //Draw a card 
       Card c = deck.drawCard(); 
       playersHand.add(c); 
       playerSide[2].setIcon(new ImageIcon(c.getFilename())); 
      } 
      //If playerValue > 21, bust 
      else if (playerValue > 21) { 
       //Toggle Buttons 
       jbDeal.setEnabled(true); 
       jbHit.setEnabled(false); 
       jbStand.setEnabled(false); 
       jbDoubleDown.setEnabled(false); 
       message = "You bust."; 
      } 
     } 
    }); 
+0

你可能真正需要的是某种模型(或两个模型),它可以保存关于当前状态,卡片数量和金额的所有信息,这一轮。你的按钮将与这些模型进行交互,并根据那里的反馈,通过监听器,改变那里的状态...... – MadProgrammer 2014-11-06 02:39:41

+0

@MadProgrammer你想得到那个幻想,你需要的是实现一个状态机,其中每个环境知道下一个操作。你可以使用状态模式来实现它。我最近设计了一个使用状态模式的向导来实现这一点。然而,OP希望尽可能简单。 – hfontanez 2014-11-06 03:00:39

+0

@hfontanez只是另一种类型的模型;) – MadProgrammer 2014-11-06 03:02:39

回答

1

您可以创建一个“动作命令”数组,每次单击该按钮时,动作命令将切换到下一个动作命令。如果到达最后,请将索引设置回零。也许是这样的:

public static void main(String[] args) 
{ 
    JFrame frame = new JFrame(); 
    JPanel panel = new JPanel(); 
    JButton button = new JButton("Action"); 
    String[] commands = {"command1", "command2", "command3"}; 

    button.setActionCommand(commands[0]); 
    button.addActionListener(new ActionListener() 
    { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      JButton btn = (JButton)e.getSource(); 

      String cmd = btn.getActionCommand(); 
      System.out.println("Command: " + cmd); 

      if(cmd.equals("command1")) 
      { 
       btn.setActionCommand(commands[1]); 
       System.out.println("Command 1 was pressed"); 
      } 
      else if(cmd.equals("command2")) 
      { 
       btn.setActionCommand(commands[2]); 
       System.out.println("Command 2 was pressed"); 
      } 
      else if(cmd.equals("command3")) 
      { 
       btn.setActionCommand(commands[0]); 
       System.out.println("Command 3 was pressed"); 
      } 
      else 
       System.out.println("Something went wrong!"); 
     } 
    }); 
    panel.add(button); 

    frame.add(panel); 
    frame.setSize(200, 200); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
} 

如果您使用的是Java 7或更高版本,可以用switch语句替换if/else。

+0

这是为我工作的人!谢谢 – itsgoodtobeRich 2014-11-06 23:11:23

+0

不客气。很高兴我能帮上忙。 – hfontanez 2014-11-06 23:16:42

0

我相信你正在寻找基于整数的逻辑标志,例如:

if(cardsDealt < 3) { 
    // DoThings(); 
} else { 
    return; 
} 

这就需要你做

cardsDealt++; 

在底部你按钮点击处理。

如果这不是你要求的,请重新解释这个问题。

+0

好吧,我今天在电子课之后回到它,我会尝试所有这些,看看哪个最好。感谢每个人的时间和帮助。 – itsgoodtobeRich 2014-11-06 17:22:34

0

这听起来像你可能会对jbHit如何被调用有点困惑。意识到每次单击鼠标时它将被称为一次完整时间。它并不是天生就知道它是第二次或第三次点击。添加一个类成员,如int clickCount;你在jbHit内部的适当位置递增。然后,您可以根据clickCount的值更改方法的响应。

+0

我通过创建一个字符串(动作命令)数组并显示了一个“穷人”的状态机实现,并且在每个按钮单击的位置,动作命令切换到下一个。所以,它可以做到。 – hfontanez 2014-11-06 03:06:15

+0

我不是故意暗示它不能完成,只是为了帮助OP了解我认为可能会阻碍的一种误解。另外,我喜欢你的状态机! – TubaBen 2014-11-06 03:13:28