Java语言编写打地鼠游戏教程
用Java语言书写打地鼠游戏
关于游戏的介绍
打地鼠游戏是一款非常受欢迎的敏捷类游戏,它的基本规则简单易懂,同时又充满了挑战性和趣味性。
在游戏中,玩家通常需要在一个方形区域内,面对多个地洞,这些地洞中会不定时地冒出地鼠。玩家的主要任务就是在地鼠冒出头来的短时间内,用工具(如锤子)迅速而准确地击打它们。成功打中地鼠,玩家就能获得相应的分数。
玩者可以自己设置游戏的难度,地鼠的出现频率和速度都会加快,这就要求玩家不仅要有快速的反应能力,还需要有良好的手眼协调能力和预判能力。
打地鼠游戏不仅锻炼了玩家的反应速度和手眼协调能力,同时也考验了他们的注意力和耐心。因此,无论是孩子还是成年人,都能在这款游戏中找到属于自己的乐趣和挑战。
《打地鼠游戏》Java代码的实现
PlayMouse.java
package com.briup.game;
import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.net.MalformedURLException;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
/**
* 打地鼠 1.布局 2.功能
*
*/
public class PlayMouse implements ActionListener {
// 构建容器
private JFrame jFrame;
// 构建面板northJpanel centerJpanel
private JPanel northJPanel, centerJPanel;
// 构建六个标签,分别用来显示等级,分数,时间,音效
private JLabel leveLabel, timeLabel, timeVaLabel, centerJLabel, cenVaLabel, musicLabel;
// 构建下拉框,分别用来显示等级、音效
private JComboBox<String> jComboBox, musicBox;
// 构建开始按钮
private JButton jButton;
// 构建按钮组,保存十六个按钮
private JButton[] btsButtons;
// 构建时间定时器、老鼠定时器
private Timer timer, mouseTimer;
// 构建老鼠、老鼠洞图片
private ImageIcon holeiImage, mouseImgIcon;
// 记录上一次老鼠出现的位置
private int last;
// 设置游戏等级 初级:900毫秒 中级:600毫秒 高级:100毫秒
private int level;
// 记录老鼠是否加过分 flase:新老鼠 ,没加过分 true:旧老鼠
private boolean flag;
鼠标的形状
private Cursor cursor, cursor2;
// 文件对象
private File file;
// 背景音乐对象
private MusicPlay play;
// 游戏暂停按钮
private JButton pauseButton;
private boolean isPaused;
// 构建游戏继续按钮
private JButton resumeButton;
// 初始化JFrame
public PlayMouse() {
// 1.创建容器
jFrame = new JFrame("打地鼠");
// 2.创建面板
northJPanel = new JPanel();
centerJPanel = new JPanel();
// 3.设置布局管理器
// JFrame默认是边界管理器
// JPanel默认是流式布局管理器1
centerJPanel.setLayout(new GridLayout(4, 4));
// 4.创建组件
leveLabel = new JLabel("等级");
jComboBox = new JComboBox<String>(new String[] { "初级", "中级", "高级" });
// 等级选择框绑定点击事件
jComboBox.addActionListener(this);
timeLabel = new JLabel("time:");
timeVaLabel = new JLabel("10");
centerJLabel = new JLabel("cent:");
cenVaLabel = new JLabel("0");
musicLabel = new JLabel("音效");
musicBox = new JComboBox<String>(new String[] { "开", "关" });
// 音效下拉框绑定点击事件
musicBox.addActionListener(this);
jButton = new JButton("开始游戏");
pauseButton = new JButton("暂停游戏");
pauseButton.addActionListener(this);
resumeButton = new JButton("继续游戏");
resumeButton.addActionListener(this);
resumeButton.setVisible(false);
holeiImage = new ImageIcon("src/com/briup/game/hole.png");
mouseImgIcon = new ImageIcon("src/com/briup/game/mouse.png");
cursor = create("src/com/briup/game/hammer1.png");
cursor2 = create("src/com/briup/game/hammer2.png");
// 点击开始按钮,游戏开始
jButton.addActionListener(this);
btsButtons = new JButton[16];
for (int i = 0; i < btsButtons.length; i++) {
btsButtons[i] = new JButton();
// 禁用十六个按钮
btsButtons[i].setEnabled(false);
// 给十六个按钮绑定点击事件
btsButtons[i].addActionListener(this);
// 给按钮绑定鼠标按下或松开事件
btsButtons[i].addMouseListener(new MyMouse(btsButtons[i]));
// 添加到面板中
centerJPanel.add(btsButtons[i]);
}
// 创建时间定时器
timer = new Timer(1000, this);
level = 1000;
// 创建时间定时器
mouseTimer = new Timer(level, this);
// 5.添加组件到面板
northJPanel.add(leveLabel);
northJPanel.add(jComboBox);
northJPanel.add(timeLabel);
northJPanel.add(timeVaLabel);
northJPanel.add(centerJLabel);
northJPanel.add(cenVaLabel);
northJPanel.add(musicLabel);
northJPanel.add(musicBox);
northJPanel.add(jButton);
northJPanel.add(pauseButton);
northJPanel.add(resumeButton);
// 6.添加面板到容器中
jFrame.add(northJPanel, BorderLayout.NORTH);
jFrame.add(centerJPanel, BorderLayout.CENTER);
// 7.设置容器的宽高
jFrame.setSize(1100, 1000);
// 8.设置容器窗口可变
jFrame.setResizable(false);
// 9.设置容器居中
jFrame.setLocationRelativeTo(null);
// 11.设置容器可见性
jFrame.setVisible(true);
// 10.设置容器关闭窗口
jFrame.setDefaultCloseOperation(3);
// 12.设置缩放图片,图片大小适配按钮大小
mouseImgIcon.setImage(mouseImgIcon.getImage().getScaledInstance(btsButtons[0].getWidth(),
btsButtons[0].getHeight(), Image.SCALE_DEFAULT));
holeiImage.setImage(holeiImage.getImage().getScaledInstance(btsButtons[0].getWidth(), btsButtons[0].getHeight(),
Image.SCALE_DEFAULT));
for (int i = 0; i < btsButtons.length; i++) {
btsButtons[i].setIcon(holeiImage);
}
try {
// 13.开启背景音乐
// 创建文件对象
file = new File("src/com/briup/game/打地鼠背景音乐.wav");
// 创建背景音乐对象
play = new MusicPlay(file.toURL());
// 开启背景音乐
play.start();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
PlayMouse playMouse = new PlayMouse();
}
// 开启或禁用十六个按钮
public void setButton(boolean b) {
for (int i = 0; i < btsButtons.length; i++) {
btsButtons[i].setEnabled(b);
}
}
// 创建鼠标的形状
private Cursor create(String imagePath) {
Image myCursor = new ImageIcon(imagePath).getImage();
// 参数一:自定义鼠标样式对应的图片对象
// 参数二:对应的位置坐标
// 参数三:字符串,给自定义鼠标样式起的名字
return Toolkit.getDefaultToolkit().createCustomCursor(myCursor, new Point(0, 0), null);
}
// 鼠标按下或松开的形状
private class MyMouse extends MouseAdapter {
private JButton btnButton;
public MyMouse(JButton btnButton) {
this.btnButton = btnButton;
}
// 鼠标按下
public void mousePressed(MouseEvent e) {
btnButton.setCursor(cursor2);
}
// 鼠标松开
public void mouseReleased(MouseEvent e) {
btnButton.setCursor(cursor);
}
}
public void pauseGame() {
timer.stop();
mouseTimer.stop();
setButton(false);
pauseButton.setVisible(false);
resumeButton.setVisible(true);
}
private void resumeGame() {
timer.start();
mouseTimer.start();
setButton(true);
resumeButton.setVisible(false);
pauseButton.setVisible(true);
isPaused = false;
}
@Override
public void actionPerformed(ActionEvent e) {
// 获取事件源,看是谁点击的
Object object = e.getSource();
if (object == pauseButton) {
isPaused = !isPaused;
if (isPaused) {
pauseGame();
resumeButton.setVisible(true);
} else {
resumeGame();
resumeButton.setVisible(true);
}
}
if (object == resumeButton) {
isPaused = !isPaused;
if (isPaused) {
pauseGame();
} else {
resumeGame();
}
}
// 点击开始按钮,游戏开始
if (object == jButton) {
// 随机产生一个老鼠
Random random = new Random();
int index = random.nextInt(btsButtons.length);
flag = false;
btsButtons[index].setIcon(mouseImgIcon);
// 记录上一只老鼠出现的位置
last = index;
// 定时器开始,执行以下else if里的内容
timer.start();
// 开启老鼠定时器
mouseTimer.start();
// 开启十六个按钮
setButton(true);
// 禁用等级下拉框
jComboBox.setEditable(false);
// 禁用开始按钮
jButton.setEnabled(false);
} else if (object == timer) {
// 开启时间定时器后执行
// 获取按钮文本值 String -->int
int num = Integer.parseInt(timeVaLabel.getText());
if (num > 0) {
num--;
// 重新设置时间
timeVaLabel.setText(num + "");
} else {
// 游戏结束
// 清除掉最后一只老鼠,将老鼠蹄片设置为老鼠洞
btsButtons[last].setIcon(holeiImage);
// 关闭时间定时器
timer.stop();
// 关闭老鼠定时器
mouseTimer.stop();
// 开启开始按钮
jButton.setEnabled(true);
// 开启等级按钮
jComboBox.setEditable(true);
// 禁用十六个按钮
setButton(false);
// 关闭背景音乐
play.stop();
// 重置游戏时间,分数
timeVaLabel.setText("10");
cenVaLabel.setText("0.0");
}
} else if (object == mouseTimer) {
// 开启老鼠定时器执行
// 将上一次老鼠出现的位置设为老鼠洞
btsButtons[last].setIcon(holeiImage);
// 每隔1s随机产生一只老鼠
Random random = new Random();
int index = random.nextInt(btsButtons.length);
last = index;
flag = false;
// 将按钮的背景图设置为老鼠
btsButtons[index].setIcon(mouseImgIcon);
} else if (object == jComboBox) {
// 获取下拉框中选择的文本值
String string = (String) jComboBox.getSelectedItem();
// 判断那个等级
if ("高级".equals(string)) {
level = 500;
} else if ("中级".equals(string)) {
level = 1000;
} else if ("初级".equals(string)) {
level = 1400;
}
// 重新创建等级定时器
mouseTimer = new Timer(level, this);
} else if (object == musicBox) {
// 获取下拉框中选择的文本框
String chooseString = (String) musicBox.getSelectedItem();
if ("关".equals(chooseString)) {
play.stop();
} else if ("开".equals(chooseString)) {
play.start();
}
} else {
// 点击十六个按钮
for (int i = 0; i < btsButtons.length; i++) {
// 判断是否点击老鼠按钮并且该老鼠没加过分
// 判断是否点击老鼠的按钮
if (object == btsButtons[i] && btsButtons[i].getIcon() == mouseImgIcon && !flag) {
// 获取分数的文本值 String -->int
int cent = Integer.parseInt(cenVaLabel.getText());
// 分值加1
cent++;
flag = true;
// 设置分数值
cenVaLabel.setText(cent + "");// 将int--》转换成String
}
}
}
}
}
开始游戏界面
StartGame.java
package com.briup.game;
/**
*开始游戏的界面
*
*/
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.net.MalformedURLException;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import sun.net.www.content.text.plain;
public class StartGame implements ActionListener {
// 构建容器对象
private JFrame jFrame;
// 构建面板
private JPanel jPanel;
// 构建按钮组件
private JButton jButton;
// 构建文件对象
private File file;
// 构建背景音乐对象
private MusicPlay play;
// 构建背景图片
private ImageIcon startIcon;
// 构造器 初始化Jframe
public StartGame() {
// 1.创建容器
jFrame = new JFrame("开始界面");
// 2.创建面板 默认流式布局管理器
jPanel = new JPanel();
// 3.面板设置布局管理器 网格布局管理器
jPanel.setLayout(new GridLayout(1, 1));
// 4.创建组件
jButton = new JButton();
jButton.addActionListener(this);
// 5.添加组件到按钮
jPanel.add(jButton);
// 6.添加面板到容器
jFrame.add(jPanel);
// 7.设置容器大小
jFrame.setSize(1100, 1000);
// 8.设置容器居中
jFrame.setLocationRelativeTo(null);
// 9.设置容器大小不可调整
jFrame.setResizable(false);
// 10.设置容器可见性
jFrame.setVisible(true);
// 11.设置容器关闭方式
jFrame.setDefaultCloseOperation(3);
// 12.设置背景图片
startIcon = new ImageIcon("src/com/briup/game/start.jpg");
startIcon.setImage(
startIcon.getImage().getScaledInstance(jButton.getWidth(), jButton.getHeight(), Image.SCALE_DEFAULT));
jButton.setIcon(startIcon);
// 13.开启背景音乐
try {
file = new File("src/com/briup/game/开始游戏背景音乐.wav");
play = new MusicPlay(file.toURL());
play.start();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
new StartGame();
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
// 关闭背景音乐
play.stop();
// 关闭当前窗口
jFrame.dispose();
// 开启游戏窗口
new PlayMouse();
}
}
添加音乐
MusicPlay.java
package com.briup.game;
/**
* 背景音乐
*IO流:
* 类型:字节流 字符流
* 流向:输入流 输出流
*异常:
* Error:错误 不可解决
* Exception:异常 可解决
* -编译时异常
* -运行时异常
*/
import java.io.IOException;
import java.net.URL;
import javafx.scene.chart.PieChart.Data;
import sun.audio.AudioData;
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;
import sun.audio.ContinuousAudioDataStream;
public class MusicPlay {
//单次播放声音
private AudioStream aStream;
//循环播放声音
private ContinuousAudioDataStream casAudioDataStream;
//构造器
public MusicPlay(URL url) {
//打开一个声音文件流作为输入
try {
aStream = new AudioStream(url.openStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//一次播放开始
public void start() {
if (aStream == null) {
System.out.println("AudioStream object is not created");
return;
}else {
AudioPlayer.player.start(aStream);
}
}
//一次播放 停止
public void stop() {
if (aStream == null) {
System.out.println("AudioStream object is not created");
return;
}else {
AudioPlayer.player.stop(aStream);
}
}
//循环播放 开始
public void continueStart() {
AudioData data = null;
try {
data = aStream.getData();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
casAudioDataStream = new ContinuousAudioDataStream(data);
AudioPlayer.player.start(casAudioDataStream);
}
//循环播放 停止
public void continueStop() {
if (casAudioDataStream == null) {
System.out.println("ContinousAudioDataStream object is not created");
return;
}else {
AudioPlayer.player.stop(casAudioDataStream);
}
}
}
测试界面
MusicPlayTest.java
package com.briup.game;
import java.io.File;
import java.net.MalformedURLException;
public class MusicPlayTest {
@SuppressWarnings("deprecation")
public static void main(String[] args) throws Exception {
try {
// 1.创建文件对象
File file = new File("src/com/briup/game/打地鼠背景音乐.wav");
// 2.创建MusicPlay对象
MusicPlay play = new MusicPlay(file.toURL());
// 3.一次背景音乐 开启
// play.start();
// 4.循环播放背景音乐 开启
play.continueStart();
Thread.sleep(2000);
play.continueStop();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
游戏所需图片
1.开始界面
2.打地鼠布局
3.小锤子
未击打时的形状
击打老鼠时的形状
4.老鼠的家
5.老鼠
居中的图片:
运行效果
结言
使用者可以进行功能的扩充,比如添加代码实现多种地鼠的效果,当击打炸弹鼠时就就扣掉相应的分数,击打发财的老鼠加更多的分数。这样就让游戏更加多元化、样式更加丰富。
博主用心写,读者点关注;互动传真情,知识不迷路呦。
作者:倾听一世,繁花盛开