所以我在做一个猜数字的游戏。计算机生成一个随机数,用户输入一个猜测,然后计算机让用户知道他们是否赢了,或者猜测是否小于或大于随机数。这将一直持续到他们得到它的权利,或再次按下播放(重置)。
我想计算并显示用户每轮的猜测次数。所以每次猜测我都会增加“tallyvalue”。我知道这是正确的计算和增加值。但是,例如,如果用户在一行中猜测两次小于随机数的值,那么tally值不会在.settext输出上更新。它只会在用户从小于随机数到大于随机数的交替猜测中更新。
我错过了什么?我试着删除然后设置文本,但我不明白为什么会发生这种情况。
MyFrame() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //exit out of app
this.setLayout(new FlowLayout());
//add labels, buttons and input fields
button = new JButton("Submit");
button.addActionListener(this); //can just pass in this because we already pass actionlistener above
JLabel instruction = new JLabel();
instruction.setText("Input Your Guess (must be between 1 and 100");
textField = new JTextField();
textField.setPreferredSize(new Dimension(250,40));
tally = new JLabel();
tally.setText("Number of guesses: " + tallyValue);
outputMessage = new JLabel();
outputMessage.setText("Take a guess!");
playAgainButton = new JButton("Play Again");
playAgainButton.addActionListener(this);
this.add(instruction);
this.add(textField);
this.add(button);
this.add(playAgainButton);
this.add(outputMessage);
this.add(tally);
this.setTitle("Number Guessing Game");
this.setVisible(true); //make frame visible
this.pack(); //frame size adjusts to components
ImageIcon icon = new ImageIcon("res/game-icon.png"); //creates an image icon
this.setIconImage(icon.getImage());//changes icon of frame
System.out.println(randomNumber); //for testing purposes
}
//add any unimplemented methods because we are using an interface
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==button) {
int textFieldValue;
this.remove(outputMessage);
try {
textFieldValue = Integer.parseInt(textField.getText());
//if guess is correct
if(textFieldValue == randomNumber) {
outputMessage.setText("Congratulations you guessed correctly!");
this.add(outputMessage);
tallyValue++;
displayCount(tallyValue);
this.pack();
textFieldValue = 0; //reset text field val
}
//if guess is less than randomNumber
if(textFieldValue < randomNumber) {
outputMessage.setText("Incorrect - the number I am thinking of is more than that");
this.add(outputMessage);
tallyValue++;
displayCount(tallyValue);
this.pack();
textFieldValue = 0; //reset text field val
}
//if guess is more than randomNumber
if(textFieldValue > randomNumber) {
outputMessage.setText("Incorrect - the number I am thinking of is less than that");
this.add(outputMessage);
tallyValue++;
System.out.println(tallyValue);
displayCount(tallyValue);
this.pack();
textFieldValue = 0; //reset text field val
}
}
catch (NumberFormatException ex){
outputMessage.setText("You must insert a valid number");
this.add(outputMessage);
this.pack();
}
}
if(e.getSource()==playAgainButton) {
System.out.println("pa");
this.remove(outputMessage);
randomNumber = rand.nextInt(101);
outputMessage.setText("Take a guess!");
this.add(outputMessage);
tallyValue = 0;
displayCount(tallyValue);
this.pack();
}
}
private void displayCount (int tv) {
this.remove(tally);
tally.setText("Number of guesses:" + tv);
this.add(tally);
this.pack();
}
1条答案
按热度按时间qyyhg6bp1#
它只会在用户从小于随机数到大于随机数的交替猜测中更新。
不需要在3个不同的地方增加计数。计数应该在integer.parseint(…)语句之后立即递增。也就是说,无论猜测是什么,每次猜测都会更新。
然后用新计数更新计数标签的文本。无需从框架中移除/添加标签。无需 Package 框架。仅设置文本将导致标签重新绘制。因此不需要displaycount()方法。
您还应该学习如何正确使用布局管理器。当前使用的flowlayout只会导致组件显示在一行中,然后换行到下一行。这不是一个非常有效的布局,因为如果调整框架的大小,所有组件都会移动。
阅读有关布局管理器的swing教程。可以使用不同的布局管理器嵌套面板,以实现更灵活的布局。
不要用幻数来表示组件的大小。相反,请正确使用api,以便文本字段可以确定自己的首选大小:
“10”将允许文本字段在滚动文本前显示10个“w”字符。
此外,您不应该对按钮使用共享的actionlistener。
一种方法是使用lamba来分离功能:
然后创建一个私有方法
playAgain()
在你们班上。现在代码按函数分为多个方法。