Java hangman game with gui, problems with incrementing/decrementing numbers(带有 gui 的 Java 刽子手游戏,增加/减少数字的问题)
问题描述
以下部分代码不起作用,因为每个单词的赢/输计数不断增加超过 1,有时我会收到字符串长度的空指针异常.此外,虽然玩家应该得到 7 次尝试(int no),但有时他会得到更多,有时会更少.字符串取自文本文件Hangeng.txt".整个游戏在按键监听器内的键盘按键监听器内.欢迎任何有关如何安排游戏布局以避免错误的提示,因为我才刚刚开始使用 swing 和 gui 的东西.
The following part of the code doesn't work, as the won/lost count keeps incrementing by more than 1 for each word, and sometimes I get a nullpointerexception with the string length. Moreover, although the player is supposed to get 7 tries(int no), sometimes he gets more, sometimes less. The Strings are taken from a text file "Hangeng.txt". The whole game is inside a keyboard keytyped listener that is inside a button listener. Any tips on how the layout of the game should generally be arranged so as to avoid errors are welcome, as I am only beginning to work with swing and gui stuff.
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;
}
}
});
}
});
}
}
推荐答案
所有评论+1....
+1 to all comments....
添加到他们:
不要使用
KeyListener
使用KeyAdapter
但是当您使用 Swing 而不是 AWT 时,您应该为 Swing 使用KeyBinding
例如,请参见此处.
Do not use
KeyListener
use aKeyAdapter
however as you are using Swing and not AWT you should useKeyBinding
s for Swing see here for example.
不要忘记通过 SwingUtiltities.invokeLater(..)
块在 Event Dispatch Thread
上创建和操作 Swing 组件,请参阅 这里了解更多信息.
Dont forget to create and manipulate Swing components on Event Dispatch Thread
via SwingUtiltities.invokeLater(..)
block see here for more.
检查它们应该以大写字母开头的类命名方案,即 test
应该是 Test
并且之后的每个新单词都应该大写.
Check class naming schemes they shuld start with capital letter, i.e test
should be Test
and every new word after that should be capitalized.
不要在 JFrame
上调用 setSize
而是使用适当的 LayoutManager
和/或覆盖 getPreferredSize()
JPanel
并返回适合其内容的大小,并在添加所有组件后在 JFrame
实例上调用 pack()
.
Do not call setSize
on JFrame
rather use appropriate LayoutManager
and/or override getPreferredSize()
of JPanel
and return a size which fits its content and call pack()
on JFrame
instance after adding all components.
另外,SSCCE 应该可以通过复制和粘贴来编译,这不是.... 即需要变量要改成final,我没有Hangeng.txt的样本所以无法测试
Also SSCCE should be compilable from copy and paste this is not.... i.e variables needed to be changed to final and I dont have a sample of Hangeng.txt so cant test
最后使用@Override注解来确保你覆盖了正确的方法,即
Lastly use the @Override annotation to ensure you are overriding the correct methods, i.e
@Override
public void actionPerformed(ActionEvent e) {
}
这篇关于带有 gui 的 Java 刽子手游戏,增加/减少数字的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:带有 gui 的 Java 刽子手游戏,增加/减少数字的问题
- java.lang.IllegalStateException:Bean 名称“类别"的 BindingResult 和普通目标对象都不能用作请求属性 2022-01-01
- 将 Java Swing 桌面应用程序国际化的最佳实践是什么? 2022-01-01
- 未找到/usr/local/lib 中的库 2022-01-01
- 如何指定 CORS 的响应标头? 2022-01-01
- 转换 ldap 日期 2022-01-01
- 如何使 JFrame 背景和 JPanel 透明且仅显示图像 2022-01-01
- 在 Java 中,如何将 String 转换为 char 或将 char 转换 2022-01-01
- GC_FOR_ALLOC 是否更“严重"?在调查内存使用情况时? 2022-01-01
- 获取数字的最后一位 2022-01-01
- Eclipse 的最佳 XML 编辑器 2022-01-01