Java语言编写打地鼠游戏教程

用Java语言书写打地鼠游戏

  • 关于游戏的介绍
  • 《打地鼠游戏》Java代码的实现
  • PlayMouse.java
  • StartGame.java
  • MusicPlay.java
  • MusicPlayTest.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

    运行效果

    结言

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

    作者:倾听一世,繁花盛开

    物联沃分享整理
    物联沃-IOTWORD物联网 » Java语言编写打地鼠游戏教程

    发表回复