在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Java游戏开发 → 飞机大战小游戏源码(java版)

飞机大战小游戏源码(java版)

Java游戏开发

下载此实例
  • 开发语言:Java
  • 实例大小:0.63M
  • 下载次数:14
  • 浏览次数:328
  • 发布时间:2019-09-23
  • 实例类别:Java游戏开发
  • 发 布 人:lixian
  • 文件格式:.zip
  • 所需积分:2
 相关标签: 飞机大战 飞机

实例介绍

【实例简介】

【实例截图】

from clipboard


from clipboard

from clipboard


【核心代码】

package com.tarena.fly;
import java.awt.Font;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;


/***主程序**/
public class ShootGame extends JPanel{//窗口类JPanel,软件自带
	public static final int WIDTH=525;//常量用大写//窗口的宽
	public static final int HEIGHT=600;//窗口的高
	
	/** 游戏的当前状态: START RUNNING PAUSE GAME_OVER */
	private int state;
	private static final int START = 0;
	private static final int RUNNING = 1;
	private static final int PAUSE = 2;
	private static final int GAME_OVER = 3;
	
	public static BufferedImage background;//背景图
	public static BufferedImage start;//启动图
	public static BufferedImage pause;//暂停图
	public static BufferedImage gameover;//敌机图
	public static BufferedImage bigAirplane;//敌机图
	
	public static BufferedImage airplane;//小蜜蜂图
	public static BufferedImage bee;//子弹图
	public static BufferedImage hero0;//英雄机
	public static BufferedImage hero1;//英雄机
	public static BufferedImage bullet;
	private Hero hero=new Hero();//英雄机对象
	private BigAirplane b =new BigAirplane();
	private FlyingObject[] flyings={};//敌人
	private Bullet[] bullets={};//子弹数组
	private Bullet1[] bullets1={};//子弹数组

	
	static{//初始化静态资源     图片
		try{
			background=ImageIO.read(ShootGame.class.getResource("background.png"));
			bigAirplane=ImageIO.read(ShootGame.class.getResource("bigAirplane.png"));
			start=ImageIO.read(ShootGame.class.getResource("start.png"));
			pause=ImageIO.read(ShootGame.class.getResource("pause.png"));
			gameover=ImageIO.read(ShootGame.class.getResource("gameover.png"));
			airplane=ImageIO.read(ShootGame.class.getResource("airplane.png"));
			bee=ImageIO.read(ShootGame.class.getResource("bee.png"));
			hero0=ImageIO.read(ShootGame.class.getResource("hero1.png"));
			hero1=ImageIO.read(ShootGame.class.getResource("hero0.png"));
			bullet=ImageIO.read(ShootGame.class.getResource("bullet.png"));
			
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	
	private Timer timer;//定时器
	private int intervel=10;//定时器的时间间隔(以毫秒为单位)
	
	
	
	/****随机生成敌人(敌机 小蜜蜂)***/
	public static FlyingObject nextOne(){
		Random rand=new Random();
		int type=rand.nextInt(20);
		if(type==0){
			return new Bee();//随机为0时返回蜜蜂
		}
		if(type==1){
			return new BigAirplane();
		}
		else{
			return new Airplane();//随机为1――――19时返回敌机
		}
	}
	
	
	
	/***敌人入场**/
	int fkyEnteredUbdex=0;//敌人入场的计数
	public void enterAction(){//10毫秒走一次
		fkyEnteredUbdex  ;//10毫秒增1
		if(fkyEnteredUbdex%40==0){//没400毫秒走一次(10*40)
			FlyingObject one=nextOne();//获取敌人随机对象
			flyings=Arrays.copyOf(flyings,flyings.length 1);//扩容
			flyings[flyings.length-1]=one;//存到最后一个元素
			
			
		}
	}
	

	
	
	public void stepAction(){//10毫秒走一次
		hero.step();
		for(int i=0;i<flyings.length;i  ){
			flyings[i].step();
		}
		for(int i=0;i<bullets.length;i  ){
			bullets[i].step();
		}
		for(int i=0;i<bullets1.length;i  ){
			bullets1[i].step();
		}
		
	}
	
	
	/** 画游戏状态 */
	public void paintState(Graphics g) {
		switch (state) {
		case START: // 启动状态
			g.drawImage(start, 60, 0, null);
			break;
		case PAUSE: // 暂停状态
			g.drawImage(pause, 60, 0, null);
			break;
		case GAME_OVER: // 游戏终止状态
			g.drawImage(gameover, 60, 0, null);
			break;
		}
	}

	

	int shootIndex=0;
	public void  shootAction(){//10毫秒走一次
		shootIndex  ;
		if(shootIndex%20==0){//每300(10*30)毫秒走一次
			Bullet[] bs=hero.shoot();//获取英雄机发射的子弹
			bullets =Arrays.copyOf(bullets,bullets.length bs.length);
			System.arraycopy(bs,0,bullets,bullets.length-bs.length,bs.length);	
			
		}
		if(shootIndex%30==0){//每300(10*30)毫秒走一次
			for(int i=0;i<flyings.length;i  ){
				Bullet1[] bs1=flyings[i].shoot1();
				bullets1 =Arrays.copyOf(bullets1,bullets1.length bs1.length);
				System.arraycopy(bs1,0,bullets1,bullets1.length-bs1.length,bs1.length);	
			}
			
			
			
		}
		
	}
	
	
	
	/***一个子弹与所有敌人撞****/
	public void bangAction(){
		for(int i=0;i<bullets.length;i  ){
			bang(bullets[i]);//一个子弹与所有敌人撞
		}
	}

	
	/** 画分数 */
	public void paintScore(Graphics g) {
		int x = 10; // x坐标
		int y = 25; // y坐标
		Font font = new Font(Font.SANS_SERIF, Font.BOLD, 22); // 字体
		g.setColor(new Color(0xFF0000));
		g.setFont(font); // 设置字体
		g.drawString("SCORE:"   score, x, y); // 画分数
		y  = 20; // y坐标增20
		g.drawString("LIFE:"   hero.getLife(), x, y); // 画命
	}
	
	/** 检查游戏结束 */
	public void checkGameOverAction() {
		if (isGameOver()) {
			state = GAME_OVER; // 改变状态
		}
	}
	
	/** 检查游戏是否结束 */
	public boolean isGameOver() {
		
		for (int i = 0; i < flyings.length; i  ) {
			int index = -1;
			FlyingObject obj = flyings[i];

			if (hero.hit(obj)) { // 检查英雄机与飞行物是否碰撞
				hero.subtractLife(); // 减命
				hero.setDoubleFire(0); // 双倍火力解除
				index = i; // 记录碰上的飞行物索引
			}
			if (index != -1) {
				FlyingObject t = flyings[index];
				flyings[index] = flyings[flyings.length - 1];
				flyings[flyings.length - 1] = t; // 碰上的与最后一个飞行物交换

				flyings = Arrays.copyOf(flyings, flyings.length - 1); // 删除碰上的飞行物
			}
		}
		
		return hero.getLife() <= 0;
	}
	
	
	
	
	private int score=0;//声明
	/** 子弹和飞行物之间的碰撞检查 */
	public void bang(Bullet bullet) {
		int index = -1; // 击中的飞行物索引
		for (int i = 0; i < flyings.length; i  ) {
			FlyingObject obj = flyings[i];
			if (obj.shootBy(bullet)) { // 判断是否击中
				index = i; // 记录被击中的飞行物的索引
				break;
			}
		}
		
		if (index != -1) { // 有击中的飞行物
			FlyingObject one = flyings[index]; // 记录被击中的飞行物

			FlyingObject temp = flyings[index]; // 被击中的飞行物与最后一个飞行物交换
			flyings[index] = flyings[flyings.length - 1];
			flyings[flyings.length - 1] = temp;

			flyings = Arrays.copyOf(flyings, flyings.length - 1); // 删除最后一个飞行物(即被击中的)

			// 检查one的类型(敌人加分,奖励获取)
			if (one instanceof Enemy) { // 检查类型,是敌人,则加分
				Enemy e = (Enemy) one; // 强制类型转换
				score  = e.getScore(); // 加分
			} else if (one instanceof Award) { // 若为奖励,设置奖励
				Award a = (Award) one;
				int type = a.getType(); // 获取奖励类型
				switch (type) {
				case Award.DOUBLE_FIRE:
					hero.addDoubleFire(); // 设置双倍火力
					break;
				case Award.LIFE:
					hero.addLife(); // 设置加命
					break;
				}
			}
		}
	}
	
	
	/** 删除越界飞行物及子弹 */
	public void outOfBoundsAction() {
		int index = 0; // 索引
		FlyingObject[] flyingLives = new FlyingObject[flyings.length]; // 活着的飞行物
		for (int i = 0; i < flyings.length; i  ) {
			FlyingObject f = flyings[i];
			if (!f.outOfBounds()) {
				flyingLives[index  ] = f; // 不越界的留着
			}
		}
		flyings = Arrays.copyOf(flyingLives, index); // 将不越界的飞行物都留着

		index = 0; // 索引重置为0
		Bullet[] bulletLives = new Bullet[bullets.length];
		for (int i = 0; i < bullets.length; i  ) {
			Bullet b = bullets[i];
			if (!b.outOfBounds()) {
				bulletLives[index  ] = b;
			}
		}
		bullets = Arrays.copyOf(bulletLives, index); // 将不越界的子弹留着
	}
	
	


	
	/***启动执行***/
	public void action(){	
		MouseAdapter l = new MouseAdapter(){	
			public void mouseMoved(MouseEvent e){// 鼠标移动
				int x=e.getX();
				int y=e.getY();
			hero.moveTo(x,y);
			}
			
			public void mouseEntered(MouseEvent e) { // 鼠标进入
				if (state == PAUSE) { // 暂停状态下运行
					state = RUNNING;
				}
			}

			@Override
			public void mouseExited(MouseEvent e) { // 鼠标退出
				if (state == RUNNING) { // 游戏未结束,则设置其为暂停
					state = PAUSE;
				}
			}

			@Override
			public void mouseClicked(MouseEvent e) { // 鼠标点击
				switch (state) {
				case START:
					state = RUNNING; // 启动状态下运行
					break;
				case GAME_OVER: // 游戏结束,清理现场
					flyings = new FlyingObject[0]; // 清空飞行物
					bullets = new Bullet[0]; // 清空子弹
					hero = new Hero(); // 重新创建英雄机
					score = 0; // 清空成绩
					state = START; // 状态设置为启动
					break;
				}
				
			}
			
		};
		
		this.addMouseListener(l);//处理鼠标操作事件
		this.addMouseMotionListener(l);//处理鼠标滑动事件
		timer=new Timer();//创建定时器的对象
		timer.schedule(new TimerTask(){
			public void run(){//定时干的事,10毫秒走一次
				if(state==RUNNING){
				enterAction();//敌人(敌机 小蜜蜂)10毫米走一次	
				stepAction();//移动步数
				shootAction();//子弹入场(英雄机发射子弹)
				bangAction();//子弹与敌人碰撞
				isGameOver();//英雄机碰撞判断
				checkGameOverAction(); //检查游戏结束
				outOfBoundsAction();//删除越界飞行物及子弹
				}
				repaint();//重绘(调用paint方法)
			}
		},intervel,intervel);//时间间隔
		
	}
	
		
	public void paint(Graphics g){	
		g.drawImage(background,0,0,null);//背景图与窗口重合
		paintHero(g);//画英雄机对象
		paintFlyingobjects(g);//画敌人
		paintBullets(g);//画小蜜蜂
		paintBullets1(g);//画小蜜蜂
		paintScore(g);//画分和画命
		paintState(g); // 画游戏状态
	}
	
	
	public void paintHero(Graphics g){
			g.drawImage(hero.image,hero.x,hero.y,null);
	}
	public void paintFlyingobjects(Graphics g){
		for(int i=0;i<flyings.length;i  ){
			FlyingObject f=flyings[i];
			g.drawImage(f.image,f.x,f.y,null);
		}
	}
	public void paintBullets(Graphics g){
		for(int i=0;i<bullets.length;i  ){
			Bullet b=bullets[i];
			g.drawImage(b.image,b.x,b.y,null);
		}
	}
	public void paintBullets1(Graphics g){
		for(int i=0;i<bullets1.length;i  ){
			Bullet1 b=bullets1[i];
			g.drawImage(b.image,b.x,b.y,null);
		}
	}

	
	public static void main(String[] args) {
		JFrame frame=new JFrame("FLY");//窗口对象
		ShootGame game=new ShootGame();//面板
		frame.add(game);//将面板添加到窗口之中
		frame.setSize(WIDTH,HEIGHT);//设置窗口大小
		frame.setAlwaysOnTop(true);//设置窗口一直在前面,居上
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置默认关闭操作――――关闭窗口时的操作
		frame.setLocationRelativeTo(null);//设置相对位置为null,即居中
		frame.setVisible(true);//1.设置窗口可见       2.尽快调用paint()方法 
		game.action();//启动执行
	}
	
}

标签: 飞机大战 飞机

实例下载地址

飞机大战小游戏源码(java版)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警