基本信息
源码名称:飞机大战小游戏源码(java版)
源码大小:0.63M
文件格式:.zip
开发语言:Java
更新时间:2019-09-23
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍




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();//启动执行
	}
	
}