2015-12-30 1 views
-5

Я делаю игру для палача для школы, и я столкнулся с проблемой, которую я просто не могу решить, может быть, я переусердствую, может быть, нет. В любом случае, мне нужно, чтобы пользователь вводил письмо, и если это письмо находится в слове, используемом для игры (пикачу. Я знаю, глупый выбор, но это довольно простой и простой, поэтому я использовал это), тогда письмо открывается, проблема в том, что после ввода буквы пользователь не может угадать больше букв. Мне нужен способ прокрутить буквенный ввод и показать, чтобы я мог играть в игру.Looping letter input

Прошу прощения, если решение настолько простое, но я просто не могу понять, что нужно изменить в моем коде, чтобы исправить мою проблему, потому что я очень новичок в java.

import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.awt.*; 
import java.awt.event.KeyListener; 
import javax.swing.*; 

public class PanDisp extends JPanel { 

    JLabel lblOutput; 
    JLabel lblGuess; 
    JButton btnUpdateLabel; 
    Image imgPkmn; 
    FraImg fraImg; 
    String sSecret; 

    public PanDisp() {//Constructor 
     KeyInput keyInput = new KeyInput(); 
     KeyInput.LabelChangeListener labelChange = keyInput.new LabelChangeListener(); 
     sSecret = "*******"; 
     lblGuess = new JLabel("Type will go here"); 
     lblOutput = new JLabel(sSecret); 
     btnUpdateLabel = new JButton("Enter"); 
     add(lblOutput); 
     add(btnUpdateLabel); 
     addKeyListener(new KeyInput()); 
     setFocusable(true); 
     btnUpdateLabel.addActionListener(labelChange); 
     fraImg = new FraImg(imgPkmn); 
    } 

    public void GameOver() { 

    } 

    class KeyInput implements KeyListener { 

     String sInput; 
     String sWord = "pikachu"; 
     String sSecret = "*******"; 
     char chInput; 

     @Override 
     public void keyTyped(KeyEvent e) { 

     } 

     @Override 
     public void keyPressed(KeyEvent e) { 
      chInput = (char) e.getKeyChar(); 
      sInput = String.valueOf(chInput); 
      lblOutput.setText(sInput); 
     } 

     @Override 
     public void keyReleased(KeyEvent e) { 

     } 

     class LabelChangeListener implements ActionListener { 

      char cWord; 
      int nCorrect, nIncorrect, nNum; 

      public void actionPerformed(ActionEvent event) { 
       if (sWord.contains(sInput)) { 
        for (int i = 0; i < sWord.length(); i++) { 
         sSecret.replace(sSecret.charAt(i), sWord.charAt(i)); 
        } 
        nCorrect += 1; 
       } 
       else { 
        nIncorrect += 1; 
        if (nIncorrect == 7) { 
         GameOver(); 
        } 
       } 
      } 
     } 
    } 
} 
+0

Можете ли вы быть более конкретным, что вы думаете, что не так? Вы разместили здесь много кода – bhooks

+0

@bhooks В принципе, я хочу, чтобы все в классе «KeyInput» зацикливалось, чтобы пользователь мог вводить несколько раз, но я не могу понять, где я могу поместить цикл. Когда я пытаюсь, я получаю несколько ошибок и не могу понять, как их избежать. Как я уже сказал, я новичок в java, поэтому я не хочу разрушать свой код, делая то, что я не понимаю. – User9123

+0

Ваша проблема в том, что ваше мышление выключено и должно быть изменено. Не думайте «петля», а на самом деле выходите из уравнения. Вы программируете в среде программирования, управляемой событиями, и цикл, о котором вы думаете, принадлежит к линейной среде программирования консоли.Вместо этого подумайте «состояние объекта» и «поведенческие изменения в состояниях изменений», и вы будете двигаться гораздо дальше в этом задании. Поэтому измените состояние своего класса - количество догадок, количество правильных догадок, а затем измените ответ на вход пользователя на основе этого состояния. –

ответ

2

Ваша проблема в том, что ваше мышление выключено и его необходимо изменить. Не думайте «петля», а на самом деле выходите из уравнения. Вы программируете в среде программирования, управляемой событиями, и цикл, о котором вы думаете, принадлежит к линейной среде программирования консоли. Вместо этого подумайте «состояние объекта» и «поведенческие изменения в состояниях изменений», и вы будете двигаться гораздо дальше в этом задании. Так измените состояние своего класса - количество догадок, количество правильных догадок, а затем измените ответ на вход пользователя на основе этого состояния.

Например, если вы хотите создать консольную программу, которая позволила бы пользователю чтобы ввести 5 строк, а затем отобразить эти строки для пользователя, это будет довольно прямолинейно, поскольку вы создадите массив String, а затем используйте цикл for, чтобы пригласить пользователя 5 раз ввести текст, захватив каждый введите String в цикле. Здесь «петли», как тот, который вы запрашиваете.

Линейная консоль Программа

import java.util.Scanner; 

public class Enter5Numbers1 { 
    public static void main(String[] args) { 
     Scanner scanner = new Scanner(System.in); 
     System.out.println("Please enter 5 sentences:"); 
     String[] sentences = new String[5]; 
     for (int i = 0; i < sentences.length; i++) { 
      System.out.printf("Enter sentence #%d: ", (i + 1)); 
      sentences[i] = scanner.nextLine(); 
     } 

     System.out.println("You entered the following sentences:"); 
     for (String sentence : sentences) { 
      System.out.println(sentence); 
     } 
     scanner.close(); 
    } 
} 


Если с другой стороны, вы хотите создать графический интерфейс, который сделал что-то подобное, что побудило пользователя на 5 строк и принял эти строки в массив , вы не могли бы использовать один и тот же тип цикла. Вместо этого вам нужно будет дать вашему классу счетчик строк String, возможно, названный enterSentenceCount, и в ActionListener (или Action) JButton, который является чем-то очень похожим), вы должны принять введенную строку (возможно, набрав JTextField с именем entryField) только если значение введенногоСентента меньше 5, меньше максимального количества разрешенных строк. Разумеется, вы должны увеличивать значение введенной переменной SentenceCount каждый раз, когда вводится String. И эта комбинация увеличения переменной счетчика и проверки ее значения должна будет основываться на концепции «петли». Итак, здесь «состояние» класса удерживается в файле введенного значения, и поведенческое изменение, которое мы хотим, это изменить то, что делает действие кнопки в зависимости от значения введенного значения - если оно меньше 5, принять строку, и если она равна или больше 5, отобразите введенные строки.

Event Driven GUI Программа

import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 

import javax.swing.*; 

public class Enter5Numbers2 extends JPanel { 
    private static final int MAX_SENTENCE_COUNT = 5; // number of Strings to enter 
    private static final String PROMPT_TEMPLATE = "Please enter sentence number %d:"; 
    private String[] sentences = new String[MAX_SENTENCE_COUNT]; // array to hold entered Strings 
    private int enteredSentenceCount = 0; // count of number of Strings entered 
    private JTextField entryField = new JTextField(20); // field to accept text input frm user. 
    // JLabel to display prompts to user: 
    private JLabel promptLabel = new JLabel(String.format(PROMPT_TEMPLATE, (enteredSentenceCount + 1))); 

    public Enter5Numbers2() { 
     // create GUI 
     // First create Action/ActionListener for button 
     EntryAction entryAction = new EntryAction("Enter"); 
     JButton entryButton = new JButton(entryAction); // pass it into the button 
     entryField.setAction(entryAction); // but give it also to JTextField so that the enter key will trigger it 

     // JPanel to accept user data entry 
     JPanel entryPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); 
     entryPanel.add(entryField); 
     entryPanel.add(entryButton); 

     // allow main JPanel to display prompt 
     setBorder(BorderFactory.createTitledBorder("Please Enter 5 Sentences")); 
     setLayout(new GridLayout(2, 1)); 

     add(promptLabel); 
     add(entryPanel); 
    } 

    // Action class, similar to an ActionListener 
    private class EntryAction extends AbstractAction { 
     public EntryAction(String name) { 
      super(name); 
      putValue(MNEMONIC_KEY, (int) name.charAt(0)); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      // check that we haven't entered more than the max number of sentences 
      if (enteredSentenceCount < MAX_SENTENCE_COUNT) { 
       // if OK, get the entered text 
       String sentence = entryField.getText(); 
       // put it in our array 
       sentences[enteredSentenceCount] = sentence; 
       entryField.setText(""); // clear the text field 
       entryField.requestFocusInWindow(); // set the cursor back into the textfield 
       enteredSentenceCount++; // increment our entered sentence count variable 
       promptLabel.setText(String.format(PROMPT_TEMPLATE, (enteredSentenceCount + 1))); // change prompt 
      } 

      // if the number of sentences added equals the number we want, display it 
      if (enteredSentenceCount == MAX_SENTENCE_COUNT) { 
       JTextArea textArea = new JTextArea(6, 30); 
       for (String sentence : sentences) { 
        textArea.append(sentence + "\n"); 
       } 
       JScrollPane scrollPane = new JScrollPane(textArea); 
       JOptionPane.showMessageDialog(Enter5Numbers2.this, scrollPane, "Five Sentences Entered", 
         JOptionPane.PLAIN_MESSAGE); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      JFrame frame = new JFrame("Enter 5 Numbers"); 
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
      frame.add(new Enter5Numbers2()); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     }); 
    } 
} 
+1

(Я желаю вам) с новым годом :-) – mKorbel

+1

@mKorbel: спасибо, и то же самое с вами и вашим! –