2014-11-06 80 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