基于Java制作一個燈謎猜猜樂游戲
前言
中秋佳節(jié),是我國傳統(tǒng)的重大節(jié)日之一。全國各地為了增強(qiáng)過節(jié)的氣氛,都有許多傳統(tǒng)的中秋活動,比如吃月餅、賞月、猜燈謎等等。其中,猜燈謎就是一項極具娛樂性的活動,它不僅可以增進(jìn)親友之間的感情,更重要的是,還可以挑戰(zhàn)智商,讓你的小腦袋飛速運轉(zhuǎn)。
為了讓大家更暢快愉快的重溫這種樂趣,快馬加鞭,趕在中秋節(jié)前,bug菌偷偷地把它制作出來了,接下來,快帶上家人們一塊來挑戰(zhàn),讓我們拭目以待,看看最終第一花落誰家!到底誰能答出我所設(shè)置的所有謎面!
開搞開搞
玩過Java的同學(xué)都清楚,想靠純Java實現(xiàn)一個可炫的可視化圖形,對比前端語言來說那簡直一個天一個地,但咱天生就不是會被困難折服的人,今個兒我就只用它來做一個可操作可視化的游戲。
準(zhǔn)備工作
在開始制作游戲之前,我們需要準(zhǔn)備一些材料:
- 謎語及其答案
- 提示
- GUI界面
這里我們已經(jīng)準(zhǔn)備好了10個中秋節(jié)相關(guān)的謎面和謎底,同時也有對應(yīng)的提示。我們將在GUI界面中顯示謎語和提示,并且讓玩家輸入答案并確認(rèn)是否正確。在確認(rèn)答案正確后,進(jìn)入下一道謎語。
游戲的制作思路
游戲界面設(shè)計
用Java設(shè)計的游戲界面簡潔明了,同時需要顯示謎面、提示、輸入框、按鈕等組件。其中,輸入框和按鈕應(yīng)該在同一個面板上,方便操作。

游戲邏輯設(shè)計
游戲邏輯應(yīng)該包括以下幾個部分:
- 進(jìn)入游戲過渡
- 獲取謎語、提示、答案等信息
- 顯示謎語和提示信息
- 等待玩家輸入答案
- 判斷答案是否正確
- 統(tǒng)計得分和時間
- 進(jìn)入下一題
游戲功能設(shè)計
游戲功能應(yīng)該包括以下幾個部分:
- 顯示當(dāng)前題目的謎面和提示
- 檢查玩家輸入的答案是否正確
- 顯示得分和時間信息
- 進(jìn)入謎底沖刺,可以隨時重新開始游戲
- 提示挑戰(zhàn)成功
游戲的制作步驟
1. 創(chuàng)建一個 Java 項目
首先我們要先創(chuàng)建一個Java項目。
2. 導(dǎo)入需要的 jar 包
- swing.jar
- awt.jar
3. 創(chuàng)建游戲窗口
其次我們需要創(chuàng)建一個 JFrame 類,并設(shè)置窗口的標(biāo)題、大小、默認(rèn)關(guān)閉操作和窗口位置等基本屬性。然后,創(chuàng)建各種組件,如標(biāo)簽、文本框、按鈕等,并將它們添加到主面板中。最后,顯示第一道謎語。
//設(shè)置游戲名
setTitle("燈謎猜猜樂");
//設(shè)置游戲界面大小
setSize(900, 300);
//設(shè)置窗口關(guān)閉時的默認(rèn)操作
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//讓窗口居中顯示
setLocationRelativeTo(null);
//創(chuàng)建輸入框和按鈕的面板
JPanel answerPanel = new JPanel(new GridLayout(1, 1));4. 獲取謎語、提示、答案等信息
我們可以將所有的謎語、提示和答案保存在三個 ArrayList 中,方便后續(xù)的使用。此外,我們還需要一個變量來保存當(dāng)前顯示的謎語的索引。
private JLabel riddleLabel; // 顯示謎語的標(biāo)簽 private JLabel hintLabel; // 顯示提示的標(biāo)簽 private JTextField answerField; // 輸入答案的文本框
5. 顯示謎語和提示信息
我們需要利用 JLabel 組件來顯示謎語和提示信息。在顯示謎語時,我們需要根據(jù)索引獲取對應(yīng)的謎語,然后將其顯示在標(biāo)簽中。同樣,我們也需要根據(jù)索引獲取對應(yīng)的提示信息,并將其顯示在提示標(biāo)簽中。
currentRiddleIndex = (currentRiddleIndex + 1) % riddles.size();
riddleLabel.setText("謎面:" + riddles.get(currentRiddleIndex));
hintLabel.setText("提示:" + hints.get(currentRiddleIndex));
answerField.setText("");
guessButton.setEnabled(true);6. 等待玩家輸入答案
我們需要利用 JTextField 組件來獲取玩家輸入的答案。在輸入答案之前,我們需要將文本框清空,避免影響玩家的輸入。此外,我們還需要一個“猜”按鈕,讓玩家確認(rèn)自己的答案。
answerField.setText("");
guessButton.setEnabled(true);7. 判斷答案是否正確
我們需要利用 JOptionPane 組件來顯示玩家的答案是否正確。如果答案正確,我們需要更新玩家的得分,并計算玩家猜題的用時。最后,我們需要自動跳轉(zhuǎn)到下一題。如果答案錯誤,我們需要禁用“猜”按鈕,讓玩家重新輸入答案。
if (isCorrect) {
// 得分+1
score++;
JOptionPane.showMessageDialog(this, "回答正確!");
// 更新得分顯示
scoreLabel.setText("玩家得分:" + score);
long elapsedTime = (System.currentTimeMillis() - startTime) / 1000;
timeLabel.setText("用時:" + elapsedTime + "秒");
//自動跳轉(zhuǎn)下一題。
nextRiddle();
}
}8. 統(tǒng)計得分和時間
我們需要利用 JLabel 組件來顯示玩家的得分和用時。在每次玩家回答正確后,我們需要更新得分,并計算出玩家猜題的用時。
long elapsedTime = (System.currentTimeMillis() - startTime) / 1000;
timeLabel.setText("用時:" + elapsedTime + "秒");9. 進(jìn)入「下一題」
我們需要一個「下一題」按鈕,讓玩家進(jìn)入下一題。在進(jìn)入下一題之前,我們需要清空輸入框,禁用“猜”按鈕,以避免玩家重復(fù)提交答案。
nextRiddle();
10. 實現(xiàn)「重新游戲」
我們需要一個「 重新開始 」按鈕,讓玩家可以重新開始游戲。在重新開始游戲之前,我們需要重置所有變量,包括當(dāng)前題目的索引、玩家的得分和用時等等。
private void resetGame() {}11. 實現(xiàn)「開始游戲」
我們需要一個「開始游戲」按鈕,讓玩家在熱身過后有個儀式感進(jìn)入游戲進(jìn)行大挑戰(zhàn)!
startButton = new JButton("開始游戲");最終效果
如下演示下如何把玩這個游戲吧!
進(jìn)入游戲
啟動游戲后,會提示玩家是否已熱身準(zhǔn)備好開啟挑戰(zhàn)之旅!

開始游戲
點擊「開始游戲」按鈕,會投放謎題并自動開始計時。猜謎要快喲,時間有限。

猜謎
在答題區(qū)輸入你的謎底,示例如下:

然后點擊【猜】按鈕后,答對會提示你“回答正確”,否則回答“回答錯誤!”

下一題
如果回答不出來,沒關(guān)系,我也答不出來,咱們可以直接Pass!

挑戰(zhàn)成功
如果十題全部答對!會提示你“挑戰(zhàn)成功!”

想挑戰(zhàn)的趕緊試試吧!看看你能答對幾道?
完整代碼
如下是實現(xiàn)「燈謎猜猜樂」小游戲的完整源碼, 供同學(xué)們參考:
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(
"月上中秋分外明,愿你人在長安,心在天涯。",
"團(tuán)圓之夜思鄉(xiāng)心,曲院花枝笑春風(fēng)。",
"清水流過秋千去,隔江猶唱后庭花。",
"小樓昨夜又東風(fēng),故國不堪回首月明中。",
"十五的月亮,照著我家門,門前有個小姐姐,正在彈琵琶。",
"桂花滿城香,中秋佳氣濃。",
"喜上眉梢,憂下心頭。",
"良辰美景,應(yīng)須好好珍惜。",
"家和萬事興,中秋快樂。",
"中秋之夜,團(tuán)圓永恒。"
);
private static final List<String> hints = Arrays.asList(
"一句中秋佳節(jié)的祝福話。",
"一句形容中秋夜景的詩句。",
"一句形容中秋夜景的詩句。",
"一句表達(dá)思鄉(xiāng)之情的句子。",
"一首古詩詞的開頭部分。",
"一句形容中秋桂花的詩句。",
"一句概括中秋節(jié)的話。",
"一句表達(dá)愛與憂的句子。",
"一句表達(dá)對美好時光的珍惜之情。",
"一句表達(dá)團(tuán)聚重要性的話。"
);
private static final List<String> answers = Arrays.asList(
"中秋快樂",
"月上柳梢頭,人約黃昏后",
"庭院深深,獨自凝望",
"明月幾時有,把酒問青天",
"靜夜思",
"桂花",
"喜憂參半",
"好時光",
"家和萬事興",
"團(tuán)圓永恒"
);
private JLabel riddleLabel; // 顯示謎語的標(biāo)簽
private JLabel hintLabel; // 顯示提示的標(biāo)簽
private JTextField answerField; // 輸入答案的文本框
private JButton guessButton; // 確認(rèn)答案的按鈕
private JButton nextButton; // 進(jìn)入下一題的按鈕
private JButton resetButton; // 重置按鈕
private JButton startButton; // 開始游戲按鈕
private int currentRiddleIndex; // 當(dāng)前顯示的謎語的索引
private int score = 0; // 玩家得分
private JLabel scoreLabel; // 顯示玩家得分的標(biāo)簽
private Timer timer; // 計時器
private JLabel timeLabel; // 顯示用時的標(biāo)簽
private long startTime; // 計時器開始時間
private JLabel startLabel; // 顯示游戲開始的標(biāo)簽
// 創(chuàng)建游戲窗口
public GuessTheRiddleGame() {
//設(shè)置游戲名
setTitle("燈謎猜猜樂");
//設(shè)置游戲界面大小
setSize(900, 300);
//設(shè)置窗口關(guān)閉時的默認(rèn)操作
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//讓窗口居中顯示
setLocationRelativeTo(null);
//創(chuàng)建輸入框和按鈕的面板
JPanel answerPanel = new JPanel(new GridLayout(1, 1));
riddleLabel = new JLabel();
hintLabel = new JLabel();
startButton = new JButton("開始游戲");
// 添加按鈕監(jiān)聽器
startButton.addActionListener(this);
answerField = new JTextField();
guessButton = new JButton("猜");
//添加按鈕的監(jiān)聽器
guessButton.addActionListener(this);
//將輸入框添加到面板中
answerPanel.add(answerField);
//創(chuàng)建下一題按鈕的面板
JPanel nextPanel = new JPanel();
nextButton = new JButton("下一題");
//觸發(fā)下一題
nextButton.addActionListener(this);
// 將如下按鈕添加到同面板中
nextPanel.add(startButton);
nextPanel.add(guessButton);
nextPanel.add(nextButton);
// 創(chuàng)建startLabel并將其添加到主面板中
startLabel = new JLabel();
// 創(chuàng)建計時器標(biāo)簽
timeLabel = new JLabel("用時:0秒");
//玩家得分
scoreLabel = new JLabel("玩家得分:" + score);
JPanel mainPanel = new JPanel(new GridLayout(7, 1));
// 創(chuàng)建重置按鈕面板
resetButton = new JButton("重新游戲");
//觸發(fā)監(jiān)聽
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();
}
// 監(jiān)聽按鈕事件
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == startButton) {
// 創(chuàng)建計時器,每1秒更新一次計時器標(biāo)簽
timer = new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 計算用時
long elapsedTime = (System.currentTimeMillis() - startTime) / 1000;
// 更新計時器標(biāo)簽
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);
// 啟動下一題挑戰(zhàn)
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);
// 判斷回答是否答對返回對應(yīng)提示
boolean isCorrect = answer.equals(correctAnswer);
if (isCorrect) {
// 得分+1
score++;
if (score == 10) {
JOptionPane.showMessageDialog(this, "恭喜你!挑戰(zhàn)成功!");
// 更新得分顯示
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 + "秒");
//自動跳轉(zhuǎn)下一題。
nextRiddle();
}
} else {
JOptionPane.showMessageDialog(this, "回答錯誤!");
guessButton.setEnabled(false);
}
}
//游戲啟動入口
public static void main(String[] args) {
GuessTheRiddleGame game = new GuessTheRiddleGame();
game.setVisible(true);
}
}結(jié)束語
這個小游戲為大家演示了如何通過純Java制作小游戲。在游戲制作過程中,我重點展示了如何利用 Swing 和 AWT 組件來創(chuàng)建界面、如何獲取和顯示謎語、提示和答案等信息、如何檢查玩家輸入的答案是否正確、如何統(tǒng)計得分和用時等等。
以上就是基于Java制作一個燈謎猜猜樂游戲的詳細(xì)內(nèi)容,更多關(guān)于Java燈謎游戲的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Springboot中@Transactional注解與異常處理機(jī)制方式
這篇文章主要介紹了Springboot中@Transactional注解與異常處理機(jī)制方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
聊聊Kotlin?中?lateinit?和?lazy?的原理區(qū)別
使用 Kotlin 進(jìn)行開發(fā),對于 latelinit 和 lazy 肯定不陌生。但其原理上的區(qū)別,可能鮮少了解過,借著本篇文章普及下這方面的知識,感興趣的朋友一起看看吧2022-07-07
JDK8配置環(huán)境變量的bat文件的詳細(xì)教程
這篇文章主要介紹了JDK8配置環(huán)境變量的bat文件,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
Springmvc中的轉(zhuǎn)發(fā)重定向和攔截器的示例
本篇文章主要介紹了Springmvc中的轉(zhuǎn)發(fā)重定向和攔截器的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05

