javaEE 飞机大战
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                javaEE 飞机大战
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                javaEE 飛機大戰
- 展示素材
- 下載地址
 
- 源碼:
- Airplane
- Award
- Bee
- BigAirplane
- Bullet
- FlyingObject
- Hero
- Score
- Sky
- World
 
 
 
展示素材
下載地址
文件只需要這些,項目源碼已發布、PlaneWar.rar(0積分下載)
源碼:
Airplane
package cn.pln.war;import java.awt.image.BufferedImage;public class Airplane extends FlyingObjectimplements Score{//定義存儲小敵機的圖片的靜態數組private static BufferedImage[] images;//靜態初始化塊中,為小敵機的數組賦值static {//初始化數組長度為5images=new BufferedImage[5];images[0]=readImage("airplane0.png");//images[1]=readImage("bom1.png");for(int i=1;i<images.length;i++) {images[i]=readImage("bom"+i+".png");}}//定義小敵機的類//定義屬性private int step;//速度public Airplane() {super(48,50);step=3;}//輸出信息的方法public void show() {System.out.println("寬:"+width+",高:"+height);System.out.println("x:"+x+",y:"+y);System.out.println("速度:"+step);}public void step() {y+=step;}int index=1;public BufferedImage getImage() {//如果小敵機活著if(isLife()) {//返回小敵機圖片return images[0];}else if(isDead()) {//如果小敵機是死的BufferedImage img=images[index];index++;//如果是最后一次爆炸圖片if(index==images.length) {state=REMOVE;}return img;}//如果既不是活著也不是死了return null;}//Score接口中的方法實現public int getScore() {//擊中小敵機給1分return 1;} }Award
package cn.pln.war;public interface Award {//獎勵接口//表示擊中該單位//會獲得獎勵//定義獎勵對應的數字int LIFE=1;int DOUBLE_FIRE=0;//返回獎勵的方法int getAward(); }Bee
package cn.pln.war;import java.awt.image.BufferedImage; import java.util.Random;public class Bee extends FlyingObjectimplements Award{private static BufferedImage[] images;static {images=new BufferedImage[5];images[0]=readImage("bee0.png");for(int i=1;i<images.length;i++) {images[i]=readImage("bom"+i+".png");}}//橫向速度(左右)private int xStep;//縱向速度(上下)private int yStep;public Bee() {super(60,51);xStep=2;yStep=2;}public void show() {System.out.println("寬:"+width+",高:"+height);System.out.println("x:"+x+",y:"+y);System.out.println("x速度:"+xStep+",y速度"+yStep);}public void step() {y+=yStep;x+=xStep;//獎勵機碰左壁或右壁//都需要修改x軸運行方法if(x>=World.WIDTH-this.width || x<=0) {xStep*=-1;}}int index=1;public BufferedImage getImage() {if(isLife()) {return images[0];}else if(isDead()) {BufferedImage img=images[index];index++;if(index==images.length) {state=REMOVE;}return img;}return null;} //Award接口中的方法實現public int getAward() {//隨機產生一個0~1的數字返回//0獎勵火力值,1獎勵生命值Random ran=new Random();return ran.nextInt(2);}}BigAirplane
package cn.pln.war;import java.awt.image.BufferedImage;public class BigAirplane extends FlyingObject implements Score{private static BufferedImage[] images;static {images=new BufferedImage[5];images[0]=readImage("bigairplane0.png");for(int i=1;i<images.length;i++) {images[i]=readImage("bom"+i+".png");}}private int step;public BigAirplane() {super(66,89);step=2;}public void show() {System.out.println("寬:"+width+",高:"+height);System.out.println("x:"+x+",y:"+y);System.out.println("速度:"+step);}public void step() {y+=step;}int index=1;public BufferedImage getImage() {if(isLife()) {return images[0];}else if(isDead()) {BufferedImage img=images[index];index++;if(index==images.length) {state=REMOVE;}return img;}return null;}public int getScore() {return 3;}}Bullet
package cn.pln.war;import java.awt.image.BufferedImage;public class Bullet extends FlyingObject {//聲明一個保存子彈圖片的靜態對象private static BufferedImage image;static {//靜態塊中加載子類的圖片image=readImage("bullet.png");}private int step;public Bullet(int x,int y) { super(8,20,x,y);step=2;}public void show() {System.out.println("寬:"+width+",高:"+height);System.out.println("x:"+x+",y:"+y);System.out.println("速度:"+step);}public void step() {y-=step;}public BufferedImage getImage() {//子彈如果活著if(isLife()) {//返回圖片return image;}else if(isDead()) {//如果死了,直接消失state=REMOVE;}//消失了就返回nullreturn null;}//重寫父類中編寫的出界方法public boolean outOfBounds() {//子彈是完全移出至窗體上方return y<-this.height;}}FlyingObject
package cn.pln.war;import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random;import javax.imageio.ImageIO;public abstract class FlyingObject {//定義飛行物狀態的三個常量public static final int LIFE=0;//活著public static final int DEAD=1;//死了的public static final int REMOVE=2;//消失了//定義當前對象的狀態的屬性protected int state=LIFE;//默認開始是活著的//父類中定義所有子類共有的屬性protected int width;protected int height;protected int x;protected int y;//小敵機,大敵機,獎勵機使用的構造//原因是這三類對象的x和y軸是不需要參數的public FlyingObject(int width,int height) {Random ran=new Random();this.width=width;this.height=height;x=ran.nextInt(400-width);y=-height;}//天空\子彈\英雄級的構造public FlyingObject(int width,int height,int x,int y) {this.width=width;this.height=height;this.x=x;this.y=y;}public void show() {System.out.println("寬:"+width+",高:"+height);System.out.println("x:"+x+",y:"+y);}//將程序中需要的圖片讀取到內存中的方法public static BufferedImage readImage(String fileName) {//讀取圖片到對象BufferedImage img;try {img = ImageIO.read(FlyingObject.class.getResource(fileName));return img;} catch (IOException e) {e.printStackTrace();throw new RuntimeException();}}//判斷當前對象是活著的public boolean isLife() {return state==LIFE;}//判斷當前對象是死了的public boolean isDead() {return state==DEAD;}//判斷當前對象是消失的public boolean isRemove() {return state==REMOVE;}//父類中編寫抽象方法step//所有的飛行物都會移動:移動方法public abstract void step();//這個方法是對象獲得自己圖片的方法public abstract BufferedImage getImage();//將一個圖片繪制到窗體public void paintObject(Graphics g) {//在畫板上繪制指定圖片g.drawImage(getImage(),x,y,null);}//定義飛行物出界的抽象方法//默認定義小敵機大敵機獎勵機出界的方法public boolean outOfBounds() {//返回真表示真出界了//y軸大于了窗體的高.即出界return y>World.HEIGHT;}//定義判斷飛行物碰撞的方法//this:子彈\英雄機 other:敵機public boolean hit(FlyingObject other) {//定義碰撞范圍的四個點int x1=other.x-this.width;int x2=other.x+other.width;int y1=other.y-this.height;int y2=other.y+other.height;//如果子彈或英雄機在這四個點之內//返回真return this.x>x1 && this.x<x2&&this.y>y1 && this.y<y2;}//定義一個狀態修改DEAD的方法public void goDead() {this.state=DEAD;}}Hero
package cn.pln.war;import java.awt.image.BufferedImage;public class Hero extends FlyingObject {private static BufferedImage[] images;static {images=new BufferedImage[2];images[0]=readImage("hero0.png");images[1]=readImage("hero1.png");}//生命值private int life;//火力值(雙排炮)private int doubleFire;public Hero() {super(97,139,400/2-97/2,420);life=3;//英雄級初始3條命doubleFire=30;//初始沒有火力值}public void show() {System.out.println("寬:"+width+",高:"+height);System.out.println("x:"+x+",y:"+y);System.out.println("生命值:"+life);System.out.println("火力值:"+doubleFire);}//英雄機隨鼠標移動,step方法做空實現即可public void step() {}//英雄機int index=0; //index:6public BufferedImage getImage() {int i=index%2; //i:1index++;return images[i];//return images[index++%2];}//英雄機開炮的方法public Bullet[] shoot() {Bullet[] bs=null;//定義一個英雄機的四分之一寬//方便子彈的x軸定位int tx=this.width/4-2;int ty=20;//20是子彈的高度//根據英雄機的火力值,開炮if(doubleFire>0) {//雙bs=new Bullet[2];//定義長度為2的bs[0]=new Bullet(this.x+tx,this.y-ty);//左側子彈bs[1]=new Bullet(this.x+3*tx,this.y-ty);//右側子彈doubleFire--;//減少火力值}else {//單bs=new Bullet[1];//定義長度為1的bs[0]=new Bullet(this.x+2*tx,this.y-ty);}return bs;} //英雄機移動的方法public void moveTo(int x,int y) {//將x看做是鼠標的x軸//將y看做是鼠標的y軸//將鼠標位置調整到英雄機中心this.x=x-this.width/2;this.y=y-this.height/2;}//加命方法public void addLife() {life++;}//加火力方法public void addDoubleFire() {doubleFire+=20;}//返回命的方法public int getLife() {return life;}//減命public void subLife() {life--;}//清空火力public void clearFire() {doubleFire=0;}}Score
package cn.pln.war;public interface Score {//得分接口,表示擊中該類型的單位后//會加分//獲得加分的方法int getScore();}Sky
package cn.pln.war;import java.awt.Graphics; import java.awt.image.BufferedImage;public class Sky extends FlyingObject {private static BufferedImage image;static {image=readImage("background.png");}private int step;private int y1;//第二張背景圖的y坐標public Sky() {super(400,700,0,0);step=1;y1=-700;}public void show() {System.out.println("寬:"+width+",高:"+height);System.out.println("x:"+x+",y:"+y+",y1:"+y1);System.out.println("速度:"+step);}public void step() {y+=step;y1+=step;//如果天空移出窗體//將這個天空重置到窗體上方if(y>=World.HEIGHT) {y=-World.HEIGHT;}if(y1>=World.HEIGHT) {y1=-World.HEIGHT;}}public BufferedImage getImage() {return image;}//天空(背景)對象是一個對象要畫兩張圖//父類中繪制方法只畫了一張//在天空類中要對父類的繪制方法進行重寫public void paintObject(Graphics g) {//重寫的方法要繪制兩張圖g.drawImage(getImage(),x,y,null);g.drawImage(getImage(),x,y1,null);}}World
package cn.pln.war;import java.util.Arrays; import java.util.Random; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.util.Timer; import java.util.TimerTask;import javax.swing.JFrame; import javax.swing.JPanel;//World繼承JPanel表示成為了一個面板 public class World extends JPanel {//定義窗口的寬和高的常量public static final int WIDTH=400;public static final int HEIGHT=700;//定義游戲狀態的常量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 int state=START;//默認開始狀態//定義三個狀態下對應的圖片private static BufferedImage startImg;private static BufferedImage pauseImg;private static BufferedImage gameoverImg;//在類加載時將圖片加載到對象中static {startImg=FlyingObject.readImage("start.png");pauseImg=FlyingObject.readImage("pause.png");gameoverImg=FlyingObject.readImage("gameover.png");}//分數屬性private int score=0;Hero hero=new Hero();Sky sky=new Sky();//定義出現多次的對象的數組FlyingObject[] enemy= {};Bullet[] bullets= {};//定義游戲開始的方法public void start() {//編寫英雄機隨鼠標移動的代碼//鼠標監聽器對象MouseAdapter l=new MouseAdapter() {//重寫MouseAdapter類中的鼠標移動方法public void mouseMoved(MouseEvent e) {if(state==RUNNING) {int x=e.getX();//獲得鼠標x軸位置int y=e.getY();//獲得鼠標y軸位置hero.moveTo(x, y);//讓英雄機移動}}//重寫鼠標單擊時運行的方法public void mouseClicked(MouseEvent e) {//根據當前狀態,切換成另一個狀態switch(state) {//當開始狀態時,切換到運行狀態case START:state=RUNNING;break;//當游戲結束時,切換到開始狀態case GAME_OVER:state=START;//游戲重新開始,數據要重置score=0;sky=new Sky();hero=new Hero();enemy=new FlyingObject[0];bullets=new Bullet[0];break;}}//重寫鼠標移出時運行的方法public void mouseExited(MouseEvent e) {if(state==RUNNING) {//如果是運行狀態state=PAUSE;//切換成暫停}}//重寫鼠標移入時運行的方法public void mouseEntered(MouseEvent e) {if(state==PAUSE) {//如果是暫停狀態state=RUNNING;//切換成運行狀態}}};//在鼠標移動事件和鼠標滑動事件上//注冊這個監聽器this.addMouseListener(l);this.addMouseMotionListener(l);//定義計時器Timer timer=new Timer();//定義運行間隔(數字越小,速度越快)int interval=30;//創建定時任務TimerTask task=new TimerTask() {public void run() {if(state==RUNNING) {moveAction();enemyEnterAction();shootAction();outOfBoundsAction();hitAction();//System.out.println(bullets.length);heroHitAction();gameOverAction();}repaint();}};//啟動計時器timer.schedule(task, interval,interval);}//定義一個判斷游戲結束的方法public void gameOverAction() {//如果英雄機生命值下降到0或以下if(hero.getLife()<=0) {//游戲狀態變為結束state=GAME_OVER;}}//定義英雄機和敵機碰撞的方法public void heroHitAction() {//遍歷所有敵機for(int i=0;i<enemy.length;i++) {FlyingObject f=enemy[i];if(hero.isLife() && f.isLife()&& hero.hit(f)) {//如果敵機和英雄機碰撞//敵機死,英雄機減命減火力f.goDead();hero.subLife();hero.clearFire();}}}//定義子彈擊中敵機的方法public void hitAction() {//遍歷所有子彈for(int i=0;i<bullets.length;i++) {//獲得當前子彈Bullet b=bullets[i];//遍歷所有敵機for(int j=0;j<enemy.length;j++) {//獲得當前敵機FlyingObject f=enemy[j];//判斷是否相撞(活子彈撞活敵機)if(b.isLife() && f.isLife() && b.hit(f)) {//子彈和敵機都得死b.goDead();f.goDead();//如果擊中的是得分的敵機if(f instanceof Score) {//安裝游戲規則加分Score s=(Score)f;score+=s.getScore();}//如果擊中的是有獎勵的敵機if(f instanceof Award) {Award a=(Award)f;//獲得獎勵機的獎勵類型int type=a.getAward();//根據不同獎勵值獲得對應的獎勵switch(type) {case Award.DOUBLE_FIRE:hero.addDoubleFire();break;case Award.LIFE:hero.addLife();break;}}//如果擊中了敵機,//當前子彈就不需要循環了break;}}}}//定義飛行物出界的方法public void outOfBoundsAction() {int index=0;//1)復制當前元素2)新數組長度//定義新數組FlyingObject[] newarr= new FlyingObject[enemy.length];//遍歷敵機數組for(int i=0;i<enemy.length;i++) {//獲取當前敵機對象FlyingObject f=enemy[i];//判斷是否出界if(!f.outOfBounds()&&!f.isRemove()) {//如果沒出界并且不是移除狀態//將當前對象放入新數組中newarr[index]=f;index++;}}//將新數組縮容(可能)后賦值給enemyenemy=Arrays.copyOf(newarr, index);//子彈出界的判斷,思路和敵機相同index=0;//index重置歸零Bullet[] bs=new Bullet[bullets.length];for(int i=0;i<bullets.length;i++) {Bullet b=bullets[i];if(!b.outOfBounds()&&!b.isRemove()) {bs[index]=b;index++;}}bullets=Arrays.copyOf(bs, index); }//定義子彈進場的方法int shootIndex=0;public void shootAction() {shootIndex++;if(shootIndex%30==0) {Bullet[] bs=hero.shoot();//數組擴容bs的長度bullets=Arrays.copyOf(bullets,bullets.length+bs.length);//將要進場的子彈,追加到擴容后數組的尾部System.arraycopy(bs, 0, bullets,bullets.length-bs.length, bs.length);}}//定義敵機進場的方法int enterIndex=0;public void enemyEnterAction() {enterIndex++;if(enterIndex%10==0) {//獲得隨機產生的敵機FlyingObject fly=makeEnemy();//將現有的敵機數組擴容1enemy=Arrays.copyOf(enemy,enemy.length+1);//將生成的fly,存放到擴容后數組的// 最后一個位置enemy[enemy.length-1]=fly;}}//隨機產生敵機的方法public FlyingObject makeEnemy() {FlyingObject fly=null;//隨機生成一種敵機,賦給flyRandom ran=new Random();int num=ran.nextInt(100);//0~99隨機數if(num<40) {//40%幾率產生小敵機fly=new Airplane();}else if(num<80) {//40%幾率產生大敵機fly=new BigAirplane();}else {//剩下的20%產生獎勵機fly=new Bee();}return fly;}//定義所有敵機移動的方法public void moveAction() {sky.step();//所有敵機移動for(int i=0;i<enemy.length;i++) {enemy[i].step();}//子彈移動for(int i=0;i<bullets.length;i++) {bullets[i].step();}}//這個方法是重寫JPanel的//方法名固定//功能是將Wrold類中所有對象//繪制到窗體上public void paint(Graphics g) {//一定要先畫背景sky.paintObject(g);hero.paintObject(g);//循環遍歷敵機數組和子彈數組畫在窗體上for(int i=0;i<enemy.length;i++) {enemy[i].paintObject(g);}for(int i=0;i<bullets.length;i++) {bullets[i].paintObject(g);}//將分數和英雄機生命值顯示在窗體上g.drawString("SCORE:"+score,10,25);g.drawString("LIFE :"+hero.getLife(),10, 45);//根據狀態在窗體上顯示圖片switch(state) {case START:g.drawImage(startImg,0,0,null);break;case PAUSE:g.drawImage(pauseImg,0,0,null);break;case GAME_OVER:g.drawImage(gameoverImg,0,0,null);}}public static void main(String[] args) {//實例化World類對象wWorld w=new World();//實例化窗口,標題為飛機大戰JFrame frame=new JFrame("飛機大戰");//將World面板放入frame窗口frame.add(w);//設定窗口大小frame.setSize(400, 700);//設置窗口關閉時,運行的程序結束frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設置窗口的默認位置(居中)frame.setLocationRelativeTo(null);//顯示窗口(自動調用paint方法)frame.setVisible(true);//使用w調用start方法w.start();}}總結
以上是生活随笔為你收集整理的javaEE 飞机大战的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: java.sql.SQLSyntaxEr
- 下一篇: js,html条码生成
