如何使用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.老鼠
居中的图片:
运行效果
总结
到此这篇关于如何使用Java语言编写打地鼠游戏的文章就介绍到这了,更多相关Java编写打地鼠游戏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!