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