想挑战你的智商?快来试试Java版灯谜猜猜乐!

前言

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

  为了让大家更畅快愉快的重温这种乐趣,快马加鞭,赶在中秋节前,bug菌偷偷地把它制作出来了,接下来,快带上家人们一块来挑战,让我们拭目以待,看看最终第一花落谁家!到底谁能答出我所设置的所有谜面!

开搞开搞!!

  玩过Java的同学都清楚,想靠纯Java实现一个可炫的可视化图形,对比前端语言来说那简直一个天一个地,但咱天生就不是会被困难折服的人,今个儿我就只用它来做一个可操作可视化的游戏。

准备工作

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

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

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

游戏的制作思路

游戏界面设计

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

image.png

游戏逻辑设计

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

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

游戏功能设计

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

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

游戏的制作步骤

1. 创建一个 Java 项目

首先我们要先创建一个Java项目。

2. 导入需要的 jar 包

  • swing.jar
  • awt.jar

3. 创建游戏窗口

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

//设置游戏名
setTitle("灯谜猜猜乐");
//设置游戏界面大小
setSize(900, 300);
//设置窗口关闭时的默认操作
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//让窗口居中显示
setLocationRelativeTo(null);//创建输入框和按钮的面板
JPanel answerPanel = new JPanel(new GridLayout(1, 1));

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

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

private JLabel riddleLabel;         // 显示谜语的标签
private JLabel hintLabel;           // 显示提示的标签
private JTextField answerField;     // 输入答案的文本框

5. 显示谜语和提示信息

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

currentRiddleIndex = (currentRiddleIndex + 1) % riddles.size();
riddleLabel.setText("谜面:" + riddles.get(currentRiddleIndex));
hintLabel.setText("提示:" + hints.get(currentRiddleIndex));
answerField.setText("");
guessButton.setEnabled(true);

6. 等待玩家输入答案

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

answerField.setText("");
guessButton.setEnabled(true);

7. 判断答案是否正确

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

if (isCorrect) {// 得分+1score++;JOptionPane.showMessageDialog(this, "回答正确!");// 更新得分显示scoreLabel.setText("玩家得分:" + score);long elapsedTime = (System.currentTimeMillis() - startTime) / 1000;timeLabel.setText("用时:" + elapsedTime + "秒");//自动跳转下一题。nextRiddle();}
}

8. 统计得分和时间

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

long elapsedTime = (System.currentTimeMillis() - startTime) / 1000;
timeLabel.setText("用时:" + elapsedTime + "秒");

9. 进入「下一题」

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

nextRiddle();

10. 实现「重新游戏」

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

private void resetGame() {}

11. 实现「开始游戏」

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

startButton = new JButton("开始游戏");

最终效果

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

进入游戏

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

在这里插入图片描述

开始游戏

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

在这里插入图片描述

猜谜

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

image.png

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

在这里插入图片描述

下一题

  如果回答不出来,没关系,我也答不出来,咱们可以直接Pass!

image.png

挑战成功

如果十题全部答对!会提示你“挑战成功!”
在这里插入图片描述

想挑战的赶紧试试吧!看看你能答对几道?

完整代码

如下是实现「灯谜猜猜乐」小游戏的完整源码, 供同学们参考:

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();}// 监听按钮事件@Overridepublic void actionPerformed(ActionEvent e) {if (e.getSource() == startButton) {// 创建计时器,每1秒更新一次计时器标签timer = new Timer(1000, new ActionListener() {@Overridepublic 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秒");// 禁用startButtonstartButton.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) {// 得分+1score++;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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/107907.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++数据结构AVL树

AVL树 &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容介绍数据结构中的avl树 文章目录 AVL树AVL树Ⅰ.avl树…

xxl-job2.1.2集成postgresql

admin模块改造 引入依赖 xxl-job-adminmodule中引入一下依赖 <!-- 引入数据源 与数据库 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.12</version></dependency><d…

数字藏品系统都有哪些功能?

数字藏品系统是用于管理和展示数字化文物、艺术品、历史资料和其他文化遗产的软件系统。这些系统通常具有以下一些功能&#xff1a; 数字资产管理&#xff1a;管理和组织数字化的文物、艺术品、档案和历史文献。这包括存储、索引和检索数字资产的能力。 多媒体支持&#xff1a…

[学习笔记]Node2Vec图神经网络论文精读

参考资料&#xff1a;https://www.bilibili.com/video/BV1BS4y1E7tf/?p12&spm_id_frompageDriver Node2vec简述 DeepWalk的缺点 用完全随机游走&#xff0c;训练节点嵌入向量&#xff0c;仅能反应相邻节点的社群相似信息&#xff0c;无法反映节点的功能角色相似信息。 …

【java】【SSM框架系列】【一】Spring

目录 一、简介 1.1 为什么学 1.2 学什么 1.3 怎么学 1.4 初识Spring 1.5 Spring发展史 1.6 Spring Framework系统架构图 1.7 Spring Framework学习线路 二、核心概念&#xff08;IoC/DI&#xff0c;IoC容器&#xff0c;Bean&#xff09; 2.1 概念 2.2 IoC入门案例 …

2.4.3 【MySQL】设置系统变量

2.4.3.1 通过启动选项设置 大部分的系统变量都可以通过启动服务器时传送启动选项的方式来进行设置。如何填写启动选项就是下面两种方式&#xff1a; 通过命令行添加启动选项。 在启动服务器程序时用这个命令&#xff1a; mysqld --default-storage-engineMyISAM --max-conn…

数据采集:数据挖掘的基础

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

vue3+emelenui实现前端分页功能—最简单

在一些后台管理系统或者博客管理系统中分页功能是很常见的一种服务&#xff0c;因为总不可能把很多数据放在一块&#xff0c;那样阅读起来很麻烦&#xff0c;所以需要分页。也是前后端中最为常见的一个功能 先看一下分页场景的模拟。 首先我们要去后端写点数据通过接口给前端&a…

vue中v-model应用于表单元素

v-model应用于表单元素 常见的表单元素都可以用v-model绑定关联→快速获取或设置 表单元素的值它会根据控件类型自动选取正确的方法来更新元素 常见的表单元素&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8&…

MySQL的用户管理

1、MySQL的用户管理 &#xff08;1&#xff09;创建用户 create user zhang3 identified by 123123;表示创建名称为zhang3的用户&#xff0c;密码设为123123。 &#xff08;2&#xff09;了解user表 1&#xff09;查看用户 select host,user,authentication_string,select…

【C++杂货铺】优先级队列的使用指南与模拟实现

文章目录 一、priority_queue的介绍二、priority_queue的使用2.1 数组中的第k个最大元素 三、priority_queue模拟实现3.1 仿函数3.2 成员变量3.3 成员函数3.3.1 构造函数3.3.2 AdjustDown3.3.3 push3.3.4 AdjustUp3.3.5 pop3.3.6 empty3.3.7 size 四、结语 一、priority_queue的…

蓝桥杯官网练习题(搭积木)

类似题目&#xff1a; https://blog.csdn.net/s44Sc21/article/details/132758982?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22132758982%22%2C%22source%22%3A%22s44Sc21%22%7Dhttps://blog.csdn.net/s44Sc21/article/deta…