为了庆祝双节,我用Java开发了一款「猜灯谜」游戏!超难的!哭辽😭

前言

中秋佳节,是一个美好而有意义的节日。为了增强人们的过节气氛,各地都有许多传统的中秋活动,比如吃月饼、赏月、猜灯谜等等。其中,猜灯谜是一项极具娱乐性的活动,它可以增进亲友之间的感情,更重要的是,还可以挑战智商,让你的小脑袋飞速运转。

为了让大家更畅快愉快地玩,趁热打铁,赶在中秋前,我偷偷地制作了一款可视化猜灯谜游戏,咱们一起玩吧!快带上家人们一块来挑战,让我们拭目以待,看看最终胜利花落谁家!

开搞开搞!!

准备工作

在开始制作游戏之前,我们需要准备一些材料:

  • 谜语及其答案
  • 提示
  • GUI界面

这里我们已经准备好了10个中秋节相关的谜语和答案,同时也有对应的提示。我们将在GUI界面中显示谜语和提示,并且让玩家输入答案并确认是否正确。在确认答案正确后,进入下一道谜语。

游戏的制作思路

游戏界面设计

游戏界面应该简洁明了,同时需要显示谜面、提示、输入框、按钮等组件。其中,输入框和按钮应该在同一个面板上,方便操作。

游戏逻辑设计

游戏逻辑应该包括以下几个部分:

  • 进入游戏过渡
  • 获取谜语、提示、答案等信息
  • 显示谜语和提示信息
  • 等待玩家输入答案
  • 判断答案是否正确
  • 统计得分和时间
  • 进入下一题

游戏功能设计

游戏功能应该包括以下几个部分:

  • 显示当前题目的谜面和提示
  • 检查玩家输入的答案是否正确
  • 显示得分和时间信息
  • 进入谜底冲刺,可以随时重新开始游戏
  • 提示挑战成功

游戏的制作步骤

1. 创建一个 Java 项目

2. 导入需要的 jar 包

  • swing.jar
  • awt.jar

3. 创建游戏窗口

首先,我们需要创建一个 JFrame 类,并设置窗口的标题、大小、默认关闭操作和窗口位置等基本属性。然后,创建各种组件,如标签、文本框、按钮等,并将它们添加到主面板中。最后,显示第一道谜语。

4. 获取谜语、提示、答案等信息

我们可以将所有的谜语、提示和答案保存在三个 ArrayList 中,方便后续的使用。此外,我们还需要一个变量来保存当前显示的谜语的索引。

5. 显示谜语和提示信息

我们需要利用 JLabel 组件来显示谜语和提示信息。在显示谜语时,我们需要根据索引获取对应的谜语,然后将其显示在标签中。同样,我们也需要根据索引获取对应的提示信息,并将其显示在提示标签中。

6. 等待玩家输入答案

我们需要利用 JTextField 组件来获取玩家输入的答案。在输入答案之前,我们需要将文本框清空,避免影响玩家的输入。此外,我们还需要一个"猜"按钮,让玩家确认自己的答案。

7. 判断答案是否正确

我们需要利用 JOptionPane 组件来显示玩家的答案是否正确。如果答案正确,我们需要更新玩家的得分,并计算玩家猜题的用时。最后,我们需要自动跳转到下一题。如果答案错误,我们需要禁用"猜"按钮,让玩家重新输入答案。

8. 统计得分和时间

我们需要利用 JLabel 组件来显示玩家的得分和用时。在每次玩家回答正确后,我们需要更新得分,并计算出玩家猜题的用时。

9. 进入「下一题」

我们需要一个「下一题」按钮,让玩家进入下一题。在进入下一题之前,我们需要清空输入框,禁用"猜"按钮,以避免玩家重复提交答案。

10. 实现「重新游戏」

我们需要一个「 重新开始 」按钮,让玩家可以重新开始游戏。在重新开始游戏之前,我们需要重置所有变量,包括当前题目的索引、玩家的得分和用时等等。

11. 实现「开始游戏」

我们需要一个「开始游戏」按钮,让玩家在热身过后有个仪式感进入游戏进行大挑战!

最终效果

如下演示下如何把玩这个游戏吧!

进入游戏

启动游戏后,会提示玩家是否已热身准备好开启挑战之旅!

开始游戏

点击「开始游戏」按钮,会投放谜题并自动开始计时。猜谜要快哟,时间有限。

猜谜

在答题区输入你的谜底,示例如下:

然后点击【猜】按钮后,答对会提示你"回答正确",否则回答"回答错误!"

下一题

如果回答不出来,没关系,我也答不出来,咱们可以直接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菌,哈哈。

最后,提前祝愿所有的读者们,中秋国庆双节快乐!身体康健。

相关推荐
寻月隐君6 分钟前
Rust 泛型 Trait:关联类型与泛型参数的核心区别
后端·rust·github
泥泞开出花朵7 分钟前
LRU缓存淘汰算法的详细介绍与具体实现
java·数据结构·后端·算法·缓存
子洋14 分钟前
快速目录跳转工具 zoxide 使用指南
前端·后端·shell
ankleless26 分钟前
C语言(02)——标准库函数大全(持续更新)
c语言·开发语言·算法·标准库函数·零基础自学
七七软件开发36 分钟前
团购商城 app 系统架构分析
java·python·小程序·eclipse·系统架构·php
补三补四41 分钟前
Shapley与SHAP
大数据·人工智能·算法·机器学习·数据分析
七七软件开发42 分钟前
打车小程序 app 系统架构分析
java·python·小程序·系统架构·交友
_祝你今天愉快1 小时前
Java-JVM探析
android·java·jvm
用户5965906181341 小时前
在C# web api net core 开发中,对于Get 和 Post 的传值方式进行系统性的介绍
后端