Java基于Swing实现的打猎射击游戏代码_Java教程-查字典教程网
Java基于Swing实现的打猎射击游戏代码
Java基于Swing实现的打猎射击游戏代码
发布时间:2016-12-28 来源:查字典编辑
摘要:本文实例讲述了Java基于Swing实现的打猎射击游戏代码。分享给大家供大家参考。具体实现代码如下:复制代码代码如下:packageGame...

本文实例讲述了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程序设计有所帮助。

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新Java学习
    热门Java学习
    编程开发子分类