用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

飞机大战小游戏

2018-03-04 作者:勿语举报

[java]代码库

package com.test.shoot;

import java.util.Random;

public class Airplane extends Flyer {
	private int speed=2;
	private int score=5;
	public int getScore() {
		return score;
	}
	
	public Airplane() {
		image=ShootGame.airplane;
		width=image.getWidth();
		height=image.getHeight();
		y=-height;
		Random r=new Random();
		x=r.nextInt(ShootGame.WIDTH-width);
	}
	@Override
	public void step() {
		// TODO Auto-generated method stub
		y+=speed;
	}
	@Override
	public boolean outOfBounds() {
		// TODO Auto-generated method stub
		return y>ShootGame.HEIGHT;
	}
}
package com.test.shoot;

import java.util.Random;

public class Bee extends Flyer{
	public static final int DOUBLE_FIRE=0;
	public static final int LIFE=1;
	private int xspeed=1;
	private int yspeed=2;
	private int awardType;
	public int getAwardType() {
		return awardType;
	}
	
	public Bee() {
		image=ShootGame.bee;
		width=image.getWidth();
		height=image.getHeight();
		y=-height;
		Random r=new Random();
		x=r.nextInt(ShootGame.WIDTH-width);
		awardType=r.nextInt(2);		
	}
	
	@Override
	public void step() {
		x+=xspeed;
		y+=yspeed;
		if(x<0||x>(ShootGame.WIDTH-width)) {
			xspeed*=-1;
		}
	}
	@Override
	public boolean outOfBounds() {
		return y>ShootGame.HEIGHT;
	}
}
package com.test.shoot;

public class Bullet extends Flyer {
	private int speed=5;
	
	public Bullet(int x,int y) {
		image=ShootGame.bullet;
		width=image.getWidth();
		height=image.getHeight();
		this.x=x;
		this.y=y;
	}

	@Override
	public void step() {
		y-=speed;
	}

	@Override
	public boolean outOfBounds() {
		return y+height<0;
	}
}
package com.test.shoot;

import java.awt.image.BufferedImage;

public abstract class Flyer {
	protected int x;
	protected int y;
	protected int width;
	protected int height;
	protected BufferedImage image;
	
	public abstract void step();
	
	public abstract boolean outOfBounds();
	
	public static boolean bang(Flyer f1,Flyer f2) {
		//求中心点
		int f1x=f1.x+f1.width/2;
		int f1y=f1.y+f1.height/2;
		int f2x=f2.x+f2.width/2;
		int f2y=f2.y+f2.height/2;
		//检测碰撞
		boolean H=Math.abs(f1x-f2x)<((f1.width+f2.width)/2);
		boolean V=Math.abs(f1y-f2y)<((f1.height+f2.height)/2);
		return H&V;
	}
}
package com.test.shoot;

import java.util.Random;

public class Hero extends Flyer {
	private int doubleFire;
	private int life;
	private int score;
	public int getLift() {
		return life;
	}
	public int getScore() {
		return score;
	}
	
	public Hero() {
		image=ShootGame.hero0;
		width=image.getWidth();
		height=image.getHeight();
		x=150;
		y=450;
		doubleFire=0;
		life=3;
		score=0;
	}
	
	@Override
	public void step() {
		Random r=new Random();
		if(r.nextInt(2)==0) {
			image=ShootGame.hero0;
		}else {
			image=ShootGame.hero1;
		}
	}
	@Override
	public boolean outOfBounds() {
		return false;
	}
	
	public void move(int x,int y) {
		this.x=x-width/2;
		this.y=y-height/2;
	}
	
	public void getScore_Award(Flyer f) {
		if(f instanceof Airplane) {
			score+=((Airplane)f).getScore();
		}else {
			if(((Bee)f).getAwardType()==Bee.DOUBLE_FIRE) {
				doubleFire+=100;
			}else {
				life+=1;
			}
		}
	}
	
	public Bullet[] shoot() {
		Bullet[] bullets=null;
		if(doubleFire!=0) {
			bullets=new Bullet[2];
			Bullet b1=new Bullet(x+width/4,y-ShootGame.bullet.getHeight());
			Bullet b2=new Bullet(x+width*3/4,y-ShootGame.bullet.getHeight());
			bullets[0]=b1;
			bullets[1]=b2;
			doubleFire-=2;
		}else {//单倍火力
			bullets=new Bullet[1];
			bullets[0]=new Bullet(x+width/2,y-ShootGame.bullet.getHeight());
		}
		return bullets;
	}
	
	public boolean hit(Flyer f) {
		boolean r=Flyer.bang(this, f);
		if(r) {
			life--;
			doubleFire=0; 
		}
		return r;
	}
}
package com.test.shoot;

import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ShootGame extends JPanel {
	public static final int WIDTH=400;
	public static final int HEIGHT=700;
	
	public static BufferedImage background;
	public static BufferedImage start;
	public static BufferedImage airplane;
	public static BufferedImage bee;
	public static BufferedImage bullet;
	public static BufferedImage hero0;
	public static BufferedImage hero1;
	public static BufferedImage pause;
	public static BufferedImage gameover;
	
	public Hero hero=new Hero();
	public Flyer[] flyers= {};
	public Bullet[] bullets= {};
	
	private int state=START;
	public static final int START=0;
	public static final int RUNNING=1;
	public static final int PAUSE=2;
	public static final int GAME_OVER=3;
	
	static {
		try {
			background=ImageIO.read(ShootGame.class.getResource("background.png"));
			airplane=ImageIO.read(ShootGame.class.getResource("airplane.png"));
			bee=ImageIO.read(ShootGame.class.getResource("bee.png"));
			bullet=ImageIO.read(ShootGame.class.getResource("bullet.png"));
			hero0=ImageIO.read(ShootGame.class.getResource("hero0.png"));
			hero1=ImageIO.read(ShootGame.class.getResource("hero1.png"));
			pause=ImageIO.read(ShootGame.class.getResource("pause.png"));
			gameover=ImageIO.read(ShootGame.class.getResource("gameover.png"));
			start=ImageIO.read(ShootGame.class.getResource("start.png"));
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		JFrame frame=new JFrame("Fly");
		frame.setSize(WIDTH, HEIGHT);
		frame.setAlwaysOnTop(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		ShootGame game=new ShootGame();
		frame.add(game);
		frame.setVisible(true);
		game.action();
	}
	public void action() {
		/*游戏开始时,鼠标事件的监听*/
		MouseAdapter l=new MouseAdapter() {
			@Override
			public void mouseMoved(MouseEvent e) {
				if(state==RUNNING) {
					int x=e.getX();
					int y=e.getY();
					hero.move(x, y);
				}
			}

			@Override
			public void mouseClicked(MouseEvent e) {
				if(state==START) {
					state=RUNNING;
					}else if(state==GAME_OVER) {
						state=START;
						flyers=new Flyer[0];
						bullets=new Bullet[0];
						hero=new Hero();
					}
			}

			@Override
			public void mouseExited(MouseEvent e) {
				if(state==RUNNING) {
					state=PAUSE;
					}
			}

			@Override
			public void mouseEntered(MouseEvent e) {
				if(state==PAUSE) {
					state=RUNNING;
					}
			}
			
			
		};
		this.addMouseMotionListener(l);
		this.addMouseListener(l);
		Timer timer=new Timer();
		timer.schedule(new TimerTask() {
			private int runTimes=0;
			@Override
			public void run() {
				if(state==RUNNING) {
					runTimes++;
					if(runTimes%40==0) {
						nextOne();
					}
					for(int i=0;i<flyers.length;i++) {
						flyers[i].step();
					}
					if(runTimes%15==0) {
						shoot();
					}
					for(int i=0;i<bullets.length;i++) {
						bullets[i].step();
					}
					hero.step();
					bang();
					hit();
					outOfBounds();
				}
				repaint();
			}
			
		}, 5,5);
	}

	@Override
	public void paint(Graphics g) {
		
		g.drawImage(background,0,0,null);//super.paint(arg0);
		
		paintHero(g);
		
		paintFlyers(g);
		
		paintBullets(g);
		
		paintScore_Life(g);
		
		if(state==START) {
			g.drawImage(start, 0, 0, null);
		}else if(state==PAUSE){
			g.drawImage(pause, 0, 0, null);
		}else if(state==GAME_OVER) {
			g.drawImage(gameover, 0, 0, null);
		}
	}
	public void paintHero(Graphics g) {
		g.drawImage(hero.image,hero.x,hero.y,null);
	}
	public void paintFlyers(Graphics g) {
		for(int i=0;i<flyers.length;i++) {
			g.drawImage(flyers[i].image,flyers[i].x,flyers[i].y,null);
		}
	}
	public void paintBullets(Graphics g) {
		for(int i=0;i<bullets.length;i++) {
			g.drawImage(bullets[i].image, bullets[i].x, bullets[i].y, null);
		}
	}
	
	/**
	 * 随机生成1个敌人
	 * 每生成一个新敌人,flyers数组都要扩容1
	 * 然后将新敌人放入数组最后一个元素
	 */
	public void nextOne() {
		Random r=new Random();
		Flyer f=null;
		if(r.nextInt(20)==0) {//只有随机数取0时,才创建蜜蜂
			f=new Bee();
		}else {//其余都是敌机
			f=new Airplane();
		}
		flyers=Arrays.copyOf(flyers, flyers.length+1);
		flyers[flyers.length-1]=f;
	}
	
	public void shoot() {
		Bullet[]newBullets=hero.shoot();
		bullets=Arrays.copyOf(bullets, bullets.length+newBullets.length);
		System.arraycopy(newBullets, 0, bullets, bullets.length-newBullets.length, newBullets.length);
	}
	
	public void bang() {
		for(int i=0;i<bullets.length;i++) {
			for(int j=0;j<flyers.length;j++) {
				if(Flyer.bang(bullets[i], flyers[j])) {
					hero.getScore_Award(flyers[j]);
					flyers[j]=flyers[flyers.length-1];
					flyers=Arrays.copyOf(flyers, flyers.length-1);
					bullets[i]=bullets[bullets.length-1];
					bullets=Arrays.copyOf(bullets, bullets.length-1);
					i--;
					break;
				}
			}
		}
	}
	public void paintScore_Life(Graphics g) {
		int x=10;
		int y=15;
		Font font=new Font(Font.SANS_SERIF,Font.BOLD,14);
		g.setFont(font);
		g.drawString("分数:"+hero.getScore(), x, y);
		y+=20;
		g.drawString("生命:"+hero.getLift(), x, y);
	}
	
	public void outOfBounds() {
		Flyer[] Flives=new Flyer[flyers.length];
		int index=0;
		for(int i=0;i<flyers.length;i++) {
			if(!flyers[i].outOfBounds()) {
				Flives[index]=flyers[i];
				index++;
			}
		}
		flyers=Arrays.copyOf(Flives, index);
		
		Bullet[] Blives=new Bullet[bullets.length];
		index=0;
		for(int i=0;i<bullets.length;i++) {
			if(!bullets[i].outOfBounds()) {
				Blives[index]=bullets[i];
				index++;
			}
		}
		bullets=Arrays.copyOf(Blives, index);
	}
	public void hit() {
		Flyer[] lives=new Flyer[flyers.length];
		int index=0;
		for(int i=0;i<flyers.length;i++) {
			if(!hero.hit(flyers[i])) {
				lives[index]=flyers[i];
				index++;
			}
		}
		if(hero.getLift()<=0) {
			state=GAME_OVER;
		}
		flyers=Arrays.copyOf(lives, index);
	}
}

[代码运行效果截图]


飞机大战小游戏


分享到:
更多

网友评论    (发表评论)

共3 条评论 1/1页

发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。