基于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);
	}

}
 

猜你喜欢

转载自blog.csdn.net/sinat_51673411/article/details/122516329