java课设-飞机大战

一.团队成员及其负责模块

项目成员 负责模块
苏凯昕编码规范,面向对象设计,算法编写,部分GUI,博客编写,游戏数值策划、游戏美术设计

二.git提交记录

三.项目功能架构图

1.流程图

 四.运行截图

 

 

五.关键代码

1.游戏主要流程

public void launch() throws InterruptedException {

		this.setVisible(true);// 窗口是否可见
		this.setSize(640, 960);// 窗口大小
		this.setLocationRelativeTo(null);// 窗口位置
		this.setTitle("飞机大战");// 窗口标题

		GameUtils.gameobjLIst.add(bgObj);
		GameUtils.gameobjLIst.add(myplane);// 先画背景再画飞机,不然会被盖住
//		GameUtils.gameobjLIst.add(boss);

		this.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {// 点击开始游戏
				if (e.getButton() == 1 && state == 0) {// 点击鼠标左键且游戏未开始
					state = 1;
					repaint();// 会调用paint方法

				}
			}
		});

		while (true) {
			if (state == 1) {
				creteObj();// 敌方飞机、子弹和我方子弹
				repaint();
			}

			Thread.sleep(30);
		}
	}

2.绘制图像

public void paint(Graphics g) {
		if (offScreenImage == null) {
			offScreenImage = createImage(640, 960);
		}
		Graphics gImage = offScreenImage.getGraphics();
		gImage.fillRect(0, 0, 640, 960);
		if (state == 0) {// 游戏主页
			gImage.drawImage(GameUtils.bgImg, 0, 0, null);
			gImage.drawImage(GameUtils.bossImg, 320, 0, null);
			gImage.drawImage(GameUtils.boomImg, 0, 320, null);
			gImage.setColor(Color.yellow);
			GameUtils.drawWord(gImage, "点击界面任意位置开始游戏", Color.yellow, 50, 10, 650);
			GameUtils.drawWord(gImage, "飞机大战", Color.yellow, 70, 150, 180);

		}
		if (state == 1) {
			GameUtils.gameobjLIst.addAll(GameUtils.boomLIst);
			for (int i = 0; i < GameUtils.gameobjLIst.size(); i++) {// 绘制所有对象
				GameUtils.gameobjLIst.get(i).paintSelf(gImage);
			}
			GameUtils.drawWord(gImage, "分数:" + score, Color.green, 40, 30, 100);
			GameUtils.gameobjLIst.removeAll(GameUtils.removeLIst);
		}

		if (state == 3) {// 游戏失败
			gImage.drawImage(GameUtils.boomImg, myplane.getX(), myplane.getY(), null);
			GameUtils.drawWord(gImage, "游戏结束", Color.red, 70, 150, 500);
			GameUtils.drawWord(gImage, "分数:" + score, Color.green, 40, 30, 100);
		}

//		if (state == 2) {
//			GameUtils.drawWord(gImage, "游戏胜利", Color.red, 70, 150, 500);
//			GameUtils.drawWord(gImage, "分数:" + score, Color.green, 40, 30, 100);
//		}

		g.drawImage(offScreenImage, 0, 0, null);
		repaintCount++;
	}

3.创建对象

void creteObj() {// 生成敌机、子弹
		if(bossCount<=5) {
			if (repaintCount % (10-bossCount) == 0) {
				GameUtils.shellLIst
						.add(new ShellObj("imgs/涂鸦子弹.png", myplane.getX() + 20, myplane.getY() - 30, 20, 20, 8, this));
				GameUtils.gameobjLIst.add(GameUtils.shellLIst.get(GameUtils.shellLIst.size() - 1));// 每生成一颗子弹就加入到要绘制的集合中
			}
		}
		else{
			if (repaintCount % 5 == 0) {
				GameUtils.shellLIst
						.add(new ShellObj("imgs/涂鸦子弹.png", myplane.getX() + 20, myplane.getY() - 30, 20, 20, 8, this));
				GameUtils.gameobjLIst.add(GameUtils.shellLIst.get(GameUtils.shellLIst.size() - 1));// 每生成一颗子弹就加入到要绘制的集合中
			}
		}
		
		if (repaintCount % (20-bossCount) == 0) {
			GameUtils.EnemyLIst.add(new EnemyObj("imgs/小飞机.png", (int) (Math.random() * 550), 0, 80, 80, 6, this));
			GameUtils.gameobjLIst.add(GameUtils.EnemyLIst.get(GameUtils.EnemyLIst.size() - 1));// 每生成一架小飞机就加入到要绘制的集合中
		}
		if (repaintCount % (20-bossCount) == 0&&boss!=null) {
			GameUtils.enemyShellLIst
					.add(new EnemyShell("imgs/敌方子弹.png", boss.getX()+100 , boss.getY()+200 , 20, 20, 8, this));
			GameUtils.gameobjLIst.add(GameUtils.enemyShellLIst.get(GameUtils.enemyShellLIst.size() - 1));// 每生成一颗子弹就加入到要绘制的集合中
		}
		
		if (boss == null && repaintCount % 200 == 0) {//10架小飞机生成一个boss
			boss = new BossObj("imgs/boss.png", 300, 0, 250, 210, 4, this);
			GameUtils.gameobjLIst.add(boss);
			GameWin.bossCount++;
		}
	}

4.我方飞机跟随鼠标

	public void paintSelf(Graphics gImage) {
		gImage.drawImage(img,x,y,null);
		this.frame.addMouseMotionListener(new MouseAdapter() {
			@Override
			public void mouseMoved(MouseEvent e) {
				super.mouseMoved(e);
				x = e.getX() - 40;
				y = e.getY() - 60;
			}
		
		});
	}

 5.boss的生成及移动

public void paintSelf(Graphics gImage) {
		if (this.getRec().intersects(this.frame.myplane.getRec())) {
			this.frame.state = 3;
		}

		gImage.drawImage(img, x, y, null);
		if (x > 450 || x < 0) {
			speed = -speed;
		}
		x = x + speed;
		for (ShellObj e : GameUtils.shellLIst) {// 子弹碰撞检测
			if (this.getRec().intersects(e.getRec())) {
				life--;
				e.setX(-500);
				e.setY(500);
				GameUtils.removeLIst.add(e);
			}
			if (life <= 0) {
//				 state=4;
				 GameWin.score += 100*GameWin.bossCount;
				 GameUtils.removeLIst.add(this);
				 this.frame.boss=null;
				 
			}
		}
	}

 6.敌方子弹的生成

public void paintSelf(Graphics gImage) {
		gImage.drawImage(img, x, y, null);
		y = y + speed+GameWin.bossCount;
		if (this.getRec().intersects(this.frame.myplane.getRec())) {
			this.frame.state = 3;
		}
		if (y > 960) {
			this.setX(-200);
			this.setY(-300);
			GameUtils.removeLIst.add(this);
		}
		
	}

 7.我方子弹的生成

public void paintSelf(Graphics gImage) {
		gImage.drawImage(img, x, y, null);
		y = y - speed-GameWin.bossCount;
		if (y < 0) {
			this.setX(-200);
			this.setY(-200);
			GameUtils.removeLIst.add(this);
		}
	}

 六.不足与展望

 1.不足

没有随机生成的道具,游戏的可玩性较低。界面的设计十分简陋。

2.展望

完善上述不足。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值