基于Java制作一個(gè)燈謎猜猜樂游戲
前言
中秋佳節(jié),是我國傳統(tǒng)的重大節(jié)日之一。全國各地為了增強(qiáng)過節(jié)的氣氛,都有許多傳統(tǒng)的中秋活動(dòng),比如吃月餅、賞月、猜燈謎等等。其中,猜燈謎就是一項(xiàng)極具娛樂性的活動(dòng),它不僅可以增進(jìn)親友之間的感情,更重要的是,還可以挑戰(zhàn)智商,讓你的小腦袋飛速運(yùn)轉(zhuǎn)。
為了讓大家更暢快愉快的重溫這種樂趣,快馬加鞭,趕在中秋節(jié)前,bug菌偷偷地把它制作出來了,接下來,快帶上家人們一塊來挑戰(zhàn),讓我們拭目以待,看看最終第一花落誰家!到底誰能答出我所設(shè)置的所有謎面!
開搞開搞
玩過Java的同學(xué)都清楚,想靠純Java實(shí)現(xiàn)一個(gè)可炫的可視化圖形,對(duì)比前端語言來說那簡直一個(gè)天一個(gè)地,但咱天生就不是會(huì)被困難折服的人,今個(gè)兒我就只用它來做一個(gè)可操作可視化的游戲。
準(zhǔn)備工作
在開始制作游戲之前,我們需要準(zhǔn)備一些材料:
- 謎語及其答案
- 提示
- GUI界面
這里我們已經(jīng)準(zhǔn)備好了10個(gè)中秋節(jié)相關(guān)的謎面和謎底,同時(shí)也有對(duì)應(yīng)的提示。我們將在GUI界面中顯示謎語和提示,并且讓玩家輸入答案并確認(rèn)是否正確。在確認(rèn)答案正確后,進(jìn)入下一道謎語。
游戲的制作思路
游戲界面設(shè)計(jì)
用Java設(shè)計(jì)的游戲界面簡潔明了,同時(shí)需要顯示謎面、提示、輸入框、按鈕等組件。其中,輸入框和按鈕應(yīng)該在同一個(gè)面板上,方便操作。
游戲邏輯設(shè)計(jì)
游戲邏輯應(yīng)該包括以下幾個(gè)部分:
- 進(jìn)入游戲過渡
- 獲取謎語、提示、答案等信息
- 顯示謎語和提示信息
- 等待玩家輸入答案
- 判斷答案是否正確
- 統(tǒng)計(jì)得分和時(shí)間
- 進(jìn)入下一題
游戲功能設(shè)計(jì)
游戲功能應(yīng)該包括以下幾個(gè)部分:
- 顯示當(dāng)前題目的謎面和提示
- 檢查玩家輸入的答案是否正確
- 顯示得分和時(shí)間信息
- 進(jìn)入謎底沖刺,可以隨時(shí)重新開始游戲
- 提示挑戰(zhàn)成功
游戲的制作步驟
1. 創(chuàng)建一個(gè) Java 項(xiàng)目
首先我們要先創(chuàng)建一個(gè)Java項(xiàng)目。
2. 導(dǎo)入需要的 jar 包
- swing.jar
- awt.jar
3. 創(chuàng)建游戲窗口
其次我們需要?jiǎng)?chuàng)建一個(gè) JFrame 類,并設(shè)置窗口的標(biāo)題、大小、默認(rèn)關(guān)閉操作和窗口位置等基本屬性。然后,創(chuàng)建各種組件,如標(biāo)簽、文本框、按鈕等,并將它們添加到主面板中。最后,顯示第一道謎語。
//設(shè)置游戲名 setTitle("燈謎猜猜樂"); //設(shè)置游戲界面大小 setSize(900, 300); //設(shè)置窗口關(guān)閉時(shí)的默認(rèn)操作 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //讓窗口居中顯示 setLocationRelativeTo(null); //創(chuàng)建輸入框和按鈕的面板 JPanel answerPanel = new JPanel(new GridLayout(1, 1));
4. 獲取謎語、提示、答案等信息
我們可以將所有的謎語、提示和答案保存在三個(gè) ArrayList 中,方便后續(xù)的使用。此外,我們還需要一個(gè)變量來保存當(dāng)前顯示的謎語的索引。
private JLabel riddleLabel; // 顯示謎語的標(biāo)簽 private JLabel hintLabel; // 顯示提示的標(biāo)簽 private JTextField answerField; // 輸入答案的文本框
5. 顯示謎語和提示信息
我們需要利用 JLabel 組件來顯示謎語和提示信息。在顯示謎語時(shí),我們需要根據(jù)索引獲取對(duì)應(yīng)的謎語,然后將其顯示在標(biāo)簽中。同樣,我們也需要根據(jù)索引獲取對(duì)應(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 組件來獲取玩家輸入的答案。在輸入答案之前,我們需要將文本框清空,避免影響玩家的輸入。此外,我們還需要一個(gè)“猜”按鈕,讓玩家確認(rèn)自己的答案。
answerField.setText(""); guessButton.setEnabled(true);
7. 判斷答案是否正確
我們需要利用 JOptionPane 組件來顯示玩家的答案是否正確。如果答案正確,我們需要更新玩家的得分,并計(jì)算玩家猜題的用時(shí)。最后,我們需要自動(dòng)跳轉(zhuǎn)到下一題。如果答案錯(cuò)誤,我們需要禁用“猜”按鈕,讓玩家重新輸入答案。
if (isCorrect) { // 得分+1 score++; JOptionPane.showMessageDialog(this, "回答正確!"); // 更新得分顯示 scoreLabel.setText("玩家得分:" + score); long elapsedTime = (System.currentTimeMillis() - startTime) / 1000; timeLabel.setText("用時(shí):" + elapsedTime + "秒"); //自動(dòng)跳轉(zhuǎn)下一題。 nextRiddle(); } }
8. 統(tǒng)計(jì)得分和時(shí)間
我們需要利用 JLabel 組件來顯示玩家的得分和用時(shí)。在每次玩家回答正確后,我們需要更新得分,并計(jì)算出玩家猜題的用時(shí)。
long elapsedTime = (System.currentTimeMillis() - startTime) / 1000; timeLabel.setText("用時(shí):" + elapsedTime + "秒");
9. 進(jìn)入「下一題」
我們需要一個(gè)「下一題」按鈕,讓玩家進(jìn)入下一題。在進(jìn)入下一題之前,我們需要清空輸入框,禁用“猜”按鈕,以避免玩家重復(fù)提交答案。
nextRiddle();
10. 實(shí)現(xiàn)「重新游戲」
我們需要一個(gè)「 重新開始 」按鈕,讓玩家可以重新開始游戲。在重新開始游戲之前,我們需要重置所有變量,包括當(dāng)前題目的索引、玩家的得分和用時(shí)等等。
private void resetGame() {}
11. 實(shí)現(xiàn)「開始游戲」
我們需要一個(gè)「開始游戲」按鈕,讓玩家在熱身過后有個(gè)儀式感進(jìn)入游戲進(jìn)行大挑戰(zhàn)!
startButton = new JButton("開始游戲");
最終效果
如下演示下如何把玩這個(gè)游戲吧!
進(jìn)入游戲
啟動(dòng)游戲后,會(huì)提示玩家是否已熱身準(zhǔn)備好開啟挑戰(zhàn)之旅!
開始游戲
點(diǎn)擊「開始游戲」按鈕,會(huì)投放謎題并自動(dòng)開始計(jì)時(shí)。猜謎要快喲,時(shí)間有限。
猜謎
在答題區(qū)輸入你的謎底,示例如下:
然后點(diǎn)擊【猜】按鈕后,答對(duì)會(huì)提示你“回答正確”,否則回答“回答錯(cuò)誤!”
下一題
如果回答不出來,沒關(guān)系,我也答不出來,咱們可以直接Pass!
挑戰(zhàn)成功
如果十題全部答對(duì)!會(huì)提示你“挑戰(zhàn)成功!”
想挑戰(zhàn)的趕緊試試吧!看看你能答對(duì)幾道?
完整代碼
如下是實(shí)現(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; // 存儲(chǔ)所有的謎語、提示、答案 private static final List<String> riddles = Arrays.asList( "月上中秋分外明,愿你人在長安,心在天涯。", "團(tuán)圓之夜思鄉(xiāng)心,曲院花枝笑春風(fēng)。", "清水流過秋千去,隔江猶唱后庭花。", "小樓昨夜又東風(fēng),故國不堪回首月明中。", "十五的月亮,照著我家門,門前有個(gè)小姐姐,正在彈琵琶。", "桂花滿城香,中秋佳氣濃。", "喜上眉梢,憂下心頭。", "良辰美景,應(yīng)須好好珍惜。", "家和萬事興,中秋快樂。", "中秋之夜,團(tuán)圓永恒。" ); private static final List<String> hints = Arrays.asList( "一句中秋佳節(jié)的祝福話。", "一句形容中秋夜景的詩句。", "一句形容中秋夜景的詩句。", "一句表達(dá)思鄉(xiāng)之情的句子。", "一首古詩詞的開頭部分。", "一句形容中秋桂花的詩句。", "一句概括中秋節(jié)的話。", "一句表達(dá)愛與憂的句子。", "一句表達(dá)對(duì)美好時(shí)光的珍惜之情。", "一句表達(dá)團(tuán)聚重要性的話。" ); private static final List<String> answers = Arrays.asList( "中秋快樂", "月上柳梢頭,人約黃昏后", "庭院深深,獨(dú)自凝望", "明月幾時(shí)有,把酒問青天", "靜夜思", "桂花", "喜憂參半", "好時(shí)光", "家和萬事興", "團(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; // 計(jì)時(shí)器 private JLabel timeLabel; // 顯示用時(shí)的標(biāo)簽 private long startTime; // 計(jì)時(shí)器開始時(shí)間 private JLabel startLabel; // 顯示游戲開始的標(biāo)簽 // 創(chuàng)建游戲窗口 public GuessTheRiddleGame() { //設(shè)置游戲名 setTitle("燈謎猜猜樂"); //設(shè)置游戲界面大小 setSize(900, 300); //設(shè)置窗口關(guān)閉時(shí)的默認(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)建計(jì)時(shí)器標(biāo)簽 timeLabel = new JLabel("用時(shí):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); //初始化謎底序號(hào) currentRiddleIndex = -1; //出題 nextRiddle(); } // 監(jiān)聽按鈕事件 @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == startButton) { // 創(chuàng)建計(jì)時(shí)器,每1秒更新一次計(jì)時(shí)器標(biāo)簽 timer = new Timer(1000, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 計(jì)算用時(shí) long elapsedTime = (System.currentTimeMillis() - startTime) / 1000; // 更新計(jì)時(shí)器標(biāo)簽 timeLabel.setText("用時(shí):" + elapsedTime + "秒"); } }); // 啟動(dòng)計(jì)時(shí)器 timer.start(); //提示開始計(jì)時(shí) startLabel.setText("游戲已開始,計(jì)時(shí)中..."); 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("用時(shí):" + 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("用時(shí):0秒"); // 禁用startButton startButton.setEnabled(false); // 啟動(dòng)下一題挑戰(zhàn) nextButton.setEnabled(true); nextRiddle(); // 添加出題邏輯 } // 顯示下一道謎語 private void nextRiddle() { if (timer == null || !timer.isRunning()) { JOptionPane.showMessageDialog(this, "請(qǐng)先點(diǎn)擊開始游戲按鈕開始游戲!"); 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); //開始計(jì)時(shí) timer.start(); } // 檢查答案是否正確 private void checkAnswer() { // 獲取用戶輸入的答案 String answer = answerField.getText().trim(); // 獲取正確的答案 String correctAnswer = answers.get(currentRiddleIndex); // 判斷回答是否答對(duì)返回對(duì)應(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("用時(shí):" + elapsedTime + "秒"); //禁用 guessButton.setEnabled(false); nextButton.setEnabled(false); } else { JOptionPane.showMessageDialog(this, "回答正確!"); // 更新得分顯示 scoreLabel.setText("玩家得分:" + score); long elapsedTime = (System.currentTimeMillis() - startTime) / 1000; timeLabel.setText("用時(shí):" + elapsedTime + "秒"); //自動(dòng)跳轉(zhuǎn)下一題。 nextRiddle(); } } else { JOptionPane.showMessageDialog(this, "回答錯(cuò)誤!"); guessButton.setEnabled(false); } } //游戲啟動(dòng)入口 public static void main(String[] args) { GuessTheRiddleGame game = new GuessTheRiddleGame(); game.setVisible(true); } }
結(jié)束語
這個(gè)小游戲?yàn)榇蠹已菔玖巳绾瓮ㄟ^純Java制作小游戲。在游戲制作過程中,我重點(diǎn)展示了如何利用 Swing 和 AWT 組件來創(chuàng)建界面、如何獲取和顯示謎語、提示和答案等信息、如何檢查玩家輸入的答案是否正確、如何統(tǒng)計(jì)得分和用時(shí)等等。
以上就是基于Java制作一個(gè)燈謎猜猜樂游戲的詳細(xì)內(nèi)容,更多關(guān)于Java燈謎游戲的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java對(duì)同一個(gè)文件進(jìn)行讀寫操作方法
在本篇文章里我們給大家詳細(xì)講述了java對(duì)同一個(gè)文件進(jìn)行讀寫操作的方法和知識(shí)點(diǎn),需要的朋友們可以參考學(xué)習(xí)下。2018-10-10Springboot中@Transactional注解與異常處理機(jī)制方式
這篇文章主要介紹了Springboot中@Transactional注解與異常處理機(jī)制方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08聊聊Kotlin?中?lateinit?和?lazy?的原理區(qū)別
使用 Kotlin 進(jìn)行開發(fā),對(duì)于 latelinit 和 lazy 肯定不陌生。但其原理上的區(qū)別,可能鮮少了解過,借著本篇文章普及下這方面的知識(shí),感興趣的朋友一起看看吧2022-07-07JDK8配置環(huán)境變量的bat文件的詳細(xì)教程
這篇文章主要介紹了JDK8配置環(huán)境變量的bat文件,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Java ArrayList擴(kuò)容問題實(shí)例詳解
這篇文章主要介紹了Java ArrayList擴(kuò)容問題實(shí)例詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02Springmvc中的轉(zhuǎn)發(fā)重定向和攔截器的示例
本篇文章主要介紹了Springmvc中的轉(zhuǎn)發(fā)重定向和攔截器的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05