基于Java的飞机大战的课程设计与实现
Posted 、信仰_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Java的飞机大战的课程设计与实现相关的知识,希望对你有一定的参考价值。
源码
> [飞机大战游戏源码及图片文件(有超详细的注释呦)]
https://www.aliyundrive.com/s/Qob1UhDgCLo
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。
游戏介绍
游戏操作比较简单,运行代码后,点击“开始游戏”既可以进入游戏,通过鼠标移动实现我方飞机的移动,我方飞机自动发射子弹,敌方飞机在十二个轨道随机生成,如果我方飞机与之碰撞,则游戏结束;如果我方飞机发射的子弹与敌方飞机相撞,则积分加一,敌方飞机消失。当敌方飞机出现相对应的数量之后,敌方BOSS出现,敌方BOSS可以发射子弹,并在游戏界面最上端来回移动,当我方飞机发射的子弹射中敌方飞机时,敌方BOSS生命值减少,直至生命值为零,则我方胜利!!!
结构介绍
包和类的关系见下图
主要代码实现
- 飞机的主窗口类(源码上方链接自取)
package com.sxt;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
import com.sxt.util.GameUtil;
import obj.BgObj;
import obj.BossObj;
import obj.BulletObj;
import obj.EnemyObj;
import obj.ExplodeObj;
import obj.PlaneObj;
import obj.ShellObj;
public class GameWin extends JFrame
// 创建背景图的对象,用对象绘制自身
BgObj bgObj = new BgObj(GameUtil.bgImg, 0, 0, 2, this);
// 创建我方飞机的对象
public PlaneObj planeObj = new PlaneObj(GameUtil.PlaneImg, 22, 33, 290, 550, 0, this);
// 我方子弹的集合
public static List<ShellObj> shellObjList = new ArrayList<ShellObj>();
// 我方子弹的集合
public static List<BulletObj> bulletObjList = new ArrayList<BulletObj>();
// 敌方飞机的集合
public static List<EnemyObj> enemyObjsList = new ArrayList<EnemyObj>();
EnemyObj enemyObj = new EnemyObj(GameUtil.enemyImg, 49, 39, 0, 0, 5, this);
// 爆炸图实体类集合
public static List<ExplodeObj> explodeObjList = new ArrayList<ExplodeObj>();
// 敌方Boss的对象
public BossObj bossObj =null;
// public BossObj bossObj = new BossObj(GameUtil.bossImg, 56, 100, 220, 50, 5, this);
// 随机种子
Random random = new Random();
// 计数器
int paintCount = 1;
// 敌方出现飞机数
int enemyCount = 0;
// 积分计数器
public int sorce = 0;
// 定义临时图片,防止画面闪烁
Image tempImg = null;
public void initWin()
// 设置宽高
this.setSize(600, 600);
this.setSize(600, 600);
// 设置标题
this.setTitle("飞机大战 ");
// 设置窗口居中
this.setLocationRelativeTo(null);
// 点击关闭按钮关闭程序
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// 设置窗口是否可见
this.setVisible(true);
// 点击鼠标按钮开始游戏
this.addMouseListener(new MouseAdapter()
public void mouseClicked(MouseEvent e)
if (e.getButton() == 1&&GameUtil.state==0)
System.out.println("游戏开始了");
// 改变游戏状态
GameUtil.state = 1;
repaint();
);
// 添加键盘事件
this.addKeyListener(new KeyAdapter()
@Override
public void keyPressed(KeyEvent e)
// 如果空格键被点击
if (e.getKeyCode() == 32)
switch (GameUtil.state)
case 1:
// 游戏中,点击空格暂停
GameUtil.state = 2;
// repaint();
break;
case 2:
// 暂停中,点击空格开始
GameUtil.state = 1;
break;
default:
break;
);
// 不断调用paint方法,让画面实现动画效果,让paint方法每隔1秒钟调用一次
while (true)
if (GameUtil.state == 1)
repaint();
createObj();
try
Thread.sleep(40);
catch (InterruptedException e1)
e1.printStackTrace();
// 绘制窗口内容 Graphics是画笔
@Override
public void paint(Graphics g)
if (tempImg == null)
// 防止重复 初始化图片
tempImg = this.createImage(600, 600);
// 新图片的画笔
Graphics gImage = tempImg.getGraphics();
gImage.fillRect(0, 0, 600, 600);
// 绘制背景图
bgObj.paintSelf(gImage);
// 游戏未开始
if (GameUtil.state == 0)
// 绘制字符串
GameUtil.drawStr(Color.green, 50, "点击开始游戏", 140, 300, gImage);
// 游戏开始时,先引用一下爆炸图
gImage.drawImage(GameUtil.explodeImg, planeObj.getX()+9999, planeObj.getY(), this);
// 游戏进行中
if (GameUtil.state == 1)
// 绘制我方飞机
planeObj.paintSelf(gImage);
// 绘制我方子弹
for (int i = 0; i < shellObjList.size(); i++)
shellObjList.get(i).paintSelf(gImage);
// 绘制敌方飞机
for (int i = 0; i < enemyObjsList.size(); i++)
enemyObjsList.get(i).paintSelf(gImage);
// 绘制敌方子弹
for (int i = 0; i < bulletObjList.size(); i++)
bulletObjList.get(i).paintSelf(gImage);
// 绘制爆炸效果图
for (int i = 0; i < explodeObjList.size(); i++)
explodeObjList.get(i).paintSelf(gImage);
// 绘制Boss
if(bossObj!=null)
bossObj.paintSelf(gImage);
// 移除多余的爆炸图对象
if (explodeObjList.size() >= 15)
for (int i = 0; i < 10; i++)
explodeObjList.remove(0);
// 游戏暂停
if(GameUtil.state==2)
GameUtil.drawStr(Color.BLUE, 50, "点击空格继续", 180, 300, gImage);
if (GameUtil.state == 3)
// 游戏结束了
gImage.drawImage(GameUtil.explodeImg, planeObj.getX() - 10, planeObj.getY() - 30, this);
GameUtil.drawStr(Color.RED, 50, "GAME OVER", 180, 300, gImage);
if (GameUtil.state == 4)
gImage.drawImage(GameUtil.explodeImg, bossObj.getX() + 40, bossObj.getY() + 20, this);
GameUtil.drawStr(Color.GREEN, 50, "游戏通关", 200, 300, gImage);
// 积分面板
GameUtil.drawStr(Color.YELLOW, 20, sorce + "分", 10, 60, gImage);
// 将临时图片绘制到窗口
g.drawImage(tempImg, 0, 0, null);
// System.out.println("集合长度"+shellObjList.size()) ;
paintCount++;
// 制造游戏物体的方法
public void createObj()
if (paintCount % 3== 0)
// 每调用15次paint方法执行下面代码一次
ShellObj shellObj = new ShellObj(GameUtil.shellImg, 14, 29, planeObj.getX() + 4, planeObj.getY() - 30, 5,
this);
shellObjList.add(shellObj);
if (paintCount % 5== 0)
// 每调用15次paint方法执行下面代码一次
EnemyObj enemyObj = new EnemyObj(GameUtil.enemyImg, 49, 39, random.nextInt(12) * 50, 0, 5, this);
enemyObjsList.add(enemyObj);
enemyCount++;
if(enemyCount>50)
if(bossObj==null)
bossObj = new BossObj(GameUtil.bossImg, 56, 100, 220, 50, 5, this);
if (paintCount % 10 == 0)
// 每调用15次paint方法执行下面代码一次
bulletObjList.add(new BulletObj(GameUtil.bulletImg, 14, 25, bossObj.getX() + 78,
bossObj.getY() + bossObj.getHeight(), 5, this));
public static void main(String[] args)
GameWin gameWin = new GameWin();
gameWin.initWin();
//@Override
//public void paint(Graphics g)
// bgObj.paintSelf(g);
// if(GameUtil.state==0)
// GameUtil.drawStr(Color.GREEN, 50, "点击开始游戏", 150, 300, g);
//
//
2.工具类代码实现
package com.sxt.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
public class GameUtil
//定义游戏的状态 0——未开始 1——游戏中 2——暂停 3——失败 4——胜利
public static int state=0;
//定义背景图片
public static Image bgImg =Toolkit.getDefaultToolkit().getImage("imgs/bg.jpg");
//定义我方飞机图片
public static Image PlaneImg =Toolkit.getDefaultToolkit().getImage("imgs/plane.png");
//定义我方子弹图片
public static Image shellImg=Toolkit.getDefaultToolkit().getImage("imgs/shell.png");
//定义敌方飞机图片
public static Image enemyImg=Toolkit.getDefaultToolkit().getImage("imgs/enemy.png");
//定义飞机爆炸图
public static Image explodeImg=Toolkit.getDefaultToolkit().getImage("imgs/explode/e6.gif");
//定义Boss图片
public static Image bossImg=Toolkit.getDefaultToolkit().getImage("imgs/boss.png");
//定义敌方子弹图片
public static Image bulletImg=Toolkit.getDefaultToolkit().getImage("imgs/bullet.png");
/**
* 绘制字符串的方法
* @param color
* @param size
* @param str
* @param x
* @param y
* @param g
*/
//封装一个回执字符串的方法
public static void drawStr(Color color,int size,String str,int x ,int y,Graphics g)
g.setColor(color);
g.setFont(new Font("宋体",Font.BOLD,size));
g.drawString(str,x,y);
以上是关于基于Java的飞机大战的课程设计与实现的主要内容,如果未能解决你的问题,请参考以下文章