Java基于Swing实现的打猎射击游戏代码

本文实例讲述了Java基于Swing实现的打猎射击游戏代码。分享给大家供大家参考。

具体实现代码如下:


package Game;

import java.awt.Graphics; import java.awt.Image; import javax.swing.JPanel;

public class BackgroundPanel extends JPanel {         private static final long serialVersionUID = 1L;         private Image image;// 背景图片

        public BackgroundPanel() {                 setOpaque(false);                 setLayout(null);         }

        public void setImage(Image image) {                 this.image = image;         }

        /**          * 画出背景          */         protected void paintComponent(Graphics g) {                 if (image != null) {                         // 图片宽度                         int width = getWidth();                         // 图片高度                         int height = getHeight();                         // 画出图片                         g.drawImage(image, 0, 0, width, height, this);                 }                 super.paintComponent(g);         } }


package Game;

import java.awt.Container; import java.awt.event.*; import javax.swing.*;

public class BirdLabel extends JLabel implements Runnable {         private static final long serialVersionUID = 1L;         // 随机生成线程的休眠时间,即控制小鸟移动速度         private int sleepTime = (int) (Math.random() * 300) + 5;         private int y = 100;         private Thread thread;// 将线程作为成员变量         private Container parent;         private int score = 15;// 该类角色对应的分数

        /**          * 构造方法          */         public BirdLabel() {                 super();                 // 创建小鸟图标对象                 ImageIcon icon = new ImageIcon(getClass().getResource("bird.gif"));                 setIcon(icon);// 设置控件图标                 addMouseListener(new MouseAction());// 添加鼠标事件监听器                 // 添加控件事件监听器                 addComponentListener(new ComponentAction());                 thread = new Thread(this);// 创建线程对象         }

        /**          * 控件的控件事件监听器          */         private final class ComponentAction extends ComponentAdapter {                 public void componentResized(final ComponentEvent e) {                         thread.start();// 线程启动                 }         }

        /**          * 控件的鼠标事件监听器          */         private final class MouseAction extends MouseAdapter {                 public void mousePressed(final MouseEvent e) {                         if (!MainFrame.readyAmmo())// 如果子弹没有准备好                                 return;// 什么也不做                         MainFrame.useAmmo();// 消耗子弹                         appScore();// 加分                         destory();// 销毁本组件                 }         }

        public void run() {                 parent = null;                 int width = 0;                 try {                         while (width <= 0 || parent == null) {                                 if (parent == null) {                                         parent = getParent();// 获取父容器                                 } else {                                         width = parent.getWidth();// 获取父容器的宽度                                 }                                 Thread.sleep(10);                         }                         for (int i = width; i > 0 && parent != null; i -= 8) {                                 setLocation(i, y);// 从右向左移动本组件位置                                 Thread.sleep(sleepTime);// 休眠片刻                         }                 } catch (InterruptedException e) {                         e.printStackTrace();                 }                 if (parent != null) {                         MainFrame.appScore(-score * 10); // 自然销毁将扣分                 }                 destory();// 移动完毕,销毁本组件         }

        /**          * 从容器移除本组件的方法          */         public void destory() {                 if (parent == null)                         return;                 parent.remove(this);// 从父容器中移除本逐渐                 parent.repaint();                 parent = null; // 通过该语句终止线程循环         }

        /**          * 加分的方法          */         private void appScore() {                 System.out.println("小鸟被击中");                 MainFrame.appScore(15);         } }


package Game;

import java.awt.Container; import java.awt.event.*;

import javax.swing.*;

public class PigLabel extends JLabel implements Runnable {         private static final long serialVersionUID = 1L;         // 随机生成休眠时间,即野猪移动速度         private int sleepTime = (int) (Math.random() * 300) + 30;         private int y = 260;// 控件的垂直坐标         private int score = 10;// 该角色对应的分数         private Thread thread;// 内置线程对象         private Container parent;// 控件的父容器对象

        /**          * 构造方法          */         public PigLabel() {                 super();                 ImageIcon icon = new ImageIcon(getClass().getResource("pig.gif"));// 加载野猪图片                 setIcon(icon);// 设置本组件的图标                 // 添加鼠标事件适配器                 addMouseListener(new MouseAdapter() {                         // 按下鼠标按键的处理方法                         public void mousePressed(final MouseEvent e) {                                 if (!MainFrame.readyAmmo())                                         return;                                 MainFrame.useAmmo();// 消耗子弹                                 appScore();// 给游戏加分                                 destory();// 销毁本组件                         }                 });                 // 添加组件事件适配器                 addComponentListener(new ComponentAdapter() {                         // 调整组件大小时                         public void componentResized(final ComponentEvent e) {                                 thread.start();// 启动线程                         }                 });                 // 初始化线程对象                 thread = new Thread(this);         }

        public void run() {                 parent = null;                 int width = 0;                 while (width <= 0 || parent == null) {// 获取父容器宽度                         if (parent == null)                                 parent = getParent();                         else                                 width = parent.getWidth();                 }                 // 从左向右移动本组件                 for (int i = 0; i < width && parent != null; i += 8) {                         setLocation(i, y);                         try {                                 Thread.sleep(sleepTime);// 休眠片刻                         } catch (InterruptedException e) {                                 e.printStackTrace();                         }                 }                 if (parent != null) {                         MainFrame.appScore(-score * 10); // 自然销毁将扣分                 }                 destory();         }

        /**          * 从容器移除本组件的方法          */         public void destory() {                 if (parent == null)                         return;                 parent.remove(this);                 parent.repaint();                 parent = null; // 通过该语句终止线程循环         }

        /**          * 加分的方法          */         private void appScore() {                 System.out.println("野猪被击中");                 MainFrame.appScore(10);         } }


package Game;

import static java.lang.Math.random; import java.awt.*; import java.awt.event.*; import javax.swing.*;

public class MainFrame extends JFrame {         private static final long serialVersionUID = 1L;         private static long score = 0;// 分数         private static Integer ammoNum = 5;// 子弹数量         private static JLabel scoreLabel;// 分数         private BackgroundPanel backgroundPanel;         private static JLabel ammoLabel;         private static JPanel infoPane;

        /**          * 构造方法          */         public MainFrame() {                 super();                 setResizable(false);// 进制调整窗体大小                 setTitle("打猎游戏");                 infoPane = (JPanel) getGlassPane();// 获取玻璃面板                 JLabel label = new JLabel("装载子弹……");// 创建提示标签组件                 label.setHorizontalAlignment(SwingConstants.CENTER);                 label.setFont(new Font("楷体", Font.BOLD, 32));                 label.setForeground(Color.RED);                 infoPane.setLayout(new BorderLayout());                 infoPane.add(label);// 添加提示标签组件到玻璃面板

                setAlwaysOnTop(true);// 是窗体保持在最顶层                 setBounds(100, 100, 573, 411);                 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                 backgroundPanel = new BackgroundPanel();// 创建带背景的面板                 backgroundPanel.setImage(new ImageIcon(getClass().getResource(                                 "background.jpg")).getImage());// 设置背景图片                 getContentPane().add(backgroundPanel, BorderLayout.CENTER);                 // 添加鼠标事件适配器                 addMouseListener(new FrameMouseListener());                 scoreLabel = new JLabel();// 显示分数的标签组件                 scoreLabel.setHorizontalAlignment(SwingConstants.CENTER);                 scoreLabel.setForeground(Color.ORANGE);                 scoreLabel.setText("分数:");                 scoreLabel.setBounds(25, 15, 120, 18);                 backgroundPanel.add(scoreLabel);                 ammoLabel = new JLabel();// 显示自动数量的标签组件                 ammoLabel.setForeground(Color.ORANGE);                 ammoLabel.setHorizontalAlignment(SwingConstants.RIGHT);                 ammoLabel.setText("子弹数量:" + ammoNum);                 ammoLabel.setBounds(422, 15, 93, 18);                 backgroundPanel.add(ammoLabel);         }

        /**          * 加分方法          */         public synchronized static void appScore(int num) {                 score += num;                 scoreLabel.setText("分数:" + score);         }

        /**          * 消耗子弹的方法          */         public synchronized static void useAmmo() {                 synchronized (ammoNum) {                         ammoNum--;// 子弹数量递减                         ammoLabel.setText("子弹数量:" + ammoNum);                         if (ammoNum <= 0) {// 判断子弹是否小于0                                 new Thread(new Runnable() {                                         public void run() {                                                 // 显示提示信息面板                                                 infoPane.setVisible(true);                                                 try {                                                         // 1秒钟装载子弹的时间                                                         Thread.sleep(1000);                                                 } catch (InterruptedException e) {                                                         e.printStackTrace();                                                 }                                                 ammoNum = 5;// 恢复子弹数量                                                 // 修改子弹数量标签的文本                                                 ammoLabel.setText("子弹数量:" + ammoNum);                                                 infoPane.setVisible(false);// 隐藏提示信息面板                                         }                                 }).start();                         }                 }         }

        /**          * 判断子弹是否够用          *          */         public synchronized static boolean readyAmmo() {                 synchronized (ammoNum) {                         return ammoNum > 0;                 }         }

        public static void main(String args[]) {                 EventQueue.invokeLater(new Runnable() {                         public void run() {                                 try {                                         MainFrame frame = new MainFrame();                                         frame.setVisible(true);                                         frame.start();                                 } catch (Exception e) {                                         e.printStackTrace();                                 }                         }                 });         }

        /**          * 启动游戏的方法          */         public void start() {                 new PigThread().start();                 new BirdThread().start();         }

        /**          * 窗体的鼠标事件监听器          *          */         private final class FrameMouseListener extends MouseAdapter {                 public void mousePressed(final MouseEvent e) {                         Component at = backgroundPanel.getComponentAt(e.getPoint());                         if (at instanceof BackgroundPanel) {// 如果点到面板也扣除子弹                                 MainFrame.useAmmo();// 消耗子弹                         }                         /*                          * if (at instanceof BirdLabel) {// 如果点到小鸟 MainFrame.appScore(32);//                          * 加分 } if (at instanceof PigLabel) {// 如果点到野猪                          * MainFrame.appScore(11);// 加分 }                          */                 }         }

        /**          * 生成猪角色的线程          *          */         class PigThread extends Thread {                 @Override                 public void run() {                         while (true) {                                 // 创建代表野猪的标签控件                                 PigLabel pig = new PigLabel();                                 pig.setSize(120, 80);// 设置控件初始大小                                 backgroundPanel.add(pig);// 添加控件到背景面板                                 try {                                         // 线程随机休眠一段时间                                         sleep((long) (random() * 3000) + 500);                                 } catch (InterruptedException e) {                                         e.printStackTrace();                                 }                         }                 }         }

        /**          * 生成鸟角色的线程          *          */         class BirdThread extends Thread {                 @Override                 public void run() {                         while (true) {                                 // 创建代表小鸟的标签控件                                 BirdLabel bird = new BirdLabel();                                 bird.setSize(50, 50);// 设置控件初始大小                                 backgroundPanel.add(bird);// 添加控件到背景面板                                 try {                                         // 线程随机休眠一段时间                                         sleep((long) (Math.random() * 3000) + 500);                                 } catch (InterruptedException e) {                                         e.printStackTrace();                                 }                         }                 }         } }

希望本文所述对大家的Java程序设计有所帮助。