基于Java的飞机大战的课程设计与实现

Posted 、信仰_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Java的飞机大战的课程设计与实现相关的知识,希望对你有一定的参考价值。

源码

> [飞机大战游戏源码及图片文件(有超详细的注释呦)]
https://www.aliyundrive.com/s/Qob1UhDgCLo
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。

游戏介绍

游戏操作比较简单,运行代码后,点击“开始游戏”既可以进入游戏,通过鼠标移动实现我方飞机的移动,我方飞机自动发射子弹,敌方飞机在十二个轨道随机生成,如果我方飞机与之碰撞,则游戏结束;如果我方飞机发射的子弹与敌方飞机相撞,则积分加一,敌方飞机消失。当敌方飞机出现相对应的数量之后,敌方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);
	


 

以上是关于基于Java的飞机大战的课程设计与实现的主要内容,如果未能解决你的问题,请参考以下文章

雷电飞机大战游戏|基于Java开发实现雷电飞机大战游戏

雷电飞机大战游戏|基于Java开发实现雷电飞机大战游戏

C语言大一课程设计——飞机大战

飞机大战编写以及Java的面向对象总结

python--飞机大战(课程设计)

python--飞机大战(课程设计)