前言
中秋佳节,是我国传统的重大节日之一。全国各地为了增强过节的气氛,都有许多传统的中秋活动,比如吃月饼、赏月、猜灯谜等等。其中,猜灯谜就是一项极具娱乐性的活动,它不仅可以增进亲友之间的感情,更重要的是,还可以挑战智商,让你的小脑袋飞速运转。
为了让大家更畅快愉快的重温这种乐趣,快马加鞭,赶在中秋节前,bug菌偷偷地把它制作出来了,接下来,快带上家人们一块来挑战,让我们拭目以待,看看最终第一花落谁家!到底谁能答出我所设置的所有谜面!
开搞开搞!!
玩过Java的同学都清楚,想靠纯Java实现一个可炫的可视化图形,对比前端语言来说那简直一个天一个地,但咱天生就不是会被困难折服的人,今个儿我就只用它来做一个可操作可视化的游戏。
准备工作
在开始制作游戏之前,我们需要准备一些材料:
- 谜语及其答案
- 提示
- GUI界面
这里我们已经准备好了10个中秋节相关的谜面和谜底,同时也有对应的提示。我们将在GUI界面中显示谜语和提示,并且让玩家输入答案并确认是否正确。在确认答案正确后,进入下一道谜语。
游戏的制作思路
游戏界面设计
用Java设计的游戏界面简洁明了,同时需要显示谜面、提示、输入框、按钮等组件。其中,输入框和按钮应该在同一个面板上,方便操作。
游戏逻辑设计
游戏逻辑应该包括以下几个部分:
- 进入游戏过渡
- 获取谜语、提示、答案等信息
- 显示谜语和提示信息
- 等待玩家输入答案
- 判断答案是否正确
- 统计得分和时间
- 进入下一题
游戏功能设计
游戏功能应该包括以下几个部分:
- 显示当前题目的谜面和提示
- 检查玩家输入的答案是否正确
- 显示得分和时间信息
- 进入谜底冲刺,可以随时重新开始游戏
- 提示挑战成功
游戏的制作步骤
1. 创建一个 Java 项目
首先我们要先创建一个Java项目。
2. 导入需要的 jar 包
- swing.jar
- awt.jar
3. 创建游戏窗口
其次我们需要创建一个 JFrame 类,并设置窗口的标题、大小、默认关闭操作和窗口位置等基本属性。然后,创建各种组件,如标签、文本框、按钮等,并将它们添加到主面板中。最后,显示第一道谜语。
java
//设置游戏名
setTitle("灯谜猜猜乐");
//设置游戏界面大小
setSize(900, 300);
//设置窗口关闭时的默认操作
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//让窗口居中显示
setLocationRelativeTo(null);
//创建输入框和按钮的面板
JPanel answerPanel = new JPanel(new GridLayout(1, 1));
4. 获取谜语、提示、答案等信息
我们可以将所有的谜语、提示和答案保存在三个 ArrayList 中,方便后续的使用。此外,我们还需要一个变量来保存当前显示的谜语的索引。
java
private JLabel riddleLabel; // 显示谜语的标签
private JLabel hintLabel; // 显示提示的标签
private JTextField answerField; // 输入答案的文本框
5. 显示谜语和提示信息
我们需要利用 JLabel 组件来显示谜语和提示信息。在显示谜语时,我们需要根据索引获取对应的谜语,然后将其显示在标签中。同样,我们也需要根据索引获取对应的提示信息,并将其显示在提示标签中。
java
currentRiddleIndex = (currentRiddleIndex + 1) % riddles.size();
riddleLabel.setText("谜面:" + riddles.get(currentRiddleIndex));
hintLabel.setText("提示:" + hints.get(currentRiddleIndex));
answerField.setText("");
guessButton.setEnabled(true);
6. 等待玩家输入答案
我们需要利用 JTextField 组件来获取玩家输入的答案。在输入答案之前,我们需要将文本框清空,避免影响玩家的输入。此外,我们还需要一个"猜"按钮,让玩家确认自己的答案。
java
answerField.setText("");
guessButton.setEnabled(true);
7. 判断答案是否正确
我们需要利用 JOptionPane 组件来显示玩家的答案是否正确。如果答案正确,我们需要更新玩家的得分,并计算玩家猜题的用时。最后,我们需要自动跳转到下一题。如果答案错误,我们需要禁用"猜"按钮,让玩家重新输入答案。
java
if (isCorrect) {
// 得分+1
score++;
JOptionPane.showMessageDialog(this, "回答正确!");
// 更新得分显示
scoreLabel.setText("玩家得分:" + score);
long elapsedTime = (System.currentTimeMillis() - startTime) / 1000;
timeLabel.setText("用时:" + elapsedTime + "秒");
//自动跳转下一题。
nextRiddle();
}
}
8. 统计得分和时间
我们需要利用 JLabel 组件来显示玩家的得分和用时。在每次玩家回答正确后,我们需要更新得分,并计算出玩家猜题的用时。
java
long elapsedTime = (System.currentTimeMillis() - startTime) / 1000;
timeLabel.setText("用时:" + elapsedTime + "秒");
9. 进入「下一题」
我们需要一个「下一题」按钮,让玩家进入下一题。在进入下一题之前,我们需要清空输入框,禁用"猜"按钮,以避免玩家重复提交答案。
java
nextRiddle();
10. 实现「重新游戏」
我们需要一个「 重新开始 」按钮,让玩家可以重新开始游戏。在重新开始游戏之前,我们需要重置所有变量,包括当前题目的索引、玩家的得分和用时等等。
java
private void resetGame() {}
11. 实现「开始游戏」
我们需要一个「开始游戏」按钮,让玩家在热身过后有个仪式感进入游戏进行大挑战!
java
startButton = new JButton("开始游戏");
最终效果
如下演示下如何把玩这个游戏吧!
进入游戏
启动游戏后,会提示玩家是否已热身准备好开启挑战之旅!
开始游戏
点击「开始游戏」按钮,会投放谜题并自动开始计时。猜谜要快哟,时间有限。
猜谜
在答题区输入你的谜底,示例如下:
然后点击【猜】按钮后,答对会提示你"回答正确",否则回答"回答错误!"
下一题
如果回答不出来,没关系,我也答不出来,咱们可以直接Pass!
挑战成功
如果十题全部答对!会提示你"挑战成功!"
想挑战的赶紧试试吧!看看你能答对几道?
完整代码
如下是实现「灯谜猜猜乐」小游戏的完整源码, 供同学们参考:
java
package com.example.javase.cy;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import java.util.List;
/**
* 「灯谜猜猜乐」小游戏
*
* @Author bug菌
* @Date 2023-09-12 22:02
*/
public class GuessTheRiddleGame extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
// 存储所有的谜语、提示、答案
private static final List<String> riddles = Arrays.asList(
"月上中秋分外明,愿你人在长安,心在天涯。",
"团圆之夜思乡心,曲院花枝笑春风。",
"清水流过秋千去,隔江犹唱后庭花。",
"小楼昨夜又东风,故国不堪回首月明中。",
"十五的月亮,照着我家门,门前有个小姐姐,正在弹琵琶。",
"桂花满城香,中秋佳气浓。",
"喜上眉梢,忧下心头。",
"良辰美景,应须好好珍惜。",
"家和万事兴,中秋快乐。",
"中秋之夜,团圆永恒。"
);
private static final List<String> hints = Arrays.asList(
"一句中秋佳节的祝福话。",
"一句形容中秋夜景的诗句。",
"一句形容中秋夜景的诗句。",
"一句表达思乡之情的句子。",
"一首古诗词的开头部分。",
"一句形容中秋桂花的诗句。",
"一句概括中秋节的话。",
"一句表达爱与忧的句子。",
"一句表达对美好时光的珍惜之情。",
"一句表达团聚重要性的话。"
);
private static final List<String> answers = Arrays.asList(
"中秋快乐",
"月上柳梢头,人约黄昏后",
"庭院深深,独自凝望",
"明月几时有,把酒问青天",
"静夜思",
"桂花",
"喜忧参半",
"好时光",
"家和万事兴",
"团圆永恒"
);
private JLabel riddleLabel; // 显示谜语的标签
private JLabel hintLabel; // 显示提示的标签
private JTextField answerField; // 输入答案的文本框
private JButton guessButton; // 确认答案的按钮
private JButton nextButton; // 进入下一题的按钮
private JButton resetButton; // 重置按钮
private JButton startButton; // 开始游戏按钮
private int currentRiddleIndex; // 当前显示的谜语的索引
private int score = 0; // 玩家得分
private JLabel scoreLabel; // 显示玩家得分的标签
private Timer timer; // 计时器
private JLabel timeLabel; // 显示用时的标签
private long startTime; // 计时器开始时间
private JLabel startLabel; // 显示游戏开始的标签
// 创建游戏窗口
public GuessTheRiddleGame() {
//设置游戏名
setTitle("灯谜猜猜乐");
//设置游戏界面大小
setSize(900, 300);
//设置窗口关闭时的默认操作
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//让窗口居中显示
setLocationRelativeTo(null);
//创建输入框和按钮的面板
JPanel answerPanel = new JPanel(new GridLayout(1, 1));
riddleLabel = new JLabel();
hintLabel = new JLabel();
startButton = new JButton("开始游戏");
// 添加按钮监听器
startButton.addActionListener(this);
answerField = new JTextField();
guessButton = new JButton("猜");
//添加按钮的监听器
guessButton.addActionListener(this);
//将输入框添加到面板中
answerPanel.add(answerField);
//创建下一题按钮的面板
JPanel nextPanel = new JPanel();
nextButton = new JButton("下一题");
//触发下一题
nextButton.addActionListener(this);
// 将如下按钮添加到同面板中
nextPanel.add(startButton);
nextPanel.add(guessButton);
nextPanel.add(nextButton);
// 创建startLabel并将其添加到主面板中
startLabel = new JLabel();
// 创建计时器标签
timeLabel = new JLabel("用时:0秒");
//玩家得分
scoreLabel = new JLabel("玩家得分:" + score);
JPanel mainPanel = new JPanel(new GridLayout(7, 1));
// 创建重置按钮面板
resetButton = new JButton("重新游戏");
//触发监听
resetButton.addActionListener(this);
nextPanel.add(resetButton);
mainPanel.add(riddleLabel);
mainPanel.add(hintLabel);
mainPanel.add(answerPanel);
mainPanel.add(nextPanel);
mainPanel.add(startLabel);
mainPanel.add(timeLabel);
mainPanel.add(scoreLabel);
//将面板添加到GUI容器中
getContentPane().add(mainPanel);
//初始化谜底序号
currentRiddleIndex = -1;
//出题
nextRiddle();
}
// 监听按钮事件
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == startButton) {
// 创建计时器,每1秒更新一次计时器标签
timer = new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 计算用时
long elapsedTime = (System.currentTimeMillis() - startTime) / 1000;
// 更新计时器标签
timeLabel.setText("用时:" + elapsedTime + "秒");
}
});
// 启动计时器
timer.start();
//提示开始计时
startLabel.setText("游戏已开始,计时中...");
startLabel.setForeground(Color.RED);
startLabel.setHorizontalAlignment(JLabel.CENTER);
//重置游戏
resetGame();
startButton.setEnabled(false);
} else if (e.getSource() == guessButton) {
checkAnswer();
} else if (e.getSource() == nextButton) {
nextRiddle();
} else if (e.getSource() == timer) {
long elapsedTime = (System.currentTimeMillis() - startTime) / 1000;
timeLabel.setText("用时:" + elapsedTime + "秒");
} else if (e.getSource() == resetButton) {
resetGame();
}
}
//重置游戏
private void resetGame() {
currentRiddleIndex = -1; // 激活"猜"按钮
guessButton.setEnabled(true);
score = 0;
scoreLabel.setText("玩家得分:" + score);
startTime = System.currentTimeMillis();
timeLabel.setText("用时:0秒");
// 禁用startButton
startButton.setEnabled(false);
// 启动下一题挑战
nextButton.setEnabled(true);
nextRiddle(); // 添加出题逻辑
}
// 显示下一道谜语
private void nextRiddle() {
if (timer == null || !timer.isRunning()) {
JOptionPane.showMessageDialog(this, "请先点击开始游戏按钮开始游戏!");
return;
}
currentRiddleIndex = (currentRiddleIndex + 1) % riddles.size();
riddleLabel.setText("谜面:" + riddles.get(currentRiddleIndex));
hintLabel.setText("提示:" + hints.get(currentRiddleIndex));
answerField.setText("");
guessButton.setEnabled(true);
startTime = System.currentTimeMillis();
if (timer != null) {
timer.stop();
}
timer = new Timer(1000, this);
//开始计时
timer.start();
}
// 检查答案是否正确
private void checkAnswer() {
// 获取用户输入的答案
String answer = answerField.getText().trim();
// 获取正确的答案
String correctAnswer = answers.get(currentRiddleIndex);
// 判断回答是否答对返回对应提示
boolean isCorrect = answer.equals(correctAnswer);
if (isCorrect) {
// 得分+1
score++;
if (score == 10) {
JOptionPane.showMessageDialog(this, "恭喜你!挑战成功!");
// 更新得分显示
scoreLabel.setText("玩家得分:" + score);
long elapsedTime = (System.currentTimeMillis() - startTime) / 1000;
timeLabel.setText("用时:" + elapsedTime + "秒");
//禁用
guessButton.setEnabled(false);
nextButton.setEnabled(false);
} else {
JOptionPane.showMessageDialog(this, "回答正确!");
// 更新得分显示
scoreLabel.setText("玩家得分:" + score);
long elapsedTime = (System.currentTimeMillis() - startTime) / 1000;
timeLabel.setText("用时:" + elapsedTime + "秒");
//自动跳转下一题。
nextRiddle();
}
} else {
JOptionPane.showMessageDialog(this, "回答错误!");
guessButton.setEnabled(false);
}
}
//游戏启动入口
public static void main(String[] args) {
GuessTheRiddleGame game = new GuessTheRiddleGame();
game.setVisible(true);
}
}
结束语 · 举杯邀月饮🥤
这个小游戏为大家演示了如何通过纯Java制作小游戏。在游戏制作过程中,我重点展示了如何利用 Swing 和 AWT 组件来创建界面、如何获取和显示谜语、提示和答案等信息、如何检查玩家输入的答案是否正确、如何统计得分和用时等等。希望通过这篇文章,同学们可以更好地掌握 Java 编程技能,并能开发出更多有趣的小玩意儿。
如果你觉得这个小游戏有点儿意思,点个赞,鼓励一下bug菌,哈哈。
最后,提前祝愿所有的读者朋友们,中秋国庆双节快乐!身体康健!最重要的是一起升职又加薪啦。
--End