Java飞机大战0_3

一.实验代码

//Hero.java
package sxau_rjxy;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;

//我方飞机
public class Hero {
		public Hero(int x, int y, int r) {
			super();
			this.x = x;
			this.y = y;
			this.r = r;
		}

		public int getX() {
			return x;
		}
		public void setX(int x) {
			this.x = x;
		}
		public int getY() {
			return y;
		}
		public void setY(int y) {
			this.y = y;
		}
		public int getR() {
			return r;
		}
		public void setR(int r) {
			this.r = r;
		}
		private int x;
		private int y;
		private int r;
		private int score;
		private int blood=100;
		private int allBlood=100;
		
		public int getBlood() {
			return blood;
		}

		public void setBlood(int blood) {
			this.blood = blood;
		}

		public int getScore() {
			return score;
		}

		public void setScore(int score) {
			this.score = score;
		}

		//自定义的paint()方法,名字随意
		public void paint(Graphics g) {
			// TODO Auto-generated method stub
			Color c = g.getColor();//画笔有一个自带的颜色,我们通过这句话可以保存原始,在做完自己的操作后可以设回初始.
			g.setColor(Color.blue);//我机蓝色
			g.fillOval(x-r, y-r, r*2,r*2);
			
			//g.drawRect(50, 50,480, 60);//空心的
			g.setColor(Color.orange);//满血时
			g.fillRect(50, 50, allBlood, 60);
			
			g.setColor(Color.red);//当前血量
			g.fillRect(50, 50, blood, 60);
			
			g.setColor(Color.BLUE);//如何分清的颜色?
			g.setFont(new Font("楷体", Font.BOLD, 60));//设置了分数的相关信息
			g.drawString("分数:"+ this.score,50,50);//分数的位置
			
			g.setColor(c);
		}
}

//Plane.java
package sxau_rjxy;

import java.awt.Color;
import java.awt.Graphics;
//敌机
public class Plane {
	
	public Plane(int x, int y, int r) {
		super();
		this.x = x;
		this.y = y;
		this.r = r;
	}

	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
	public int getR() {
		return r;
	}
	public void setR(int r) {
		this.r = r;
	}
	private int x;
	private int y;
	private int r;
	private int speed;
	
	public int getSpeed() {
		return speed;
	}

	public void setSpeed(int speed) {
		this.speed = speed;
	}

	//自定义的paint()方法,名字随意
	public void paint(Graphics g) {
		// TODO Auto-generated method stub
		Color c = g.getColor();
		g.setColor(Color.black);//敌机黑色
		g.fillOval(x-r, y-r, r*2,r*2);
		g.setColor(c);
	}
	
}

//Bullet.java
package sxau_rjxy;

import java.awt.Color;
import java.awt.Graphics;

public class Bullet {
	public Bullet(int x, int y, int r) {
		super();
		this.x = x;
		this.y = y;
		this.r = r;
	}

	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
	public int getR() {
		return r;
	}
	public void setR(int r) {
		this.r = r;
	}
//Mygame.java
package sxau_rjxy;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.JFrame;

public class Mygame {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		JFrame jf = new JFrame("飞机大战");//创建窗体
	    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
		jf.setBounds(0, 0, dim.width, dim.height);
		//jf.setBackground(Color.red);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		
		MyJPanel panel= new MyJPanel(dim);//相当于管家
		jf.add(panel);
		/*
		 * Thread t = new Thread(panel);
		 * t.start();
		*/
		jf.setResizable(false);
		jf.setVisible(true);
	}
}

private int x;private int y;private int r;//自定义的paint()方法,名字随意public void paint(Graphics g) {// TODO Auto-generated method stubColor c = g.getColor();g.setColor(Color.white);//子弹白色g.fillOval(x-20, y-r, r*2,r*2);g.setColor(c);}}


   
   
//MyJPanel.java
package sxau_rjxy;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.JPanel;

public class MyJPanel extends JPanel implements Runnable{
	
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		/*while(true){
			int y = p.getY();
			p.setY(y++);
		    repaint();
		   try {
			   Thread.sleep(100);
			   } catch (InterruptedException e){
				   // TODO Auto-generated catch block
				   e.printStackTrace();
				   }	   
		   }*/
		int y;
		int count =0;
		while(true){
			//使子弹慢下来产生,改变被除的也可以改变间距
			if(count%10==0){
			Bullet bullet = new Bullet(hero.getX(),hero.getY()-hero.getR(),5);
			bullets.add(bullet);
			}
			count++;
			
			//让飞机动起来
			for(int i= 0;i<planes.size();i++){
				Plane p=planes.get(i);
				//y=p.getY()+1;
				y=p.getY()+p.getSpeed();//把1变成y.getSpeed()使得飞机速度真正改变
				p.setY(y);
				if(y>bgy){
					p.setY(0);//开始循环了,但运行出来是由于横坐标没变,显示一样
					p.setX((int)(Math.random()*(bgx-60)+30));//两个一起则图案显示不同,随机
				}
				if(isHit(p,hero)){
					//不移除,改变飞机的位置即可
					p.setY(0);
					p.setX((int)(Math.random()*(bgx-60)+30));
					hero.setBlood(hero.getBlood()-10);
				}
			}
			
			//让子弹动起来
			for(int i= 0;i<bullets.size();i++){
				Bullet b=bullets.get(i);
				y=b.getY()-10;//速度减慢,间距也可以被改变
				//使子弹不越界
				if(y<0){
					bullets.remove(i);
				}
				b.setY(y);
				
				for(int j=0;j<planes.size();j++){
					Plane p= planes.get(j);
					
					if(isHit(b,p)){
						bullets.remove(j);
						/*bullets.remove(int index);
						 * bullets.remove(Object o);
						 * 方法的最终结果是一样的,传进去的参数类型不同,但是内容是一样的
						 */
						p.setY(0);
						p.setX((int)(Math.random()*(bgx-60)+30));
						hero.setScore(hero.getScore()+10);//设置分数
					}
						
				}
			}
			//bullet.setY(bullet.getY()-1);//让子弹动起来,即坐标变化
			
			try {
				Thread.sleep(20);//如果没sleep,那么它屏幕上没圈了,因为太快
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			repaint();//没它之前,运行出的结果是静态的,因为没有重新画它
		}//这是一个死循环,while(true)
	}

//判断飞机和hero是否相撞
	private boolean isHit(Plane p, Hero hero) {
		// TODO Auto-generated method stub
		if((hero.getX()-p.getX())*(hero.getX()-p.getX())+(hero.getY()-p.getY())*(hero.getY()-p.getY())<=(hero.getR()+p.getR())*(hero.getR()+p.getR())){
			return true;
		}
		return false;
	}
	//判断子弹是否击中飞机
	private boolean isHit(Bullet b,Plane p) {
		// TODO Auto-generated method stub
		if((b.getX()-p.getX())*(b.getX()-p.getX())+(b.getY()-p.getY())*(b.getY()-p.getY())<=(b.getR()+p.getR())*(b.getR()+p.getR())){
			return true;
		}
		return false;
	}

	//Plane p = new Plane(200,200,50);
	//Plane[] planes = new Plane[10];
	ArrayList<Plane> planes = new ArrayList<Plane>();//保存飞机的引用,才能画它;定义了容器
	ArrayList<Bullet> bullets = new ArrayList<Bullet>();
	//Plane hero= new Plane(bgx, bgy, 30);//不对,不能共用敌机的类
	Hero hero;
	Bullet bullet;
	
	@Override
	//重写的paint()方法,系统调用
	public void paint(Graphics g) {
		// TODO Auto-generated method stub
		//super.paint(g);
		//Color c = g.getColor();
		//g.setColor(Color.red);
		//g.fillOval(p.getX()-p.getR(), p.getY()-p.getR(), p.getR()^2,p.getR());
		//g.setColor(c);
		super.paint(g);
		//p.paint(g);

		
		/*画敌机
		 * for(int i =0;i<planes.size();i++){
			Plane p= planes.get(i);
			p.paint(g);
		}
		*/
		//画敌机
		Iterator<Plane> it = planes.iterator();
		while(it.hasNext()){
			Plane p = it.next();
			p.paint(g);
			}
		
		//画子弹
		for(int i =0;i<bullets.size();i++){
			Bullet b=bullets.get(i);
			b.paint(g);
			}
		
		//画hero
		hero.paint(g);
		//bullet.paint(g);
		
		
	}
	
	
	private int bgx;
	private int bgy;
	
	public MyJPanel (Dimension dim){
		bgx =dim.width;
		bgy =dim.height;
		
		this.setBackground(Color.lightGray);
		//创建飞机
		for(int i = 0;i<=10;i++){
			Plane p= new Plane((int)(Math.random()*(bgx-60)+30),(int)(Math.random()*(bgy-60)+30),30);
			p.setSpeed((int)(Math.random()*5+1));//使飞机的速度不一样
			planes.add(p);
		}
		
		
		
		
		hero= new Hero(bgx/2, bgy-60, 30);
		/*
		 * Hero hero = new Hero(bgx/2, bgy-60, 30);
		 * 因为前面已经定义过Hero hero ;
		 * 所以运行出错,空白一片;
		*/
		bullet = new Bullet(hero.getX(),hero.getY()-hero.getR(),5);
		this.addMouseMotionListener(new MyMonitor());
		this.addKeyListener(new MyMonitor2());
		this.setFocusable(true);//必须要这,监听键盘时必须加,不然没反应
		new Thread(this).start();//线程启动第二种方法
	}
	
//内部类
	private class MyMonitor extends MouseMotionAdapter{

		@Override
		public void mouseDragged(MouseEvent e) {
			// TODO Auto-generated method stub
			//super.mouseDragged(e);
			hero.setX(e.getX());
			hero.setY(e.getY());
		}

	}
	
	private class MyMonitor2 extends KeyAdapter{

		@Override
		public void keyPressed(KeyEvent e) {
			// TODO Auto-generated method stub
			super.keyPressed(e);
			//System.out.println("ss");//用来测试键盘事件是否响应了
			int code = e.getKeyCode();
			if(code==KeyEvent.VK_LEFT){
				hero.setX(hero.getX()-10);
			}
			if(code==KeyEvent.VK_RIGHT){
				hero.setX(hero.getX()+10);
			}
			if(code==KeyEvent.VK_UP){
				hero.setY(hero.getY()-10);
			}
			if(code==KeyEvent.VK_DOWN){
				hero.setY(hero.getY()+10);
			}
		}
	}
}

二.运行结果





三.实验心得

06.29

 

1.运行时会有卡顿现象,原因?

电脑卡,或者是由于未关闭进程,造成多个程序占用资源,系统卡机

2.在运行时判断hero和飞机相撞时出现问题,没碰到就减血了,原因?

g.fillOval(x-r,y-r,r*2,r*2);最后传进的两个参数是圆的直径,所以必须得表示圆的直径,如果是其他值,那么最后在设置撞击的条件时会有冲突

 

3.设置的颜色程序如何实现的自己不会出错?

 

 一旦设置一个g.color, 那么他就自动画一个括号, 包含了他下边的所有对象, 就是给这个括号里边的所有对象上色, 当系统读取到下一个g.color的时候 这个括号就自动终止, 顺序不对的话就会出现今天的那个问题, 血条是橙色的 ,血槽却是红的。 先后顺序就代表了他的图层顺序, 因为它是先定义的,所以先显示。 

4.画笔有一个自带的颜色,我们通过这句话可以保存原始,在做完自己的操作后可以设回初始.

eg:Color c = g.getColor();g.setColor(c);

 

5.setFont(new Font(String name,int style,int size))用来设置字体的相关信息.eg:

g.setFont(new Font("楷体", Font.BOLD, 60));//设置了分数的相关信息

g.drawString("分数:"+this.score,50,50);//分数的位置

 

6.bullets.remove(j);或者bullets.remove(i);]

 j是序号,i是下标,调用的函数不同,原因具体如下:

/*bullets.remove(int index);

 * bullets.remove(Object o);

 * 方法的最终结果是一样的,传进去的参数类型不同,但是内容是一样的

*/

 

7.如何判断飞机和hero是否相撞?

private boolean isHit(Plane p, Hero hero) {if((hero.getX()-p.getX())*(hero.getX()-p.getX())+(hero.getY()-p.getY())*(hero.getY()-p.getY())<=(hero.getR()+p.getR())*(hero.getR()+p.getR())){

return true;

}

return false;

}

 

if(isHit(p,hero)){

//不移除,改变飞机的位置即可

p.setY(0);

p.setX((int)(Math.random()*(bgx-60)+30));

hero.setBlood(hero.getBlood()-10);

}


基于Java飞机大战游戏主要需要我方飞机和敌方飞机,还有子弹,特殊nPC,开始背景,结束背景,以及背景音乐。我方飞机可以随意移动,敌方飞机无规律出现。游戏玩家通过鼠标移动控制飞机移动,我方飞机在游戏开始时就一直能发射子弹,当我方子弹碰到敌方飞机时,敌方飞机消失。当玩家飞机碰到敌方子弹时,生命值减一,直到玩家飞机生命值为一时,游戏结束。基本模块包括:游戏状态控制功能模块、游戏难度的调整模块、游戏界面绘画功能模块、玩家游戏控制功能模块等。本系统结构如下: (1)游戏状态控制功能模块:游戏的状态控制包括运行及结束游戏,首先进入游戏的开始页面,在游戏进行时,玩家必须躲避或者击落敌方飞机,玩家飞机的生命值降低为0的时候游 戏就会结束,弹出游戏结束界面 (2)游戏难度的调整模块:玩家玩的时间越长游戏的难度越高,敌方飞机的数量越多、敌方飞机出现的频率越高,玩家保证飞机的存活的难度越高,操作难度相应也高。 (3)游戏界面绘画功能模块:左上角会显示玩家飞机当前生命值,游戏时间,当前分数,其他地方用来输出玩家对我方飞机的控制与敌方飞机的动作显示 (4)玩家游戏控制功能模块: 玩家可以通过控制鼠标或者键盘来控制方飞机(Hero airplane)的移动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值