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

网友投稿 306 2023-08-06


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);

   http://             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();// 消耗子弹

                        }

                &njrqqQoMyFbsp;       /*

                         * 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程序设计有所帮助。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java实现的满天星效果实例
下一篇:a标签的href与onclick事件的区别详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~