关于使用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.开始界面
Alt

2.打地鼠布局
Alt
3.小锤子
未击打时的形状
Alt
击打老鼠时的形状
Alt
4.老鼠的家
Alt
5.老鼠
居中的图片: Alt

运行效果

在这里插入图片描述

结言

使用者可以进行功能的扩充,比如添加代码实现多种地鼠的效果,当击打炸弹鼠时就就扣掉相应的分数,击打发财的老鼠加更多的分数。这样就让游戏更加多元化、样式更加丰富。
博主用心写,读者点关注;互动传真情,知识不迷路呦。

  • 44
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 37
    评论
好的,以下是用 Java 写一个打地鼠游戏的基本思路: 1. 创建一个窗口并设置基本属性,如大小、标题等。 2. 在窗口上绘制一个草坪的背景。 3. 创建一个地鼠的类,包括地鼠的图片、位置、状态等属性和方法。 4. 在窗口上随机生成地鼠,并将其添加到一个地鼠集合中。 5. 捕捉鼠标点击事件,判断点击的位置是否与地鼠重叠,如果重叠,则将地鼠状态设置为被击中。 6. 使用定时器(timer)定时更新地鼠的状态和位置,并重新绘制地鼠。 7. 在窗口上显示得分。 下面是一个简单的打地鼠游戏的示例代码: ```java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class WhackAMole extends JFrame implements ActionListener { private JLabel scoreLabel; private int score; private Mole[] moles; public WhackAMole() { super("Whack-A-Mole"); setSize(400, 400); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); scoreLabel = new JLabel("Score: 0"); add(scoreLabel, BorderLayout.NORTH); JPanel fieldPanel = new JPanel(new GridLayout(3, 3)); moles = new Mole[9]; for (int i = 0; i < 9; i++) { moles[i] = new Mole(); fieldPanel.add(moles[i]); moles[i].addActionListener(this); } add(fieldPanel, BorderLayout.CENTER); Timer timer = new Timer(1000, new ActionListener() { public void actionPerformed(ActionEvent e) { for (Mole mole : moles) { mole.update(); } } }); timer.start(); setVisible(true); } public void actionPerformed(ActionEvent e) { Mole mole = (Mole) e.getSource(); if (mole.getState() == MoleState.UP) { mole.hit(); score += 10; scoreLabel.setText("Score: " + score); } } public static void main(String[] args) { new WhackAMole(); } } class Mole extends JButton { private MoleState state; public Mole() { state = MoleState.DOWN; setPreferredSize(new Dimension(100, 100)); setContentAreaFilled(false); setBorderPainted(false); setOpaque(false); } public MoleState getState() { return state; } public void hit() { state = MoleState.HIT; } public void update() { if (state == MoleState.HIT) { state = MoleState.DOWN; } else if (state == MoleState.DOWN && Math.random() < 0.1) { state = MoleState.UP; } else if (state == MoleState.UP && Math.random() < 0.1) { state = MoleState.DOWN; } repaint(); } public void paintComponent(Graphics g) { super.paintComponent(g); if (state == MoleState.UP) { g.setColor(Color.RED); g.fillOval(10, 10, 80, 80); } else if (state == MoleState.HIT) { g.setColor(Color.GREEN); g.fillOval(10, 10, 80, 80); } } } enum MoleState { UP, DOWN, HIT } ``` 在这个示例代码中,我们创建了一个 WhackAMole 类,继承自 JFrame,作为游戏窗口。在窗口上我们添加了一个得分标签和一个草坪背景的面板,面板中有九个地鼠按钮,每个按钮对应一个 Mole 对象。Mole 类继承自 JButton,用来表示地鼠,并实现了地鼠的状态和更新方法。在 WhackAMole 类中,我们使用一个 Timer 来定时更新地鼠的状态和位置,并添加了一个 ActionListener,用来捕捉地鼠按钮的点击事件,并更新得分。最后调用 main() 方法启动游戏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值