2016-11-04 115 views
-1

我需要爲我的初學Java類完成這個西蒙遊戲。基本上,遊戲需要隨機選擇頂部標籤「R」,「B」,「Y」或「G」上的3個顏色字母來開始玩遊戲。玩家將按照這個順序按下顏色,如果他們是正確的,如果他們錯了,他們會失去另一個字母/顏色。我已經設置了遊戲的主要部分,包括顏色等......我遇到的困難是打印底部標籤上推送的按鈕的字母,並獲得頂部標籤隨機3開始。當按鈕被按下時,我可以讓遊戲在頂部的標籤上打印隨機字母,但是它不會自己開啓並且不會添加字母?JAVA西蒙遊戲

這裏是我的代碼:

//10/30/16 
package simongame1; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.FlowLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import java.security.SecureRandom; 

public class SimonGame1 extends JFrame implements ActionListener 
{ 
    public SecureRandom rand; 
    public String randomLetters=""; 
    JButton[] numberButtons = new JButton[4]; 
    JPanel numberButtonPanel = new JPanel(); 
    JLabel labelTop; 
    JLabel labelBottom; 
    String messageTop = ""; 
    String messageBottom = ""; 
    JButton red; 
    JButton green; 
    JButton yellow; 
    JButton blue; 
    public final String letters= "RGBY"; 
    public JLabel labelDisplay; 


//constructor? 
    public SimonGame1() 
    { 


     super("Simon Game!"); 
       labelDisplay = new JLabel (""); 
     setLayout(new BorderLayout()); 
     red = new JButton(); 
       green = new JButton(); 
       blue = new JButton(); 
       yellow = new JButton(); 
     labelTop = new JLabel(""); 
       //getRandomLetter(); 
     labelBottom = new JLabel(""); 
       //System.out.print (randomLetters); 
       rand = new SecureRandom(); 


     numberButtons = new JButton[4]; 
     numberButtonPanel = new JPanel(); 
     numberButtonPanel.setLayout(new GridLayout(3,3)); 


     for(int i = 0; i < 0; i++) 
     { 
        numberButtons[i] = new JButton(); 
        numberButtonPanel.add(numberButtons[i]); 
        numberButtons[i].addActionListener(this); 
     } 
     numberButtonPanel.add(red); 
     red.setBackground(Color.red); 
     red.addActionListener(this); 

       numberButtonPanel.add(blue); 
       blue.setBackground(Color.blue); 
       blue.addActionListener(this); 

       numberButtonPanel.add(yellow); 
       yellow.setBackground (Color.yellow); 
       yellow.addActionListener(this); 

       numberButtonPanel.add (green); 
       green.setBackground (Color.green); 
       green.addActionListener(this); 

     add(labelTop, BorderLayout.NORTH); 
     add(labelBottom, BorderLayout.SOUTH); 

     add(numberButtonPanel, BorderLayout.CENTER); 


       //if (messageTop = messageBottom) 


} 
// TODO code application logic here 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
       rand = new SecureRandom(); 

       randomLetters+= getRandomLetter(); 
       labelTop.setText (randomLetters); 
       labelBottom.setText (letters); 

       System.out.println(e.getID()); 
     if(e.getSource() == red) 
     { 
        System.out.println("R"); 
     } 
       else if (e.getSource()==blue) 
       { 
        System.out.println ("B"); 
       } 
       else if (e.getSource()==yellow) 
       { 
        System.out.println ("Y"); 
       } 
       else if (e.getSource()==green) 
       { 
        System.out.println ("G"); 
       } 

     } 


     public char getRandomLetter() 
     { 

      char randChar = letters.charAt(rand.nextInt (4)); 
      return randChar; 
     } 
} 

這裏是測試

package simongame1; 
import javax.swing.JFrame; 
public class NewClass { 
    public static void main(String[] args) { 
     { 
     SimonGame1 simpleFrame = new SimonGame1(); 
     simpleFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     simpleFrame.setSize(300, 300); 
     simpleFrame.setVisible(true); 
     } 

    } 
} 

這是爲什麼點擊背後?如果我點擊紅色按鈕,它doenst顯示任何東西,但如果我點擊藍色一個紅色的多數民衆贊成後,當它打印「R」終於......

labelBottom.setText (messageBottom); 
      **//WHY IS IT ONE LETTER BEHIND?** 
      System.out.println(e.getID()); 
    if(e.getSource() == red) 
    { 
       messageBottom += "R"; 
       //System.out.println("R"); 
    } 
      else if (e.getSource()==blue) 
      { 
       messageBottom += "B"; 
       //System.out.println ("B"); 
      } 
      else if (e.getSource()==yellow) 
      { 
       messageBottom += "Y"; 
       //System.out.println ("Y"); 
      } 
      else if (e.getSource()==green) 
      { 
       messageBottom += "G"; 
       //System.out.println ("G"); 
      } 
+4

提示:你希望我們花時間幫助你。所以你請儘可能簡單地做到這一點;對於初學者來說,花幾分鐘時間來正確格式化/縮進源代碼;而不是非常難以閱讀的混亂在我們身上!然後我讀了你的描述3次,我還是不明白你真正的問題在哪裏。試着用非常簡單的句子,甚至可以簡要描述你想要看到的序列...以及哪些地方不起作用。 – GhostCat

+0

初始化標籤時,在將其添加到面板之前,我只需生成帶有所需字母的標籤,並將標籤的文本設置在那裏。這樣當你添加它時,你肯定會有那裏的角色。現在,只有在調用actionPerformed方法時才設置labelTop的文本,只有在按下按鈕時纔會調用該方法。 – Orin

+0

@ Brittni77沒問題!很久以前,當我開始學習編程時,請繼續。編程需要很多激情和動力來保持對它的興趣,但在我看來完全值得。 – Orin

回答

0

當你初始化你的標籤,你將它添加到前面板我只會用你需要的字母生成標籤,並在那裏設置標籤的文本。這樣當你添加它時,你肯定會有那裏的角色。現在,只有在調用actionPerformed方法時才設置labelTop的文本,只有在按下按鈕時纔會調用該方法。

所以它應該是這個樣子:

public SimonGame1() { 
    //.... 

    rand = new SecureRandom(); 
    labelTop = new JLabel(""); 

    //initialize with 3 
    for(int i = 0; i < 3; i++) 
    { 
     randomLetters += getRandomLetter(); 
    } 
    labelTop.setText(randomLetters); 

    //... 

    add(labelTop, BorderLayout.NORTH); 

} 

也這段代碼是不是,因爲在所有的條件永遠都無法滿足使用,因爲你初始化我爲0,那麼只要它是不太說除0:

for(int i = 0; i < 0; i++) 
{ 
     numberButtons[i] = new JButton(); 
     numberButtonPanel.add(numberButtons[i]); 
     numberButtons[i].addActionListener(this); 
} 

編輯:

因爲你添加的問題的另一部分,你問爲什麼它加入你只是點擊角色之前等待一個迭代在你的actionPerformed方法中,這是因爲你在將下一個字符添加到字符串之前設置了文本。所以你的actionPerformed方法應該看起來像:

public void actionPerformed(ActionEvent e) 
{ 

    if(e.getSource() == red) 
    { 
      messageBottom += "R"; 
      //System.out.println("R"); 
    } 
    else if (e.getSource()==blue) 
    { 
     messageBottom += "B"; 
     //System.out.println ("B"); 
    } 
    else if (e.getSource()==yellow) 
    { 
     messageBottom += "Y"; 
     //System.out.println ("Y"); 
    } 
    else if (e.getSource()==green) 
    { 
     messageBottom += "G"; 
     //System.out.println ("G"); 
    } 

    labelBottom.setText (messageBottom); 
} 
+1

太棒了......你花時間看看!我盯着它的意志,但無法想象它。那就是那個愚蠢的事情,當一個人太急於想要達到每日上限時需要獲得另一個upvote時......那麼有時候會有一些盲目的情緒。 – GhostCat

+1

@GhostCat哈哈我聽到你的聲音。有時候你需要休息一下:) – Orin

+0

好的。它已經9點在這裏,真的時間停止聲譽的工作;-) – GhostCat