基于Java的飞机大战的课程设计与实现(支持阿里云盘下载源码)

🎶源码

飞机大战源码
https://www.aliyundrive.com/s/aoR9WVZLdSh

🎉游戏介绍

在这里插入图片描述

游戏操作比较简单,运行代码后,点击“开始游戏”既可以进入游戏,通过鼠标移动实现我方飞机的移动,我方飞机自动发射子弹,敌方飞机在十二个轨道随机生成,如果我方飞机与之碰撞,则游戏结束;如果我方飞机发射的子弹与敌方飞机相撞,则积分加一,敌方飞机消失。当敌方飞机出现相对应的数量之后,敌方BOSS出现,敌方BOSS可以发射子弹,并在游戏界面最上端来回移动,当我方飞机发射的子弹射中敌方飞机时,敌方BOSS生命值减少,直至生命值为零,则我方胜利!!!

🎊结构介绍

包和类的关系见下图
在这里插入图片描述

🎶主要代码实现

  1. 飞机的主窗口类(源码上方链接自取)
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);
	}

}
 
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
基于Java飞机大战游戏主要需要我方飞机和敌方飞机,还有子弹,特殊nPC,开始背景,结束背景,以及背景音乐。我方飞机可以随意移动,敌方飞机无规律出现。游戏玩家通过鼠标移动控制飞机移动,我方飞机在游戏开始时就一直能发射子弹,当我方子弹碰到敌方飞机时,敌方飞机消失。当玩家飞机碰到敌方子弹时,生命值减一,直到玩家飞机生命值为一时,游戏结束。基本模块包括:游戏状态控制功能模块、游戏难度的调整模块、游戏界面绘画功能模块、玩家游戏控制功能模块等。本系统结构如下: (1)游戏状态控制功能模块:游戏的状态控制包括运行及结束游戏,首先进入游戏的开始页面,在游戏进行时,玩家必须躲避或者击落敌方飞机,玩家飞机的生命值降低为0的时候游 戏就会结束,弹出游戏结束界面 (2)游戏难度的调整模块:玩家玩的时间越长游戏的难度越高,敌方飞机的数量越多、敌方飞机出现的频率越高,玩家保证飞机的存活的难度越高,操作难度相应也高。 (3)游戏界面绘画功能模块:左上角会显示玩家飞机当前生命值,游戏时间,当前分数,其他地方用来输出玩家对我方飞机的控制与敌方飞机的动作显示 (4)玩家游戏控制功能模块: 玩家可以通过控制鼠标或者键盘来控制方飞机(Hero airplane)的移动。
基于Java飞机大战游戏设计实现设计软件源码+word毕业论文文档。基于Java飞机大战游戏主要需要我方飞机和敌方飞机,还有子弹,特殊nPC,开始背景,结束背景,以及背景音乐。我方飞机可以随意移动,敌方飞机无规律出现。游戏玩家通过鼠标移动控制飞机移动,我方飞机在游戏开始时就一直能发射子弹,当我方子弹碰到敌方飞机时,敌方飞机消失。当玩家飞机碰到敌方子弹时,生命值减一,直到玩家飞机生命值为一时,游戏结束。基本模块包括:游戏状态控制功能模块、游戏难度的调整模块、游戏界面绘画功能模块、玩家游戏控制功能模块等。本系统结构如下: (1)游戏状态控制功能模块:游戏的状态控制包括运行及结束游戏,首先进入游戏的开始页面,在游戏进行时,玩家必须躲避或者击落敌方飞机,玩家飞机的生命值降低为0的时候游 戏就会结束,弹出游戏结束界面 (2)游戏难度的调整模块:玩家玩的时间越长游戏的难度越高,敌方飞机的数量越多、敌方飞机出现的频率越高,玩家保证飞机的存活的难度越高,操作难度相应也高。 (3)游戏界面绘画功能模块:左上角会显示玩家飞机当前生命值,游戏时间,当前分数,其他地方用来输出玩家对我方飞机的控制与敌方飞机的动作显示 (4)玩家游戏控制功能模块: 玩家可以通过控制鼠标或者键盘来控制方飞机(Hero airplane)的移动。 目 录 1 引言 1 1.1 项目背景 1 1. 2 国内外研究现状 3 1.3 项目主要工作 4 1.4 本文组织结构 6 2 开发平台与开发技术 7 2. 1 IntelliJ IDEA简介 7 2. 2 IntelliJ IDEA与Eclipse 、MyEclipse的比较 8 2. 3 Java 10 3 可行性研究 13 3. 1 技术可行性 13 3. 2 经济可行性 13 3. 3 操作可行性 14 3. 4 用户使用可行性 14 3. 5 法律可行性 14 4 需求分析 15 4. 1 系统需求概述 16 4. 2 功能模块设计 17 4.2.1 游戏状态控制功能模块 17 4.2.2 游戏难度的调整模块 17 4.2.3 游戏界面绘画功能模块 17 4.2.4 玩家游戏控制功能模块 17 4. 3 游戏难点分析 18 4.3.1 绘图美化 18 4.3.2 多线程技术的实现 18 4.3.3 防碰撞问题的解决 18 4.3.4 动画的实现 18 5 飞机大战功能实现 19 5.1 模型图 19 5.2 软件功能模块 19 5.3 游戏首页的实现 20 5.3.1 界面实现 20 5.3.2 流程图 21 5.3.3 核心代码 22 5.4 游戏开始模块的实现 24 5.4.1 界面实现 24 5.4.2 流程图 25 5.4.3 核心代码 25 5.5 发射子弹模块的实现 27 5.5.1 界面实现 27 5.5.2 流程图 28 5.5.3 核心代码 29 5.6 积分模块的实现 33 5.6.1 界面的实现 33 5.6.2 核心代码 34 5.7 防碰撞逻辑 37 5.7.1 核心代码 37 5.8 游戏操作的实现 39 5.8.1 核心代码 39 5.9 特殊NPC蜜蜂 41 6 系统测试 42 6.1 测试的定义及其重要性 43 6.1.1 测试的定义 43 6.1.2 测试的重要性 44 6.2 测试方法 46 6.3 测试结果 50 7 结论 51 参考文献 52 致谢 54 外文文献 55 中文翻译 63 1 引言 1.1 项目背景 90后的我们,童年最开始接触电子游戏是在游戏厅,那时候的飞机大战游戏机前,往往人山人海,绚丽多彩的画面,带感操作让人沉醉不能自拔。再后来,珍珠港(Pearl Harbor),虎虎虎(Tora! Tora! Tora!)等空战电影中激烈的空战和飞机在天空中的英姿让我彻底爱上了空战,所以毕业设计我选择了与飞机战斗有关——基于Java飞机大战游戏设计实现的毕业设计。 而选基于Java飞机大战游戏设计实现为题,是对大学期间学到知识的一次实践运用,也是对自己大学四年学习成果的一次检验。 柏拉图:“游戏是一切幼子生活和能力跳跃需要而产生的有意识的模拟活动。”亚里士多德给游戏的定义是:“游戏是劳作后的休息和消遣,本身并带有任何目的性的一种行为活动。”可以说,游戏是一种一直存在的社会现象,有了人类就有了游戏,人类与游戏息息相关。游戏也随着人类的进步有了新的发展。 PC机刚开始普及的时候,游戏并不能被广泛接受。最主要的原因就是不能充分发挥PC机的性能,即游戏程序不能最大化使用PC机的硬件资源,导致PC机

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

、信仰_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值