java飞机大战
我們在寫飛機大戰時,先思考一下飛機大戰中本身有哪些元素
1.本身元素有哪些
2.里邊運用到了什么?
1)面向對象:學會繼承、封裝、抽象、實現接口 (重點為熟練掌握了重寫與重載);
2)學會如何用BufferedImage來讀取圖片,以及怎樣才能讓這些圖片在窗口中顯示出來
下邊為飛機大戰源代碼(附運行效果)
backGround 超類
package flyChicken;import org.omg.CORBA.PUBLIC_MEMBER;import javax.swing.ImageIcon; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.util.HashMap; import java.util.Random;// 背景板對象 public abstract class backGround {public static final int LIVE = 0;public static final int DEAD = 1;public static final int REMOVE = 2;protected int state = LIVE;protected int width; //寬protected int height;//高protected int x; //x坐標protected int y; //y坐標protected int speed;//移動速度/** 三種飛機 */public backGround(int width,int height){this.width = width;this.height = height;Random rand = new Random();x = rand.nextInt(World.WIDTH-70+1);y = -height;speed = rand.nextInt(3)+1;}/* 寫給英雄機,子彈 */public backGround(int width,int height,int x,int y,int speed){this.width = width;this.height = height;this.x = x;this.y = y;this.speed = speed;}/* 飛機移動 */public abstract void move();/* 獲取對象的圖片 */public abstract BufferedImage getImage();/* 判斷對象是否活著 */public boolean isLive(){return state==LIVE;}/* 判斷對象時候死了 */public boolean isDead(){return state==DEAD;}/** 判斷對象是否被刪除了 */public boolean isRemove(){return state==REMOVE;}/** 檢測越界 */public boolean isOutOfBounds(){return this.y >= World.HEIGHT;}/** 檢測碰撞 */public boolean isHit(backGround other){//假設this指敵機 other指子彈int x1 = this.x- other.width;int x2 = this.x + this.width;int y1 = this.y - other.height;int y2 = this.y + this.height;int x = other.x;int y = other.y;return x>=x1 && x<=x2 && y>=y1 && y<=y2;}/** 檢測死亡 */public void goDead(){state = REMOVE;}}World 整個游戲世界
package flyChicken;import org.omg.CORBA.PUBLIC_MEMBER;import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.*;import java.util.Random; import java.util.Arrays; import java.util.Timer; import java.util.TimerTask; import java.awt.event.MouseEvent; import java.awt.event.MouseAdapter; import javax.swing.JButton;//整個游戲世界 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 Sky sky = new Sky();private BattleFlyChicken flys = new BattleFlyChicken();private backGround[] enemys = {};private Bullet[] bullets= {};private EnemyBullet[] enemybuttles = {};/** 隨機生成敵機 */public backGround nextbgd(){Random rand = new Random();int type = rand.nextInt(20);if (type<12){return new AirPlane();}else if (type<17){return new BigAirPlane();}else{return new Bee();}}/** 敵人入場 */private int bgdEnterIndex = 0;public void bgdEnterAction(){bgdEnterIndex++;if (bgdEnterIndex%20==0){backGround bgd = nextbgd();enemys = Arrays.copyOf(enemys,enemys.length+1);enemys[enemys.length-1] = bgd;}}private int enemybulletIndex = 0;/** 敵機子彈入場 */public void enemybuttlesEnterAction(){enemybulletIndex++; //10毫秒走一次if (enemybulletIndex%50==0){ //每1000毫秒走一次for (int i=0;i<enemys.length;i++){if (enemys[i] instanceof BigAirPlane){ //若敵機是大敵機BigAirPlane ms = (BigAirPlane)enemys[i]; //將敵機強制轉換為大敵機EnemyBullet obj = ms.shootenemybullet(); //獲取敵機子彈enemybuttles = Arrays.copyOf(enemybuttles,enemybuttles.length+1);//擴容enemybuttles[enemybuttles.length-1] = obj; //將obj添加到最后一個元素上}}}}/** 飛行物移動 */private int moveEnterIndex = 0;public void moveAction(){switch (state){ //判斷是什么狀態case START:state = START;break;case RUNNING:state = RUNNING;sky.move();for (int i=0;i<enemys.length;i++){enemys[i].move();}for (int i=0;i<bullets.length;i++){bullets[i].move();}for (int i=0;i<enemybuttles.length;i++){enemybuttles[i].move();}break;case PAUSE:state = PAUSE;break;case GAME_OVER:state = GAME_OVER;break;}}/** 戰機子彈 */private int buttleEnterIndex = 0;public void buttleEnterAction(){switch (state){case START:state = START;break;case RUNNING:state = RUNNING;buttleEnterIndex++;if (buttleEnterIndex%10==0){Bullet[] bs = flys.shootbuttle();bullets = Arrays.copyOf(bullets,bullets.length+bs.length);//擴容(bs有幾個就擴大幾個容量)System.arraycopy(bs,0,bullets,bullets.length-bs.length,bs.length);}break;case PAUSE:state = PAUSE;break;case GAME_OVER:state = GAME_OVER;break;}}/** 刪除越界的子彈和敵人 */public void outOfBoundsAction(){for (int i=0;i<enemys.length;i++){if (enemys[i].isOutOfBounds() || enemys[i].isRemove()){enemys[i] = enemys[enemys.length-1];enemys = Arrays.copyOf(enemys,enemys.length-1);}}for (int i=0;i<bullets.length;i++){if (bullets[i].isOutOfBounds() || bullets[i].isRemove()){bullets[i] = bullets[bullets.length-1];bullets = Arrays.copyOf(bullets,bullets.length-1);}}for (int i=0;i<enemybuttles.length;i++){if (enemybuttles[i].isOutOfBounds() || enemybuttles[i].isRemove()){enemybuttles[i] = enemybuttles[enemybuttles.length-1];enemybuttles = Arrays.copyOf(enemybuttles,enemybuttles.length-1);}}}/** 子彈與敵人碰撞 */private int score = 0;public void buttleBangAction(){for (int i=0;i<bullets.length;i++){Bullet b = bullets[i];for (int j=0;j<enemys.length;j++){backGround g = enemys[j];if (b.isLive() && g.isLive() && b.isHit(g)){b.goDead();g.goDead();if (g instanceof EnemyScore){EnemyScore es = (EnemyScore)g;score += es.getScore();}if (g instanceof EnemyAward){EnemyAward ea = (EnemyAward) g;int type = ea.getAwardType();switch(type){case EnemyAward.FIRE:flys.addFire();break;case EnemyAward.LIFE:flys.addLife();break;}}}}}}public void enemybuttleBangAction(){for (int i = 0; i < enemybuttles.length; i++) {EnemyBullet eb = enemybuttles[i];if (eb.isLive() && flys.isLive() && eb.isHit(flys)){eb.goDead();flys.subtractLife();}}}/** 判斷游戲是否結束 */public void checkGameOverAction(){if (flys.getLife()<=0){ //若英雄機的命數<=0,表示游戲結束了state = GAME_OVER; //將當前狀態修改為游戲結束狀態}}/** 啟動程序 */public void action(){System.out.println("-------------"+state);/** 鼠標監聽啟動程序的執行 */MouseAdapter m = new MouseAdapter() {public void mouseMoved(MouseEvent e) {if (state==RUNNING){int x = e.getX(); //獲取鼠標的x坐標int y = e.getY(); //獲取鼠標的y坐標flys.moveTo(x,y); //英雄機隨著鼠標移動}}/** 重寫mouseClicked()鼠標點擊事件 */public void mouseClicked(MouseEvent e){switch (state){case START: //啟動狀態時state = RUNNING; //修改為運行狀態break;case GAME_OVER: //游戲結束狀態時score = 0; //清理現場sky = new Sky();flys = new BattleFlyChicken();bullets = new Bullet[0];enemys = new backGround[0];enemybuttles = new EnemyBullet[0];state = START; //修改為啟動狀態break;}}/** 重寫mouseExited()鼠標移出事件 */public void mouseExited(MouseEvent e){if (state==RUNNING){ //運行狀態時state = PAUSE; //修改為暫停狀態}}/** 重寫mouseEntered()鼠標移入事件 */public void mouseEntered(MouseEvent e){if(state==PAUSE){ //暫停狀態時state = RUNNING; //修改為運行狀態}}};this.addMouseListener(m);this.addMouseMotionListener(m);Timer timer = new Timer();int interval = 10;timer.schedule(new TimerTask() {public void run() {bgdEnterAction();buttleEnterAction();enemybuttlesEnterAction();moveAction();outOfBoundsAction();buttleBangAction();enemybuttleBangAction();checkGameOverAction();repaint();}},interval,interval);}/** 重寫paint */public void paint(Graphics g){g.drawImage(sky.getImage(),sky.x,sky.y,null);g.drawImage(sky.getImage(), sky.x,sky.getY1(),null);g.drawImage(flys.getImage(), flys.x, flys.y,null);for (int i=0;i< enemys.length;i++){backGround f = enemys[i];g.drawImage(f.getImage(),f.x,f.y,null);}for (int i=0;i< bullets.length;i++){backGround b = bullets[i];g.drawImage(b.getImage(),b.x,b.y,null);}for (int i=0;i< enemybuttles.length;i++){backGround c = enemybuttles[i];g.drawImage(c.getImage(),c.x,c.y,null);}g.drawString("分數:"+score,10,25);g.drawString("生命:"+flys.getLife(),10,45);g.drawString("戰斗力:"+flys.getFire(),10,65);switch (state){ //根據當前狀態來畫不同的狀態圖case START: //啟動狀態時畫啟動圖g.drawImage(Images.start,0,0,null);break;case PAUSE: //暫停狀態時畫暫停圖g.drawImage(Images.pause,0,0,null);break;case GAME_OVER: //游戲結束狀態時畫游戲結束圖g.drawImage(Images.gameover,0,0,null);break;}}public static void main(String[] args) {JFrame frame = new JFrame();World world = new World();frame.setTitle("雷霆戰機");frame.add(world);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(WIDTH+16,HEIGHT+39);frame.setLocationRelativeTo(null);frame.setVisible(true);world.action(); //啟動程序的執行}}Images 圖片類
package flyChicken;import javax.swing.ImageIcon; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; //圖片 public class Images {//導入圖片public static BufferedImage start;public static BufferedImage pause;public static BufferedImage gameover;public static BufferedImage sky;public static BufferedImage[] heros;public static BufferedImage bullet;public static BufferedImage enemybullet;public static BufferedImage[] bee;public static BufferedImage[] airplane;public static BufferedImage[] bigairplane;//初始化靜態圖片static {start = readImage("start.png");pause = readImage("pause.png");gameover = readImage("gameover.png");sky = readImage("background.png");bullet = readImage("bullet1.png");enemybullet = readImage("bullet2.png");heros = new BufferedImage[2]; //兩張圖片heros[0] = readImage("hero0.png");heros[1] = readImage("hero1.png");airplane = new BufferedImage[5]; //5張圖片bigairplane = new BufferedImage[5];bee = new BufferedImage[5];airplane[0] = readImage("airplane.png");bigairplane[0] = readImage("bigairplane.png");bee[0] = readImage("bee.png");for (int i=1;i< airplane.length;i++){airplane[i] = readImage("bom"+i+".png");bigairplane[i] = readImage("bom"+i+".png");bee[i] = readImage("bom"+i+".png");}}private static BufferedImage readImage(String fileName) {try{BufferedImage img = ImageIO.read(backGround.class.getResource(fileName));return img;}catch(Exception e){e.printStackTrace();throw new RuntimeException();}}}Sky 天空類
package flyChicken;import java.awt.image.BufferedImage;public class Sky extends backGround{private int y1; //第2張圖片的y坐標/** 構造方法 */public Sky(){super(World.WIDTH,World.HEIGHT,0,0,3);y1 = -World.HEIGHT;}//移動 public void move(){y += speed;y1 += speed;if (y >= World.HEIGHT){y = -World.HEIGHT;}if (y1 >= World.HEIGHT){y1 = -World.HEIGHT;}}//獲取圖片public BufferedImage getImage(){return Images.sky;}//獲取第二張天空圖public int getY1(){return y1;}}EnemyBullet 敵機子彈類
package flyChicken;import java.awt.image.BufferedImage;public class EnemyBullet extends backGround{public EnemyBullet(int x,int y){super(9,21,x,y,3);}//移動public void move(){y += speed;}//獲取圖片public BufferedImage getImage(){return Images.enemybullet;}//越界刪除public boolean isOutOfBounds(){return this.y>=World.HEIGHT; //深水炸彈的y>=窗口的高,即為越界了} }Bullet 英雄機子彈類
package flyChicken;import javax.swing.*; import java.awt.image.BufferedImage;public class Bullet extends backGround{//構造方法public Bullet(int x,int y){super(8,20,x,y,3);}//移動public void move(){y -= speed;}//獲取圖片public BufferedImage getImage(){return Images.bullet;}//越界刪除public boolean isOutOfBounds(){return this.y>=World.HEIGHT; //深水炸彈的y>=窗口的高,即為越界了}}BattleFlyChicken 英雄機類
package flyChicken;import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;import javax.swing.*; import java.awt.*; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import java.awt.image.BufferedImage;public class BattleFlyChicken extends backGround{//定義私有的火力值和生命private int life;private int fire;public BattleFlyChicken(){super(97,139,150,550,20);life = 5;fire = 0;}public void move(){}//獲取圖片int index = 0;public BufferedImage getImage(){return Images.heros[index++%Images.heros.length];}//獲取多種子彈public Bullet[] shootbuttle(){int xa = this.x+width/2-25;int xb = this.x+width/2+15;int xc = this.x+width/2-5;int ya = this.y+40;int yb = this.y;if (fire>=50){Bullet[] bs = new Bullet[3];bs[0] = new Bullet(xa,ya);bs[1] = new Bullet(xc,yb);bs[2] = new Bullet(xb,ya);fire -= 1;return bs;}else if (fire>=20){Bullet[] bs = new Bullet[2];bs[0] = new Bullet(xa,ya);bs[1] = new Bullet(xb,ya);fire -= 2;return bs;}else{Bullet[] bs = new Bullet[1];bs[0] = new Bullet(xc,yb);return bs;}}//鼠標事件public void moveTo(int x,int y){this.x = x-this.width/2; //英雄機的x=鼠標的x-1/2英雄機的寬this.y = y-this.height/2; //英雄機的y=鼠標的y-1/2英雄機的高}/** 英雄機加命 */public void addLife(){life++;}/** 獲取英雄機的命 */public int getLife(){return life;}//獲取英雄機火力值public int getFire(){return fire;}//添加火力值public void addFire(){fire += 20;}//碰撞子彈減命public void subtractLife(){life--;}}AirPlane 小敵機類
package flyChicken;import javax.swing.*; import java.awt.image.BufferedImage;public class AirPlane extends backGround implements EnemyScore{public AirPlane(){super(48,50);}//移動public void move(){y += speed;}//獲取圖片int index = 1;public BufferedImage getImage(){if (isLive()){return Images.airplane[0];}else if(isDead()){BufferedImage img = Images.airplane[index++];if (index==Images.airplane.length){state = REMOVE;}return img;}return null;}//獲取得分public int getScore(){return 1;}}BigAirPlane 大敵機類
package flyChicken;import javax.swing.*; import java.awt.image.BufferedImage;public class BigAirPlane extends backGround implements EnemyScore{//構造方法public BigAirPlane(){super(66,89);}//移動public void move(){y += speed;}//敵機子彈public EnemyBullet shootenemybullet(){int x = this.x+width/2-5;int y = this.y;return new EnemyBullet(x,y);}//獲取圖片int index = 1;public BufferedImage getImage(){if (isLive()){return Images.bigairplane[0];}else if(isDead()){BufferedImage img = Images.bigairplane[index++];if (index==Images.bigairplane.length){state = REMOVE;}return img;}return null;}//得分public int getScore(){return 10;}}Bee 獎勵機類
package flyChicken;import javax.swing.*; import java.awt.image.BufferedImage; import java.util.Random;public class Bee extends backGround implements EnemyAward{//獎勵機特有的獎勵private int awardType;//構造方法public Bee(){super(60,51);Random rand = new Random();awardType = rand.nextInt(2);}//移動public void move(){y += speed;}//獲取圖片int index = 1;public BufferedImage getImage(){if (isLive()){return Images.bee[0];}else if(isDead()){BufferedImage img = Images.bee[index++];if (index==Images.bee.length){state = REMOVE;}return img;}return null;}//得到獎勵public int getAwardType(){return awardType;}}EnemyScore 得分接口
package flyChicken;public interface EnemyScore {/** 得分 */public int getScore(); }EnemyAward 獎勵接口
package flyChicken;public interface EnemyAward {public int FIRE = 0; //火力值public int LIFE = 1; //命/** 獲取獎勵類型(0或1) */public int getAwardType();}?
?
?飛機大戰的分享就到此結束了,如果有幫助到你們的話,記得(三連)哦!!!
總結
- 上一篇: python计算数组元素的和_pytho
- 下一篇: keil 破解