欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Java制作一個燈謎猜猜樂游戲

 更新時間:2023年09月14日 08:18:10   作者:bug菌  
中秋佳節(jié),是我國傳統(tǒng)的重大節(jié)日之一,全國各地為了增強過節(jié)的氣氛,都有許多傳統(tǒng)的中秋活動,比如猜燈謎,所以本文就來用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)文章

  • java對同一個文件進行讀寫操作方法

    java對同一個文件進行讀寫操作方法

    在本篇文章里我們給大家詳細講述了java對同一個文件進行讀寫操作的方法和知識點,需要的朋友們可以參考學習下。
    2018-10-10
  • Springboot中@Transactional注解與異常處理機制方式

    Springboot中@Transactional注解與異常處理機制方式

    這篇文章主要介紹了Springboot中@Transactional注解與異常處理機制方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 聊聊Kotlin?中?lateinit?和?lazy?的原理區(qū)別

    聊聊Kotlin?中?lateinit?和?lazy?的原理區(qū)別

    使用 Kotlin 進行開發(fā),對于 latelinit 和 lazy 肯定不陌生。但其原理上的區(qū)別,可能鮮少了解過,借著本篇文章普及下這方面的知識,感興趣的朋友一起看看吧
    2022-07-07
  • JAVA的反射機制你了解多少

    JAVA的反射機制你了解多少

    這篇文章主要為大家詳細介紹了JAVA的反射機制,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • JDK8配置環(huán)境變量的bat文件的詳細教程

    JDK8配置環(huán)境變量的bat文件的詳細教程

    這篇文章主要介紹了JDK8配置環(huán)境變量的bat文件,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Java ArrayList擴容問題實例詳解

    Java ArrayList擴容問題實例詳解

    這篇文章主要介紹了Java ArrayList擴容問題實例詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Java單例模式的五種實現(xiàn)方式

    Java單例模式的五種實現(xiàn)方式

    單例模式(Singleton Pattern)是Java中最簡單的設(shè)計模式之一,這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式,下面這篇文章主要給大家介紹了關(guān)于Java單例模式的五種實現(xiàn)方式?,需要的朋友可以參考下
    2022-06-06
  • SpringBoot集成整合JWT與Shiro流程詳解

    SpringBoot集成整合JWT與Shiro流程詳解

    安全管理是軟件系統(tǒng)必不可少的的功能。根據(jù)經(jīng)典的“墨菲定律”——凡是可能,總會發(fā)生。如果系統(tǒng)存在安全隱患,最終必然會出現(xiàn)問題,這篇文章主要介紹了SpringBoot集成JWT、Shiro框架的使用
    2022-12-12
  • Springmvc中的轉(zhuǎn)發(fā)重定向和攔截器的示例

    Springmvc中的轉(zhuǎn)發(fā)重定向和攔截器的示例

    本篇文章主要介紹了Springmvc中的轉(zhuǎn)發(fā)重定向和攔截器的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Java 字符串連接的性能問題分析

    Java 字符串連接的性能問題分析

    這篇文章主要介紹了Java 字符串連接的性能問題分析的相關(guān)資料,需要的朋友可以參考下
    2017-03-03

最新評論