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