当前位置: 首页 > article >正文

java初学者:一个经典又全新改造的游戏——打地鼠

🎮 打地鼠游戏:挑战你的反应速度和策略思维!

嘿,大家好!今天我想和大家分享一个经典又全新改造的游戏——打地鼠!这个游戏不仅有趣,而且充满挑战,非常适合用来锻炼你的反应速度。
更棒的是,我将带你深入了解这个游戏的机制,以及背后的代码实现,让你感受编程的魅力!

🌟 游戏特色

1. 多样道具系统:

  • 时间增加道具:当你点击这个道具时,可以增加额外的10秒时间,帮助你在游戏中争取更多得分机会。
  • 得分加倍道具:这可是游戏中的“秘密武器”!点击后,你的得分会在短时间内翻倍,让你迅速拉开与对手的差距。

2. 丰富的地鼠种类:

  • 普通地鼠:点击得1分,基本款。
  • 快速地鼠:击中后能得2分,快速出现,增加难度。
  • 隐形地鼠:不小心点击会扣1分,考验你的判断力。
  • 炸弹地鼠:一不小心就扣分,小心踩到哦!
  • 道具地鼠:随机出现的时间和得分道具,让游戏更具变数。

3. 紧张刺激的音效和动画:

	背景音乐和点击音效为游戏增添了很多乐趣,击中地鼠时的小动画效果,让整个游戏更加生动。

4. 关卡挑战:

	游戏分为多个关卡,每个关卡的时间限制和地鼠出现频率不同,随着难度增加,挑战也会变得更大!

5. 结束画面与高分记录:

  游戏结束时,会显示你的得分和历史高分,激励你不断挑战自我。

📜 代码讲解

下面我将为大家简要介绍游戏的主要代码部分,帮助你理解其背后的逻辑。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

public class WhackAMoleGame extends JFrame {
    private JButton[] holes; // 地鼠洞按钮数组
    private int score; // 当前得分
    private JLabel scoreLabel; // 得分标签
    private JLabel timerLabel; // 倒计时标签
    private Timer gameTimer; // 游戏倒计时
    private Timer moleTimer; // 地鼠出现计时
    private Random random; // 随机数生成器
    private int remainingTime; // 剩余时间
    private int currentLevel; // 当前关卡
    private final int GAME_TIME[] = {30, 20, 15}; // 各关卡时间限制
    private final int MOLE_INTERVAL[] = {800, 600, 400}; // 各关卡地鼠出现间隔
    private int highScore = 0; // 历史高分

    private ImageIcon moleNormal; // 普通地鼠图标
    private ImageIcon moleFast; // 快速地鼠图标
    private ImageIcon moleHidden; // 隐形地鼠图标
    private ImageIcon moleBomb; // 炸弹地鼠图标
    private ImageIcon timeBonus; // 时间增加道具图标
    private ImageIcon scoreBonus; // 得分加倍道具图标

    public WhackAMoleGame() {
        // 初始化地鼠图标
        moleNormal = new ImageIcon("mole_normal.png");
        moleFast = new ImageIcon("mole_fast.png");
        moleHidden = new ImageIcon("mole_hidden.png");
        moleBomb = new ImageIcon("mole_bomb.png");
        timeBonus = new ImageIcon("time_bonus.png");
        scoreBonus = new ImageIcon("score_bonus.png");

        setTitle("打地鼠游戏");
        setSize(400, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new GridLayout(3, 3));

        holes = new JButton[9]; // 创建9个地鼠洞按钮
        random = new Random();
        score = 0;
        currentLevel = 0;

        for (int i = 0; i < holes.length; i++) {
            holes[i] = new JButton();
            holes[i].setBackground(Color.GREEN);
            holes[i].setFocusPainted(false);
            holes[i].addActionListener(new MoleClickListener(i));
            add(holes[i]);
        }

        scoreLabel = new JLabel("得分: 0", SwingConstants.CENTER);
        timerLabel = new JLabel("剩余时间: 30", SwingConstants.CENTER);
        add(scoreLabel);
        add(timerLabel);

        JButton startButton = new JButton("开始游戏");
        startButton.addActionListener(e -> startGame());
        add(startButton);

        setVisible(true);
    }

    private void startGame() {
        score = 0;
        currentLevel = 0;
        startLevel(); // 启动当前关卡
    }

    private void startLevel() {
        remainingTime = GAME_TIME[currentLevel];
        scoreLabel.setText("得分: " + score);
        timerLabel.setText("剩余时间: " + remainingTime);
        resetHoles();

        gameTimer = new Timer(1000, e -> {
            remainingTime--;
            timerLabel.setText("剩余时间: " + remainingTime);
            if (remainingTime <= 0) {
                endLevel(); // 结束当前关卡
            }
        });
        gameTimer.start();

        moleTimer = new Timer(MOLE_INTERVAL[currentLevel], e -> showMole()); // 定时显示地鼠
        moleTimer.start();
    }

    private void resetHoles() {
        for (JButton hole : holes) {
            hole.setIcon(null);
            hole.setBackground(Color.GREEN);
        }
    }

    private void showMole() {
        resetHoles();
        int molePosition = random.nextInt(holes.length);
        int moleType = random.nextInt(5); // 随机生成地鼠类型

        switch (moleType) {
            case 0:
                holes[molePosition].setIcon(moleNormal);
                break;
            case 1:
                holes[molePosition].setIcon(moleFast);
                break;
            case 2:
                holes[molePosition].setIcon(moleHidden);
                break;
            case 3:
                holes[molePosition].setIcon(moleBomb);
                break;
            case 4:
                if (random.nextBoolean()) {
                    holes[molePosition].setIcon(timeBonus);
                } else {
                    holes[molePosition].setIcon(scoreBonus);
                }
                break;
        }
    }

    private void endLevel() {
        gameTimer.stop();
        moleTimer.stop();
        showEndScreen(); // 显示结束画面
    }

    private void showEndScreen() {
        String message = "游戏结束!你的得分是: " + score + "\n高分: " + highScore;
        if (score > highScore) {
            highScore = score;
            message = "新高分!" + message;
        }
        JOptionPane.showMessageDialog(this, message);
        resetHoles();
    }

    private class MoleClickListener implements ActionListener {
        private int index;

        public MoleClickListener(int index) {
            this.index = index;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            // 处理点击事件,根据不同地鼠类型调整分数
            if (holes[index].getIcon() == moleNormal) {
                score++;
            } else if (holes[index].getIcon() == moleFast) {
                score += 2; 
            } else if (holes[index].getIcon() == moleHidden) {
                score--; 
            } else if (holes[index].getIcon() == moleBomb) {
                score -= 5; 
                JOptionPane.showMessageDialog(null, "你踩到炸弹了!扣除5分!");
            } else if (holes[index].getIcon() == timeBonus) {
                remainingTime += 10; 
                JOptionPane.showMessageDialog(null, "时间增加了10秒!");
            } else if (holes[index].getIcon() == scoreBonus) {
                score += 5; 
                JOptionPane.showMessageDialog(null, "得分增加了5分!");
            }
            scoreLabel.setText("得分: " + score);
            holes[index].setIcon(null); // 点击后清除图标
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(WhackAMoleGame::new);
    }
}

🔍 代码解析

🌟 游戏界面设置

首先,游戏界面是通过 JFrame 和 JButton 来构建的。我们用 GridLayout 布局将9个地鼠洞排列成3x3的方阵,这样一来,视觉上就非常整齐易懂!

setLayout(new GridLayout(3, 3));

这行代码的作用就是让每个按钮(地鼠洞)在界面上排列得像个棋盘,简单明了,一目了然。

⏰ 定时器
接下来是我们游戏的核心——定时器!我们使用了 Timer 类来实现游戏的倒计时和地鼠出现的频率。

gameTimer = new Timer(1000, e -> {
    remainingTime--;
    timerLabel.setText("剩余时间: " + remainingTime);
});

这里的代码设置了一个每秒钟触发的计时器,它会减少剩余时间并更新界面。当时间到达0时,游戏就结束了,紧张感满满!

🎯 关卡机制

我们把每个关卡的时间和地鼠出现的间隔分别存储在数组中,这样一来,调整游戏难度就变得非常简单!

private final int GAME_TIME[] = {30, 20, 15}; // 各关卡时间限制
private final int MOLE_INTERVAL[] = {800, 600, 400}; // 各关卡地鼠出现间隔

想要增加挑战,只需修改这些值即可!这是一个极具灵活性的设计,让玩家每一轮都能感受到不同的挑战。

🐹 随机地鼠的显示
在 showMole 方法中,我们通过随机选择地鼠洞来显示地鼠或道具。

int molePosition = random.nextInt(holes.length);

💥 点击事件处理

当你点击地鼠时,会触发 MoleClickListener 类中的 actionPerformed 方法。根据你点击的地鼠类型,分数会有所不同。

if (holes[index].getIcon() == moleNormal) {
    score++;
}

🏁 结束与高分记录

游戏结束时,endLevel 方法会被调用,显示你的得分和历史高分。如果你刷新了自己的高分,还会有额外的成就感!

String message = "游戏结束!你的得分是: " + score + "\n高分: " + highScore;

🎮 打地鼠游戏总结

打地鼠游戏是一个经典的反应力测试游戏,通过简单而富有趣味的设计,让玩家在轻松愉快的氛围中锻炼手眼协调能力。以下是对这个游戏的全面总结:

  1. 游戏玩法
    目标:玩家需要快速点击随机出现的地鼠,获取分数,同时避免点击炸弹和隐形地鼠。
    道具机制:引入了道具地鼠(如时间增加和得分加倍),增加了策略性和多样性,提升了游戏的趣味性。
  2. 关卡设计
    游戏分为多个关卡,每个关卡的时间限制和地鼠出现频率逐渐增加,提升了游戏难度。
    玩家可以在不同的关卡中体验不同的挑战,保持了游戏的新鲜感。
  3. 技术实现
    界面:使用 Java Swing 创建了一个直观的用户界面,简单易用的按钮和标签使得操作非常方便。
    随机性:通过随机生成地鼠出现的位置和类型,确保每局游戏都有不同的体验。
    计时器:利用 Timer 实现倒计时和地鼠出现间隔的管理,使游戏的节奏紧凑。
  4. 用户体验
    反馈机制:游戏中及时的提示和反馈让玩家在每次操作后都有明确的结果,这增强了参与感和成就感。
    高分记录:高分的展示激励玩家不断挑战自我,提升了游戏的趣味性和重玩价值。
  5. 学习价值
    通过开发这个游戏,初学者不仅能学习到 Java 编程和图形界面设计的基本知识,还能掌握事件处理、定时器使用和简单的游戏逻辑设计。

http://www.kler.cn/news/313975.html

相关文章:

  • 别用 npm config set registry 设置淘宝镜像了!!!
  • 2025年最新大数据毕业设计选题-基于Hive分析相关
  • 【超星word下载】使用脚本下载的超星 word 文件,显示 Word 发现无法读取的内容
  • 集成学习详细介绍
  • react hooks--useLayoutEffect
  • oracle 11g SYSAUX表空间清理
  • 微服务——网关登录校验(一)
  • ODrive电机驱动算法VScode环境配置笔记教程
  • Java | Leetcode Java题解之第412题Fizz Buzz
  • Apache doris手动部署时报错“Please disable swap memory before installation.“
  • Web 服务器介绍 | 通过 Tomcat 说明其作用
  • 华为摄像机/NVR主动注册协议接入SVMSP平台
  • pytorch入门(2)——TensorBoard的使用
  • Python利用PyInstaller封装EXE文件
  • 2024“华为杯”中国研究生数学建模竞赛(E题)深度剖析_数学建模完整过程+详细思路+代码全解析
  • Mysql实战
  • RNN的反向传播
  • 经典sql题(九)SQL 查询详细指南总结二
  • MySQL中的LIMIT与ORDER BY关键字详解
  • git 推送文件
  • vue3 ant-design 4.x 表格动态行样式设置
  • Tomcat服务器—Windows下载配置详细教程
  • Sui Builder House锦集,原生USDC和CCTP即将登陆Sui
  • 【HTTP】请求“报头”,Referer 和 Cookie
  • (CS231n课程笔记)深度学习之损失函数详解(SVM loss,Softmax,熵,交叉熵,KL散度)
  • 大批量查询方案简记(Mybatis流式查询)
  • Docker_启动redis,容易一启动就停掉
  • 使用Python实现深度学习模型:智能旅游路线规划
  • Base 社区见面会 | 新加坡站
  • 多层感知机paddle