1

コードの次の部分は、単語ごとに勝敗数が 1 を超えて増加し続け、文字列の長さで nullpointerexception が発生することがあるため、機能しません。さらに、プレイヤーは 7 回の試行を行うことになっていますが (整数ではありません)、それ以上の回数を取得することもあれば、それよりも少ない回数を取得することもあります。文字列は、テキスト ファイル「Hangeng.txt」から取得されます。ゲーム全体は、ボタン リスナー内にあるキーボード キータイプ リスナー内にあります。Swing と GUI の作業を始めたばかりなので、エラーを回避するためにゲームのレイアウトを一般的にどのように配置するかについてのヒントを歓迎します。

        public class test{
static int won = 0;
static int lost = 0;
static String key = "";
static String word = null;
static int no = 0;
static StringBuffer toguess;

      public static void main(String[] args) throws IOException{

 JFrame frame = new JFrame();
  frame.setLayout(new GridLayout(3,1));
      JPanel panel1 = new JPanel();
     JPanel panel2 = new JPanel();
      JPanel panel3 = new JPanel();
         JButton button = new JButton();
           JLabel label = new JLabel();
           JLabel label2 = new JLabel();
            panel1.add(label);
              panel2.add(button);
                  panel3.add(label2);
                    frame.setSize(800,600);
                   frame.add(panel1);
                          frame.add(panel2);
                      frame.add(panel3);
                     frame.setVisible(true);

 //the button that starts the game or gets a new word
 button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            frame.requestFocus();

                no = 0;

                label2.setText("won " + won + ", lost " + lost);
                button.setText("Next");


                                    //get random word from file
                BufferedReader reader = null;
                try {
                    reader = new BufferedReader(new FileReader(
                            "hangeng.txt"));
                } catch (FileNotFoundException e1) {
                    e1.printStackTrace();
                }
                int lineno = (int) (Math.random() * 100);
                for (int i = 0; i < lineno; i++) {
                    try {
                        reader.readLine();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                }

                try {
                    word = reader.readLine().replace(" ", "");
                } catch (IOException e1) {
                    e1.printStackTrace();
                }




                String missing = "";
                for (int u = 0; u < (word.length() - 2); u++) {
                    missing = missing + "*";
                }
                final String guess = word.charAt(0) + missing
                        + word.charAt((word.length() - 1));
                toguess = new StringBuffer(guess);
                label.setText(toguess.toString());
                final ArrayList<String> tried = new ArrayList<String>();



            //keylistener that listens to key clicks by the user

         frame.addKeyListener(new KeyListener() {
                    public void keyPressed(KeyEvent arg0) {
                    }

                    public void keyReleased(KeyEvent arg0) {
                    }

                    public void keyTyped(KeyEvent arg0) {
                        key = "" + arg0.getKeyChar();
                        String guessing = null;
                        boolean k = false;

                        if ((no < 6)) {
                            guessing = key;
                            System.out.println(guessing);
                            if (!(tried.contains(guessing))) {
                                tried.add(guessing);
                                for (int length = 1; length < (guess
                                        .length() - 1); length++) {
                                    if (guessing.equals(String.valueOf(word.charAt(length)))) {
                                        toguess.replace(length,
                                                (length + 1),
                                                String.valueOf(word.charAt(length)));
                                        k = true;
                                    }
                                }
                                if (k == true) {
                                    label.setText(toguess.toString());
                                } else {
                                    no = no + 1;
                                }
                                k = false;
                            }
                            label.setText(toguess.toString());
                            if (toguess.toString().equals(word)) {
                                label.setText("Correct! The word was "  + word);
                                no = 6;
                                won = won + 1;
                            }
                        }
                        else if ((no == 6)
                                && (!(toguess.toString().equals(word)))) {
                            label.setText("Sorry, but the word was " + word);

                            lost = lost + 1;
                        }
                    }
                });
            }

    }); 

          }
   }
4

1 に答える 1

3

+1 すべてのコメントに....

それらに追加:

  • AWT ではなく Swing をKeyListener使用しているため、 use aは使用しないでください。Swing には s を使用する必要があります。たとえば、こちらを参照してください。KeyAdapterKeyBinding

  • Event Dispatch ThreadviaSwingUtiltities.invokeLater(..)ブロックで Swing コンポーネントを作成して操作することを忘れないでください。詳細については、こちらを参照してください。

  • 大文字で始まるtest必要があるクラスの命名スキームを確認してくださいTest

  • setSizeon を呼び出すのでJFrameはなく、適切なLayoutManagerおよび/またはオーバーライドgetPreferredSize()を使用JPanelして、コンテンツに適合するサイズを返し、すべてのコンポーネントを追加した後pack()にインスタンスを呼び出します。JFrame

  • また、SSCCEはコピー アンド ペーストからコンパイル可能である必要がありますが、これはそうではありません.... つまり、変数を final に変更する必要があり、Hangeng.txt のサンプルがないため、テストできません。

  • 最後に @Override アノテーションを使用して、正しいメソッドをオーバーライドしていることを確認します。

    @Override
    public void actionPerformed(ActionEvent e) {
    
    }
    
于 2012-12-23T16:36:51.413 に答える