【Java-21】Java小项目:飞机大战

1.功能:

键盘上下左右键控制飞机走向以躲避随机飞过来的子弹,存活时间越长得分越高

2.主要界面:

3.页面加载框架类:

package myPackage;

import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Random;

/**
 * 加载出窗口
 * 
 * @author My_2
 * 
 */
public class gameFrame extends Frame {
	/**
	 * 加载窗口
	 */
	public void lunch() {
		setSize(Constant.Frame_wide, Constant.Frame_high);// 画布大小,windows类下面方法,继承得到的
		setLocation(0, 0);// 画布左上角位置
		setVisible(true);// 画布可见

		// addWindowListener方法作用是调出来的窗口能×掉
		// 调用addWindowListener方法,WindowAdapter属于方法addWindowListener的内部类
		// new WindowAdapter()为创建对象,这个对象要重写方法
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
			

		});
		new Painthread().start();// 启动线程
	}

	// window是Frame的父类,paint是Frame的一个方法


	class Painthread extends Thread {//加载窗口時候會啟動線程,一啟動就會調用畫窗口,循環調用paint()
		public void run() {
			while (true) {
				repaint();
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

		}

	}


}

4.画图类

package myPackage;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Paint;
import java.awt.Rectangle;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Date;

public class mainFunc extends gameFrame{
	Date date_start;
	Date date_end;
	
	Plane plane=new Plane("Image/mu.png",80,80);
	ArrayList braclletList=new ArrayList();
	int braclletNum;//子弹数
	double speed;
	public void paint(Graphics g){		
		plane.draw(g);
		frintinfor(g,"宋体","等级:",20,Color.blue,Constant.Frame_wide-160,80);
		frintinfor(g,"宋体","0-10秒:辣鸡",15,Color.blue,Constant.Frame_wide-160,100);
		frintinfor(g,"宋体","10-20秒:菜鸡",15,Color.blue,Constant.Frame_wide-160,115);
		frintinfor(g,"宋体","20-30秒:菜逼",15,Color.blue,Constant.Frame_wide-160,130);
		frintinfor(g,"宋体","30秒以上:优秀",15,Color.blue,Constant.Frame_wide-160,145);
		for(int i=0;i<braclletNum;i++)
		{
			Bracllet bracllet1=(Bracllet)braclletList.get(i);
			bracllet1.draw(g);
			boolean peng=plane.getRectangle().intersects(bracllet1.getRectangle());
			if(peng&&plane.live){
				plane.live=false;
				date_end=new Date();
			}
			if(plane.live==false)
			{
				int time=((int)(date_end.getTime()-date_start.getTime()))/1000;
				switch (time/10) {
				case 0:
					frintinfor(g,"宋体","等级:辣鸡!",50,Color.red,Constant.Frame_high/2-100,Constant.Frame_wide/2-100);
					frintinfor(g,"宋体","    坚持了"+time+"秒",30,Color.red,Constant.Frame_high/2-100,Constant.Frame_wide/2+60-100);
					break;
				case 1:
					frintinfor(g,"宋体","等级:菜鸡",50,Color.red,Constant.Frame_high/2-100,Constant.Frame_wide/2-100);
					frintinfor(g,"宋体","    坚持了"+time,30,Color.red,Constant.Frame_high/2-100,Constant.Frame_wide/2+60-100);
					break;
				case 2:
					frintinfor(g,"宋体","等级:菜逼",50,Color.red,Constant.Frame_high/2-100,Constant.Frame_wide/2-100);
					frintinfor(g,"宋体","    坚持了"+time,30,Color.red,Constant.Frame_high/2-100,Constant.Frame_wide/2+60-100);
					break;	
					
					
				default:
					frintinfor(g,"宋体","等级:优秀",50,Color.red,Constant.Frame_high/2-100,Constant.Frame_wide/2-100);
					frintinfor(g,"宋体","    坚持了"+time,30,Color.red,Constant.Frame_high/2-100,Constant.Frame_wide/2+60-100);
					break;
				}
				
			}
		}
	}
		
	public void frintinfor(Graphics g,String s1,String s2,int fontsize,Color cc,int gameover_locationx,int gameover_locationy){
		Font font=new Font(s1,Font.BOLD,fontsize);
		Color c=g.getColor();
		g.setColor(cc);
		g.setFont(font);
		g.drawString(s2, gameover_locationx, gameover_locationy);
		g.setColor(c);
		
	}
	@Override
	public void lunch() {
		
		super.lunch();
		date_start=new Date();
		addKeyListener(new KeyMonitor());
		for(int i=0;i<braclletNum;i++)
		{
			Bracllet bracllet1=new Bracllet(speed);
			braclletList.add(bracllet1);
		}
		
	}

public mainFunc(int braclletNum,double speed){
	this.braclletNum=braclletNum;
	this.speed=speed;
}

	class KeyMonitor extends KeyAdapter{

		@Override
		public void keyPressed(KeyEvent e) {
			plane.press_dicraytion(e);
		}

		@Override
		public void keyReleased(KeyEvent e) {
			plane.release_dicraytion(e);

		}				
		
	}
	public static void main(String[] args) {
		new mainFunc(25,10).lunch();//点数,点速度
	}
}

5.飞机类:

package myPackage;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;

public class Plane {

	String imagepath;
	double x,y;
	Image Img;
	boolean up,down,right,left,live=true;
	public Plane(String imagepath, double x, double y) {
		super();
		this.imagepath = imagepath;
		this.x = x;
		this.y = y;
		Img=GameFunc.getImage(imagepath);
	}
	
	public void move(){
//		上:38,下:40
//		左:37    右:39		
		if(left)
			this.x-=20;
		if(up)
			this.y-=20;
		if(right)
			this.x+=20;
		if(down)
			this.y+=20;
		if(x<=8){
			x=8;
		}
		if(y<=30){
			y=30;
		}
		if(x>=Constant.Frame_wide-Img.getWidth(null)){
			x=Constant.Frame_wide-Img.getWidth(null);
		}
		if(y>=Constant.Frame_high-Img.getWidth(null)){
			y=Constant.Frame_high-Img.getWidth(null);
		}
		
	}
	
	public void press_dicraytion(KeyEvent e){
		switch (e.getKeyCode()) {
//		上:38,下:40
//		左:37    右:39
		
		case 37:
			left=true;
			break;
		case 38:
			up=true;
			break;
		case 39:
			right=true;
			break;
		case 40:
			down=true;
			break;
		default:
			break;
		}
		
	}
	public Rectangle getRectangle()
	{
		return new Rectangle((int)x, (int)y, 10, 10);
	}
	
	public void release_dicraytion(KeyEvent e){
		switch (e.getKeyCode()) {
//		上:38,下:40
//		左:37    右:39
		
		case 37:
			left=false;
			break;
		case 38:
			up=false;
			break;
		case 39:
			right=false;
			break;
		case 40:
			down=false;
			break;
		default:
			break;
		}
		
	}
	
	public void draw(Graphics g){
		if(live)
		{
			move();
		}
		
		Color c=g.getColor();
		g.setColor(Color.blue);
		g.fillOval((int)x, (int)y, 20, 20);
		g.setColor(c);
	}
	
}

6.子弹类:

package myPackage;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.Random;

public class Bracllet {
	
	double x=Constant.Frame_wide/2,y=Constant.Frame_high/2,degree,speed;
	public Bracllet(double speed){
		this.speed=speed;
		degree=Math.random()*Math.PI*2;
		
	}
	public Rectangle getRectangle()
	{
		return new Rectangle((int)x, (int)y, 10, 10);
	}

	
	public void draw(Graphics g){
		x+=this.speed*Math.cos(degree);
		y+=this.speed*Math.sin(degree);
		
		//横纵边栏目宽8,30
		if(x<8||x>(Constant.Frame_wide)-18)//30表示标题栏,看不见
		{
			System.out.println((Constant.Frame_wide/2)-10+"x="+x);
			this.degree=Math.PI-this.degree;
		}
		if(y<30||y>(Constant.Frame_high)-30)//30表示标题栏,看不见
		{
			this.degree=-this.degree;
			System.out.println("y="+y);
		}
		Color c=g.getColor();
		g.setColor(Color.magenta);
		g.fillOval((int)x, (int)y, 10, 10);
		g.setColor(c);		

	}

}

7.常量类:

package myPackage;

public class Constant {

	public static final int Frame_wide=800;
	public static final int Frame_high=600;
}

8.图片涉及方法类

package myPackage;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;

public class GameFunc {

	public static Image getImage(String path)
	{
		URL u=GameFunc.class.getClassLoader().getResource(path);
		BufferedImage img=null;
		try {
			img=ImageIO.read(u);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return img;
	}
}

9.源码下载:

https://pan.baidu.com/s/1K5XcHaIzWp_tr9GVAyzSdw

猜你喜欢

转载自blog.csdn.net/weixin_42034217/article/details/86260408