在好例子网,分享、交流、成长!
您当前所在位置:首页Others 开发实例一般编程问题 → java飞机大战游戏源码(带音乐).zip

java飞机大战游戏源码(带音乐).zip

一般编程问题

下载此实例
  • 开发语言:Others
  • 实例大小:1.13M
  • 下载次数:3
  • 浏览次数:325
  • 发布时间:2019-09-17
  • 实例类别:一般编程问题
  • 发 布 人:robot666
  • 文件格式:.zip
  • 所需积分:2
 相关标签: java 飞机大战 ZIP 源码 音乐

实例介绍

【实例简介】

【实例截图】


from clipboard


from clipboard

【核心代码】

package cn.ucai.war;

import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.Color;
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.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

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

//import com.sun.org.apache.xerces.internal.util.SynchronizedSymbolTable;


// JPanel 理解为画布
public class ShootGame extends JPanel {
	public static final int WIDTH = 400; // 宽
	public static final int HEIGHT = 654; // 高
	public static BufferedImage background; //生成的图片在内存里有一个图像缓冲区
	public static BufferedImage start;
	public static BufferedImage gameover;
	public static BufferedImage airplane;
	public static BufferedImage pause;
	public static BufferedImage bee;
	public static BufferedImage bullet;
	public static BufferedImage hero0;
	public static BufferedImage hero1;
	
	public Hero hero = new Hero();//声明主机对象
	public Bullet[] bullets = {};//子弹对象的数组
	public FlyingObject[] flyings = {}; //敌机和小蜜蜂
	
	// 静态代码块,在类加载的时候就执行,只执行一次	
	static{
		//加载图片资源
		try {
			background = ImageIO.read(ShootGame.class.getResource("background.png"));
			start = ImageIO.read(ShootGame.class.getResource("start.png"));
			gameover = ImageIO.read(ShootGame.class.getResource("gameover.png"));
			airplane = ImageIO.read(ShootGame.class.getResource("airplane.png"));
			pause = ImageIO.read(ShootGame.class.getResource("pause.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"));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	public static void main(String[] args) {
		JFrame frame = new JFrame("飞机大战"); //创建窗体并未窗体设置标题
		ShootGame game = new ShootGame();
		frame.add(game);
		frame.setSize(WIDTH, HEIGHT);//设置窗体的宽高
		frame.setIconImage(new ImageIcon("D:\\Projects\\JavaProjects\\MyPlane\\src\\cn\\ucai\\war\\icon.jpg").getImage());//设置图标
		frame.setLocationRelativeTo(null);//默认显示在屏幕的中间
		// 点击关闭窗口,小红点消失,表示程序停止,避免资源的浪费		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true); //将窗体显示出来
		game.action();
		// 里面放入音乐的绝对路径		
		playMusic("D:\\Projects\\JavaProjects\\MyPlane\\src\\cn\\ucai\\war\\BinaryRainMusic.wav");
		
	}
	// 添加播放音乐的方法	
	static void playMusic(String strUrl){//背景音乐播放  
        try {  
        	// 引入音乐文件所在的路径  
            File file = new File(strUrl); 
            URL url = file.toURL();  
            AudioClip aClip = Applet.newAudioClip(url);  
            //  aau.play();//播放一遍   
            aClip.loop();//循环播放  
            // 循环播放 aau.play()  
            //单曲 aau.stop()停止播放  
        } catch (MalformedURLException e) {  
            e.printStackTrace();  
        }  
    }
	// 导入java util这个包
	private Timer timer; //定时器
	private int intervel = 10; //时间间隔(毫秒)
	private int state;//游戏状态
	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;

	// 创建方法,处理逻辑	
	private void action() {
		// 创建鼠标适配器对象,监听鼠标事件,并且重写鼠标点击、移动的方法		
		MouseAdapter mAdapter = new MouseAdapter() {
			
			//重写鼠标点击			
			@Override
			public void mouseClicked(MouseEvent e) {
				// TODO Auto-generated method stub
				super.mouseClicked(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;
				default:
					break;
				}
				
			}
			//重写鼠标移动			
			@Override
			public void mouseMoved(MouseEvent e) {
				// TODO Auto-generated method stub
				super.mouseMoved(e);
				if (state == RUNNING) {
					int x = e.getX();
					int y = e.getY();
					hero.moveTo(x, y);
					System.out.println(x);
					System.out.println(y);
					System.out.println();
				}
				
			}
		};
		this.addMouseListener(mAdapter); //添加鼠标点击事件的监听
		this.addMouseMotionListener(mAdapter); //添加鼠标移动事件的监听
		
		timer = new Timer();
		// 给定时器设置进度 	 
		/*
		 * 参数一:被定时器执行的任务
		 * 参数二:延时多少毫秒去执行run()里面的内容
		 * 参数三:定时器执行的周期
		 */
		/*
		 * 没有名字的内部类:
		 * new 父类构造器(){
		 * 		匿名内部类的类体部分
		 * }
		 * 不能反复使用
		 * 消除坠余代码
		 */
		timer.schedule(new TimerTask() {
			
			@Override
			public void run() {
				if (state == RUNNING) {
					enterAction(); //在定时器中,如果游戏处于运行,
					stepAction();
					shootAction();
					bangAction();
					checkGameOverAction();
				}
				repaint(); //重新绘制(提供的)
			}
		}, intervel,intervel);
	}
	//检查游戏是否结束	
	public void checkGameOverAction() {
		if (isGameOver()) {
			state = GAME_OVER;
		}
	}
	private 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);
				
				
			}
		}
		//当主机的生命 <0的时候,游戏结束		
		return hero.getLife()<0;
	}
	//验证碰撞	
	//子弹与敌人碰撞	
	protected void bangAction() {
		for (int i = 0; i < bullets.length; i  ) {
			bang(bullets[i]); //创建此方法
		}
	}
	//处理碰撞逻辑
	private 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;
			}
		}
		//被击中
		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(); //消灭一个敌机  5 
			}
			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;
				default:
					break;
				}
				
			}
			
		}
	}
	int shootIndex = 0; //射击计数
	//子弹入场	
	protected void shootAction() {
		shootIndex  ;
		// 没30毫秒发射一颗子弹	
		//	每20毫秒计时器调用一次 shootAction()方法,射击次数 1	
		if (shootIndex %10 ==0) {
			Bullet[] bs = hero.shoot(); //主机发射的子弹
			//bs的长度 1 ,新增的子弹个数,每10毫秒新增一个
			bullets = Arrays.copyOf(bullets, bullets.length bs.length);
			/*
			 * 复制数组,返回数组原来的长度
			 * 参数一:源数组
			 * 参数二:源数组要复制的起始位置
			 * 参数三:目的数组
			 * 参数四:目的数组放置的起始位置
			 * 参数五:复制的长度
			 */
			System.arraycopy(bs, 0, bullets, bullets.length-bs.length, bs.length);
			System.out.println("bs的长度" bs.length);
			System.out.println(bullets.length);
		}
	}
	// 飞行物动起来	
	public void stepAction() {
		//敌人走一步		
		for(int i =0;i<flyings.length;i  ){
			flyings[i].step();
		}
		//子弹走一步
		for(int i =0; i<bullets.length;i  ){
			bullets[i].step();
		}
		//主机走步
		hero.step();
	}
	//实例化 一个入场倒计时变量	
	int flyEnteredIndex = 0; 
	//飞行物入场的方法,进入画面
	public void enterAction() {
		flyEnteredIndex  ;
		//到40毫秒,生成一个敌人		
		if (flyEnteredIndex %40 == 0) {
			FlyingObject obj = nextOne();
			/*
			 * 参数一:被copy的数组
			 * 参数二:新数组的长度,因为要添加敌人对象,所以长度加1
			 */
			flyings = Arrays.copyOf(flyings, flyings.length 1);
			flyings[flyings.length-1] = obj; //将敌人加入到flyings数组中
		}
	}
	
	//生成飞行物对象
	public static FlyingObject nextOne(){
		Random random = new Random();
		int type  = random.nextInt(20); // 0 --19
		if (type == 0 ) {
			return new Bee(); //5%的概率去生成小蜜蜂
		}else{
			return new Airplane(); //95% 的概率生成敌机
		}
	}
	

	// 重写paint 方法	,并且传入画笔参数(提供的)
    @Override
	public void paint(Graphics g ){
		
		g.drawImage(background, 0, 0, null); //绘制背景
		paintScore(g);
		paintHero(g);
		paintState(g);
		paintBullet(g);
		paintFlyingObject(g);
		
	}
//     533835728 山东农大 优才实践课
	private int score = 0;//声明变量得分
	// 绘制得分和生命	
	public void paintScore(Graphics g){
		// 得分的x , y坐标		
		int x = 10;
		int y = 25;
		Font font = new Font(Font.SANS_SERIF,Font.BOLD,14);//设置字体类型
		g.setColor(Color.blue);//设置字体颜色
		g.setFont(font);//将字体设置到画笔上
		g.drawString("Score:" score, x, y); //在画笔上绘制
		y  = 20; //修改y的坐标
		//绘制主机的生命数		
		g.drawString("Lift:" hero.getLife(), x, y);
	}
	//绘制主机
	private void paintHero(Graphics g){
		g.drawImage(hero.image, hero.x, hero.y, null);
	}
	
	//	绘制游戏状态
	private void paintState(Graphics g){
		switch (state) {
		//开始状态		
		case START:
			g.drawImage(start, 0, 0, null);
			break;
        //暂停状态			
		case PAUSE:
			g.drawImage(pause, 0, 0,  null);
		//结束			
		case GAME_OVER:
			g.drawImage(gameover, 0, 0, null);
		default:
			break;
		}
	}
	
    //绘制子弹	
	public void paintBullet(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 paintFlyingObject(Graphics g){
		for(int i = 0;i<flyings.length;i  ){
			g.drawImage(flyings[i].image, flyings[i].x, flyings[i].y, null);
		}
	}
	
	
	
	
	
	
}






实例下载地址

网友评论

发表评论

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

查看所有0条评论>>

小贴士

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

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

关于好例子网

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

;
报警