猜数字游戏GUI版(GuessNumberGUI)
案例简介
猜数字游戏:让玩家在给定次数内猜测指定范围内的数字,若猜测的数字与游戏随机生成的数字相等,玩家获胜,询问玩家是否再玩一次。若再玩一次,重复以上过程,若不玩,游戏结束。若未猜中,游戏提示玩家猜测数字与游戏随机生成数字之间的大小关系,玩家继续猜测,直到猜中或猜测机会用完为止。GUI版的游戏可在Win10系统运行,其他系统尚未经过测试。
案例使用建议
- 讲解:通过讲解演示此案例的实现过程教授学生综合应用JAVA面向对象程序设计基础知识和技能。此使用方式需要教师将实现步骤与逻辑梳理清楚,并且能在讲解过程中突出涉及到的知识点与技能点,最好在讲解的最后对涉及的知识点与技能点进行总结归纳。建议采用此方式的过程中尽量多提案例相关知识点相关的问题,以便学生可以参与课堂,帮助学生回想相关知识点与技能点。
- 分析:通过讲解演示如何分析设计此案例的实现方案帮助学生学习如何设计程序。此使用方式需要教师提前梳理清楚开发人员分析设计程序的过程并将其设计为授课过程,在讲解过程中应循循善诱、多提问,引导学生自己思考设计出程序的实现方案。如,通过演示游戏并提出“大家觉得这个游戏具有哪些功能?”,帮助学生学会软件功能需求分析。
- 填补:通过删除部分代码让学生补全的方式考察学生对GUI编程、面向对象程序设计的掌握情况,同时给予学生练习GUI编程和面向对象程序设计的掌握情况。如果删除很少的代码,题型可以是程序阅读填空题。如果删除的代码为逻辑完整的整块代码,则可以考察学生对代码整体的理解和锻炼学生自主设计微型程序的能力。教师还可以通过添加注释的方式帮助学生完成任务。如:删除案例中 再玩一次 相关功能并添加注释说明后让学生完成。
- 扩展:通过布置扩展任务为学生提供练习GUI编程以及JAVA面向对象程序设计基础知识与技能的机会。如:添加代码使得游戏难度加大,使得玩家每次游戏猜测的数字范围是随机生成的,如:猜测50-150,或者49-149。
涉及知识点与技能点
- GUI编程基础知识与方法;
- Swing和AWT中的常用组件及其方法,如:JFrame、JLabel、JButton、ActionListener等;
- 继承;
- 构造方法;
- 类的实例化;
- 成员变量的作用域;
- 方法的调用;
- 面向事件编程基本方法;
- 事件以及事件监听器;
- 匿名内部类;
- 接口实现;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class GuessNumberGUI extends JFrame{
private JTextField txtGuess;
private JLabel lblOutput;
private JButton btnGuess;
private JButton btnPlayAgain;
private int theNumber;
private int numberOfGames;
public void checkGuess() {
String guessText = txtGuess.getText();
String message = "";
try {
int guess = Integer.parseInt(guessText);
if(guess < theNumber) {
message = guess + "太小了!再猜一次!还剩" + (numberOfGames-1) + "次机会!";
}else if( guess > theNumber) {
message = guess + "太大了!再猜一次!还剩" + (numberOfGames-1) + "次机会!";
}else {
message = guess + "就是那个数字!你猜对啦!让我们再玩儿一遍吧!";
btnPlayAgain.setVisible(true);
gameOver();
return;
}
numberOfGames--;
if (numberOfGames <= 0){
message = guess + "不对,没有机会了,正确答案是:" + theNumber;
btnPlayAgain.setVisible(true);
gameOver();
}
} catch (Exception e) {
message = "请输入1-100之间的整数!还剩" + numberOfGames + "次机会!";
} finally {
lblOutput.setText(message);
txtGuess.requestFocus();
txtGuess.selectAll();
}
}
public void newGame() {
theNumber = (int)(Math.random() * 100 + 1);
numberOfGames = 7; //第一次执行了一次初始化值为6
btnGuess.setEnabled(true);
txtGuess.setEnabled(true);
}
//游戏结束使猜测按钮和输入框不可选中
public void gameOver(){
btnGuess.setEnabled(false);
txtGuess.setEnabled(false);
}
public GuessNumberGUI() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("JAVA\u731C\u6570\u5B57");
getContentPane().setLayout(null);
JLabel lblNewLabel = new JLabel("JAVA\u731C\u6570\u5B57");
lblNewLabel.setFont(new Font("宋体", Font.BOLD, 15));
lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
lblNewLabel.setBounds(159, 27, 116, 18);
getContentPane().add(lblNewLabel);
JLabel lblNewLabel_1 = new JLabel("\u8BF7\u731C\u4E00\u4E2A1-100\u4E4B\u95F4\u7684\u6570\u5B57\uFF1A");
lblNewLabel_1.setHorizontalAlignment(SwingConstants.RIGHT);
lblNewLabel_1.setBounds(26, 72, 213, 15);
getContentPane().add(lblNewLabel_1);
txtGuess = new JTextField();
txtGuess.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
checkGuess();
}
});
txtGuess.setBounds(250, 69, 66, 21);
getContentPane().add(txtGuess);
txtGuess.setColumns(10);
btnGuess = new JButton("猜一下!");
btnGuess.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
checkGuess();
}
});
btnGuess.setBounds(170, 114, 93, 23);
getContentPane().add(btnGuess);
lblOutput = new JLabel("请在上面输入框中输入数字并点击猜一下!现在你有7次机会");
lblOutput.setHorizontalAlignment(SwingConstants.CENTER);
lblOutput.setBounds(50, 214, 350, 15);
getContentPane().add(lblOutput);
btnPlayAgain = new JButton("再玩一次!");
btnPlayAgain.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
newGame();
txtGuess.setText("");
lblOutput.setText("请在上面输入框中输入数字并点击猜一下!你有7次机会!");
btnPlayAgain.setVisible(false);
}
});
btnPlayAgain.setBounds(164, 164, 105, 23);
btnPlayAgain.setVisible(false);
getContentPane().add(btnPlayAgain);
}
public static void main(String args[]) {
GuessNumberGUI theGame = new GuessNumberGUI();
theGame.newGame();
theGame.setSize(new Dimension(450, 300));
theGame.setVisible(true);
}
}