1.设计方案
为了实现一个猜数字的小游戏,需要生成一个随机数字作为答案,然后玩家猜出一个数字,根据此数字和答案的比较给出提示以确保游戏进行下去直到完毕。使用图形化界面来展示小游戏。
2.实现过程
(1)GUI
定义变量
private int randomNumber;
private int attempts;
private long startTime;
private JLabel promptLabel1,promptLabel2;
private JTextField guessTextField;
private JButton guessButton;
private JTextArea resultTextArea;
设置变量信息
setTitle("猜数游戏");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(350, 250);
setLayout(new FlowLayout());
promptLabel1 = new JLabel("这个数在1-100之间:");
guessTextField = new JTextField(10);
guessButton = new JButton("就它了");
resultTextArea = new JTextArea(8, 25);
resultTextArea.setEditable(false);
添加到窗口
add(promptLabel1);
add(guessTextField);
add(guessButton);
add(new JScrollPane(resultTextArea)); //滑动滚轮
setVisible(true);
(2)代码核心(猜字按钮)
为按钮设置一个动态监听器,实现猜字的核心部分
guessButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int guess = Integer.parseInt(guessTextField.getText());
attempts++;
if (guess == randomNumber) {
long endTime = System.currentTimeMillis();
double elapsedTime = (endTime - startTime) / 1000.0;
resultTextArea.append("恭喜你,猜对了!\n");
resultTextArea.append(String.format("用时 %.2f 秒,你猜了 %d 次。\n", elapsedTime, attempts));
saveResultToFile(elapsedTime, attempts);
guessButton.setEnabled(false);
}
else if (guess < randomNumber) {
resultTextArea.append("猜小了,请继续猜。\n");
}
else {
resultTextArea.append("猜大了,请继续猜。\n");
}
guessTextField.setText("");
}
});
(3)生成随机数
private int getRandomNumber() {
return (int) (Math.random() * 100) + 1;
}
(4)把成绩写入文件中
private void saveResultToFile(double elapsedTime, int attempts) {
String fileName = "game_results.txt"; // 文件名
String result = String.format("用时: %.2f seconds, 次数: %d%n", elapsedTime, attempts); // 要保存的结果
try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName, true))) {
writer.write(result);
System.out.println("结果保存在文件: " + fileName + "中");
} catch (IOException e) {
System.out.println("保存失败: " + e.getMessage());
}
}
(5)运行结果
3.期望
实现一个排行榜,需要玩家输入名字,然后把成绩由高到低排列,在GUI中可查询排行榜。
完成情况
private void startGame(String playerName) {
// 将玩家成绩添加到排行榜中
PlayerResult result = new PlayerResult(playerName, elapsedTime, attempts);
leaderboard.add(result);
Collections.sort(leaderboard); // 按完成时间排序,由小到大
}
private void showLeaderboard() {
// 显示排行榜
resultTextArea.setText(""); // 清空文本区域
for (int i = 0; i < leaderboard.size(); i++) {
PlayerResult result = leaderboard.get(i);
String leaderboardEntry = "Rank " + (i + 1) + ": " + result.getPlayerName() + " - Time: " + result.getTime() + " seconds, Attempts: " + result.getAttempts() + "\n";
resultTextArea.append(leaderboardEntry);
}
}