2016-11-04 3 views
-1

Мне нужно закончить эту игру simon для моего начинающего класса Java. В принципе, игра должна рандомизировать 3 буквы COLOR на верхней метке «R», «B», «Y» или «G», чтобы начать играть в игру. Игрок будет нажимать цвета в этой последовательности, и если они верны, он добавит другую букву/цвет, если они ошибаются, они проиграют. У меня есть основная часть игры, включая цветной и т. Д. То, что у меня с трудом, - это печатать буквы кнопок, расположенных на нижней этикетке, а также получать верхнюю метку для рандомизации 3 для начала. Я могу заставить игру печатать случайные буквы на верхней метке, когда кнопка нажата, но она не сделает это самостоятельно, чтобы начать, и она не добавит буквы?JAVA Simon Game

Вот мой код:

//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

Когда вы инициализируете свой ярлык, перед тем как добавить его на панель, я бы просто сгенерировал метку с нужными буквами и установил текст ярлыка прямо там. Таким образом, когда вы его добавите, у вас наверняка будут персонажи. Прямо сейчас вы устанавливаете только текст меткиTop, когда вызывается метод actionPerformed, который вызывается только при нажатии кнопки. – Orin

+0

@ Brittni77 Нет проблем! Не так давно, когда я начал изучать программирование, так продолжайте. Программирование требует много страсти и стремления оставаться в этом заинтересованы, но, на мой взгляд, стоит того. – Orin

ответ

0

При инициализации этикетку, прежде чем добавить его к Я бы просто сгенерировал метку с нужными буквами и установил текст ярлыка прямо там. Таким образом, когда вы его добавите, у вас наверняка будут персонажи. Прямо сейчас вы устанавливаете только текст меткиTop, когда вызывается метод actionPerformed, который вызывается только при нажатии кнопки.

Так это должно выглядеть примерно так:

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); 
} 

EDIT:

, так как вы добавили еще часть вопроса, вы спросили, почему он ждет итерации, прежде чем добавить символ, который вы просто щелкнули в вашем методе 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

Отлично ... вы нашли время, чтобы изучить это! Я смотрел на него за волю, но не мог этого понять. Thats глупое дело, когда кто-то слишком хочет получить, что другая upvote, необходимая для того, чтобы поражать ограничение ежедневной кепки ... тогда иногда случается ослепление. – GhostCat

+1

@GhostCat haha ​​Я тебя слышу. Иногда небольшой перерыв - это все, что вам нужно :) – Orin

+0

Да, хорошо. Его 9 вечера здесь уже, действительно время перестать работать над репутацией ;-) – GhostCat