2013-12-10 53 views
0

我在教自己Java,我想用GUI創建一個岩石,紙張,剪刀遊戲。我用掃描儀創建了一個基於文本的版本,但我有很多工作要做。在java swing中創建岩石,紙張,剪刀遊戲的建議

import javax.swing.JFrame; 
import javax.swing.JPanel; 

import javax.swing.JRadioButton; 
import javax.swing.ButtonGroup; 

public class RPS extends JFrame { 

    JRadioButton rock, paper, scissors; 
    ButtonGroup choices; 

    public static void main(String[] args) { 
    new RPS(); 
    } 
    public RPS() { 
    super("Rock, Paper, Scissors"); 

    setSize(400,300); 
    setResizable(true); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 

    JPanel p=new JPanel(); 

    rock = new JRadioButton("Rock"); 
    paper = new JRadioButton("Paper"); 
    scissors = new JRadioButton("Scissors"); 

    choices = new ButtonGroup(); 
    choices.add(rock); 
    choices.add(paper); 
    choices.add(scissors); 

    p.add(rock); 
    p.add(paper); 
    p.add(scissors); 

    add(p); 

    setVisible(true); 
    } 
} 

這是我的代碼。我已經創建了一個窗口並顯示3個單選按鈕,只允許選擇一個選項。從這裏,我想實現下一個按鈕,並創建邏輯來根據這兩種選擇生成答案。我相信我需要一個卡布局,但Oracle文檔不能幫助我。我也不知道如何去執行邏輯。任何幫助表示讚賞,對於長篇帖子感到抱歉。 再次感謝!

對不起,我沒有說清楚,我想設計一個人輪流轉動,按下按鈕,然後第二個人輪流轉動,按下結束並獲得結果。我會把這個提交給我的八年級班。

+0

你可以在[這裏](http://stackoverflow.com/questions/20214198/determining-the-winner-in-a-rock-使用邏輯從答案紙剪刀遊戲/ 20214415#20214415) – Adarsh

+0

這取決於很多。雖然我讚揚你想要使用'CardLayout',並會鼓勵你去玩,可能不是必需的。你可以有一個「匹配」窗格(例如),它在同一個窗口中列出了計算機的選擇和遊戲的結果。例如,可以使用「GridLayout」進行設置,左側的「用戶」選項和右側的「遊戲」,每次用戶單擊單選按鈕時,都可以自動觸發遊戲並顯示結果例如,「遊戲」面板。但無論如何,請試試;) – MadProgrammer

+0

你有沒有簽出[如何使用CardLayout](http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html)? – MadProgrammer

回答

2

這裏很容易實現CardLayout到你的程序中。此佈局的目的是分層組件。在你的情況下,你需要爲每個玩家提供一個面板。所以你需要兩個面板。

  1. 的JPanel供玩家1(與自己的三個單選按鈕)
  2. 的JPanel供玩家2(與自己的三個單選按鈕)

上面兩個是什麼包括Card(layered)Layout(你會疊加一個在

  1. 另一個的上面。你需要一個標籤來顯示贏家
  2. 你需要一個JPanel持有下一步按鈕

所以都在一起,你的佈局應該是這樣的

Wrapped in JPanel(new BoderLayout()) 
------------------------------------- 
|  label to show status  | BorderLayout.NORTH 
------------------------------------- 
|         | 
|  CardLayout holding   | 
|  two JPanels with RBs  | BorderLayout.CENTER 
|___________________________________| 
|(JPanel) Next JButton   | BorderLayout.SOUTH 
------------------------------------- 

當您單擊下一步按鈕,你可以調用CardLayoutnext()方法來顯示下一個面板

private CardLayout cardLayout = new CardLayout(10, 10); // hgap and vgap args 
private JPanel cardPanel = new JPanel(cardLayout); 

JPanel panel1 = new JPanel(); // holds first player 
JPanel panel2 = new JPanel(); // holds second player 

cardPanel.add(panel1); 
cardPanel.add(panel2); 

nextButton.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
     cardLayout.next(cardPanel); 
    } 
}); 

有關其他移動方法,請參見CardLayout docs

對於邏輯部分

  1. 正如我前面所說,你應該有六個單選按鈕(三層爲每個玩家)
  2. 在你的邏輯,你可以檢查哪些是入圍
  3. ,你可能希望checkWinner JButton執行該操作。

JRadioButton p1Scissors = new JRadioButton("Scissors"); 
JRadioButton p1Paper = new JRadioButton("Paper"); 
JRadioButton p1Rock = new JRadioButton("Rock"); 
// group them 

JRadioButton p2Scissors = new JRadioButton("Scissors"); 
JRadioButton p2Paper = new JRadioButton("Paper"); 
JRadioButton p2Rock = new JRadioButton("Rock"); 
// group them 

JLabel statusLabel = new JLabel(" "); 

JButton checkWinner = new JButton("Check Winner"); // You can add to bottom panel 

checkWinner.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
     if (p1Scissors.isSelected() && p2Rock.isSelected()){ 
      statusLabel.setText("Player 2 wins: Rock beats Scissors"); 
     } else if (.....) { 
      ... 
     } 

     ... 
    } 
}); 
+1

非常感謝你的合法答案,這正是我一直在尋找的! – ZeroConnor

+0

太好了,希望能爲你解決。祝你在學習過程中好運! –