与gui的Java刽子手游戏,增加/减少数字的问题

代码的以下部分不起作用,因为对于每个单词,获胜/丢失计数持续增加超过1,并且有时我得到具有字符串长度的nullpointerexception。 此外,虽然玩家应该获得7次尝试(int no),但有时他会获得更多,有时更少。 字符串取自文本文件“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 tried = new ArrayList(); //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; } } }); } }); } } 

+1对所有评论….

添加到他们:

  • 不要使用KeyListener使用KeyAdapter但是因为你使用的是Swing而不是AWT,你应该使用KeyBinding来进行Swing,例如。

  • 不要忘记通过SwingUtiltities.invokeLater(..)块在Event Dispatch Thread上创建和操作Swing组件,请参阅此处了解更多信息。

  • 检查他们用大写字母开头的类命名方案,即test应该是Test ,之后的每个新单词都应该大写。

  • 不要在JFrame上调用setSize而是使用适当的LayoutManager和/或覆盖JPanel getPreferredSize()并返回适合其内容的大小,并在添加所有组件后调用JFrame实例上的pack()

  • SSCCE也应该可以从复制和粘贴中编译,这不是….即变量需要改为最终,我没有样本的Hangeng.txt所以不能测试

  • 最后使用@Override注释来确保覆盖正确的方法,即

     @Override public void actionPerformed(ActionEvent e) { }