JAVA编写飞机大战---分析过程及源代码(超详细超完整)
飛機大戰的需求:
? 1.游戲可以產生: 小敵機/大敵機/小蜜蜂 -> 隨機(概率)產生
? 2.跟鼠標相關的操作:
? a.自己的飛機移動
? b.點擊開始游戲
? c.鼠標移出窗口,游戲暫停
? d.鼠標進入窗口,游戲繼續
? 3.子彈打中小敵機: 分數 + 5
? 4.子彈打中大敵機: 分數 + 50,獎勵(雙倍火力,生命值加成) - 接口
? 5.子彈打中小蜜蜂: 獎勵(雙倍火力,生命值加成)
API(application programming Interface): 應用程序接口
幫助文檔
Scanner
System -> java.lang
Arrays -> java.utils
Math -> java.lang
構造方法 方法
1.java.awt javax.swing - 窗口化界面
? Frame -> JFrame : 窗口類
DO_NOTHING_ON_CLOSE:關閉時什么都不做 HIDE_ON_CLOSE:關閉時隱藏窗口(默認效果) DISPOSE_ON_CLOSE:關閉時注銷窗口 EXIT_ON_CLOSE:關閉時退出程序什么時候使用靜態常量:如果是只判斷兩種情況: boolean如果是一開始就固定好幾種狀態: final一般會使用int類型修飾,因為浮點型不能判斷兩個值是否相等2.畫板類:
? Panel -> JPanel -> 解決閃屏問題
原生的 JPanel 是不能自定義繪畫的 只能畫 按鈕,輸入框...等的一些組件 功能增強 -> 自定義類繼承JPanel因為子類更能一定比父類更強大3.加載圖片
? 1)圖片是存在磁盤中,要將此文件加載到JVM內存中
? I0 -> 輸入/輸出流
4.程序設計 - 類的設計
? 對象: 小飛機/大飛機/小蜜蜂/英雄機/子彈
父類(基類):抽象類成員變量:int blood int x int y 圖片圖片寬/ 高成員方法:move() -> 抽象方法 -> 中文對象對應的類: 子類 extends 父類:小飛機:成員變量:int blood int score int x int y 圖片圖片寬/ 高 int speed成員方法:move()大飛機成員變量:int blood int score int x int y 圖片圖片寬/ 高 int speed成員方法:move()小蜜蜂成員變量:int blood int x int y 圖片圖片寬/ 高 int speed成員方法:move()英雄機成員變量:int blood int x int y 圖片圖片寬/ 高 子彈成員方法:move()子彈成員變量:int blood int x int y 圖片圖片寬/ 高 int speed成員方法:move()構造方法:5.存很多數據 -> 數組:
? 1.數組長度不可變的,如果想給數組擴容,就必須使用到數組的復制
? 方法的復制:
? 1).最原始的方式
? 2).Arrays.copyOf()
? 3).System.arrayCopy()
ArrayList: 可變長數組
1.只能存放引用數據類型數組
int -> Integer (包裝類)
char -> Character
byte -> Byte
long -> Long
具體步驟:
1.創建窗口對象
2.創建畫板對象
3.類的設計 - 確定類中目前需要的成員變量和成員方法
4.成員方法目前只有一個 - move(), 研究不同類的移動方式
5.創建類需要不同的構造方法 - 初始化成員變量
a.加載(讀取)圖片 -> static{} -> 靜態代碼塊,需要靜態成員變量
b.獲取父類中的成員變量
1.如果父類中的成員變量是protected修飾的
那么子類可以直接獲取
2.如果父類中的成員變量是private修飾的
通過調用父類的有參構造方法super()
6.主程序: 添加定時器
a.生成所有飛行物
b.所有飛行物的移動
c.生成很多子彈
d.所有子彈的移動
e.判斷所有飛行物 和子彈的越界
f.判斷子彈和飛行物的碰撞
g.判斷飛行物和英雄機的碰撞
h.英雄的移動 - 鼠標監聽
MouseListener - 接口
MouseMotionListener - 接口
鼠標適配器 -> new MouseAdapter
i.判斷游戲是否結束 -> blood == 0
7.添加鼠標監聽 - 接口
8.游戲狀態的判斷 -> 結合鼠標適配器完成
//靜態常量 -> 全大寫
9.碰撞
判斷子彈和飛行物的碰撞
小蜜蜂/大敵機/小敵機 -> 向上造型fyings
判斷飛行物和英雄機的碰撞
10.添加獎勵 [雙倍火力/ 生命值加成]
11.判斷游戲結束 -> hero.blood == 0
12.灰燼 -> 和父類是不同的類
Window類:實現主方法
package planewar;import javax.swing.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.util.Timer; import java.util.TimerTask;public class Window {public static void main(String[] args) {JFrame win = new JFrame();//設置窗口大小win.setSize(400,600);//設置居中win.setLocationRelativeTo(null);//設置窗口置頂//win.setAlwaysOnTop(true);//設置titlewin.setTitle("飛機大戰");//關閉窗口win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//畫板對象Draw draw = new Draw();//把畫板添加到窗口win.add(draw);//調用action方法draw.action();//顯示窗口win.setVisible(true);} }Fly類:所有飛行物的父類
package planewar; /*所有飛行物的父類*/ import java.awt.image.BufferedImage;public abstract class Fly {protected int blood;protected int x;protected int y;protected BufferedImage image;protected int imageWidth;protected int imageHeight;protected boolean remove; //判斷消失Fly(){}Fly(int x,int y, BufferedImage image,int blood){this.x=x;this.y=y;this.image=image;this.blood=blood;}abstract void move();public int getBlood() {return blood;}public void setBlood(int blood) {this.blood = blood;}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 BufferedImage getImage() {return image;}public void setImage(BufferedImage image) {this.image = image;}public int getImageWidth() {return imageWidth;}public void setImageWidth(int imageWidth) {this.imageWidth = imageWidth;}public int getImageHeight() {return imageHeight;}public void setImageHeight(int imageHeight) {this.imageHeight = imageHeight;}public boolean isRemove() {return remove;}public void setRemove(boolean remove) {this.remove = remove;} }ImageFiler類:圖片素材類
package planewar; /*圖片素材類*/ import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.IOException;public class ImageFiler {public static BufferedImage heroplane;public static BufferedImage heroplane1;public static BufferedImage littleplane;public static BufferedImage littleplane1;public static BufferedImage littleplane2;public static BufferedImage littleplane3;public static BufferedImage littleplane4;public static BufferedImage bigplane;public static BufferedImage bigplane1;public static BufferedImage bigplane2;public static BufferedImage bigplane3;public static BufferedImage bigplane4;public static BufferedImage bee;public static BufferedImage bee1;public static BufferedImage bee2;public static BufferedImage bee3;public static BufferedImage bee4;public static BufferedImage bullet;public static BufferedImage start;public static BufferedImage pause;public static BufferedImage gameover;static {try {heroplane = ImageIO.read(ImageFiler.class.getResourceAsStream("image/hero0.png")); //英雄機heroplane1 = ImageIO.read(ImageFiler.class.getResourceAsStream("image/hero1.png"));//小敵機littleplane = ImageIO.read(ImageFiler.class.getResourceAsStream("image/airplane.png"));littleplane1 = ImageIO.read(ImageFiler.class.getResourceAsStream("image/airplane_ember0.png"));littleplane2 = ImageIO.read(ImageFiler.class.getResourceAsStream("image/airplane_ember1.png"));littleplane3 = ImageIO.read(ImageFiler.class.getResourceAsStream("image/airplane_ember2.png"));littleplane4 = ImageIO.read(ImageFiler.class.getResourceAsStream("image/airplane_ember3.png"));//大敵機bigplane = ImageIO.read(ImageFiler.class.getResourceAsStream("image/bigplane.png"));bigplane1 = ImageIO.read(ImageFiler.class.getResourceAsStream("image/bigplane_ember0.png"));bigplane2 = ImageIO.read(ImageFiler.class.getResourceAsStream("image/bigplane_ember1.png"));bigplane3 = ImageIO.read(ImageFiler.class.getResourceAsStream("image/bigplane_ember2.png"));bigplane4 = ImageIO.read(ImageFiler.class.getResourceAsStream("image/bigplane_ember3.png"));//小蜜蜂bee = ImageIO.read(ImageFiler.class.getResourceAsStream("image/bee.png"));bee1 = ImageIO.read(ImageFiler.class.getResourceAsStream("image/bee_ember0.png"));bee2 = ImageIO.read(ImageFiler.class.getResourceAsStream("image/bee_ember1.png"));bee3 = ImageIO.read(ImageFiler.class.getResourceAsStream("image/bee_ember2.png"));bee4 = ImageIO.read(ImageFiler.class.getResourceAsStream("image/bee_ember3.png"));//子彈bullet = ImageIO.read(ImageFiler.class.getResourceAsStream("image/bullet.png"));//開始狀態start = ImageIO.read(ImageFiler.class.getResourceAsStream("image/start.png"));//暫停狀態pause = ImageIO.read(ImageFiler.class.getResourceAsStream("image/pause.png"));//游戲結束gameover = ImageIO.read(ImageFiler.class.getResourceAsStream("image/gameover.png"));} catch (IOException e) {e.printStackTrace();}} }Draw類:畫板類
package planewar;import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.ArrayList; import java.util.TimerTask;public class Draw extends JPanel {//游戲狀態--靜態常量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;//當前狀態int start = START;HeroPlane hero= new HeroPlane();// LittlePlane littlePlane = new LittlePlane();//new小飛機// BigPlane bigPlane = new BigPlane();//new大飛機// Bee bee = new Bee();//new小蜜蜂// Bullet bullet = new Bullet(hero.getX(), hero.getY());//new子彈//創建所有飛行物的數組ArrayList<Fly> flyings = new ArrayList();//創建子彈的數組ArrayList<Bullet> bullets = new ArrayList();//定時器--成員變量java.util.Timer timer =new java.util.Timer();//成員方法()--游戲開始就執行的方法//定時且重復的事情public void action(){//timer.schedule(new TimerTask() {@Overridepublic void run() {//飛行物的運動//littlePlane.move();// bigPlane.move();// bee.move();// bullet.move();if(start==RUNNING){hero.move();//生成很多飛行物createArrayFly();//生成很多子彈createbullet();//所有飛行物的moveflymove();//子彈的movebulletmove();//判斷所有飛行物是否越界outOfBoundAction();//判斷子彈是否越界outOfBullet();//子彈打中fight();//飛行物與英雄機碰撞crash();}repaint();}},100,20);//添加監聽器--適配器MouseAdapter adapter = new MouseAdapter(){@Overridepublic void mouseClicked(MouseEvent e) {super.mouseClicked(e);if(start==START){start=RUNNING;flyings = new ArrayList<Fly>();bullets = new ArrayList<Bullet>();hero.blood=3;}if(start==GAME_OVER){start=START;}}@Overridepublic void mouseEntered(MouseEvent e) {super.mouseEntered(e);if(start==PAUSE){start=RUNNING;}}@Overridepublic void mouseExited(MouseEvent e) {super.mouseExited(e);if(start==RUNNING){start=PAUSE;}}@Override//移動public void mouseMoved(MouseEvent e) {super.mouseMoved(e);//英雄機移動if(start==RUNNING){hero.setX(e.getX()-hero.getImageWidth()/2);hero.setY(e.getY()-hero.getImageHeight()/2);repaint();}}};this.addMouseListener(adapter);this.addMouseMotionListener(adapter);}//飛行物與英雄機的碰撞private void crash(){for (int i = 0; i < flyings.size(); i++) {Fly fly = flyings.get(i);if(hero.getX()< (fly.getX()+fly.getImageWidth()) && hero.getX()+hero.getImageWidth()> fly.getX() &&hero.getY()+hero.getImageHeight() > fly.getY() && hero.getY()< (fly.getY()+fly.getImageHeight())&&fly.blood>0){fly.blood -= 1;hero.blood -= 1;if(hero.blood<=0){start=GAME_OVER;}}}}//子彈擊中飛行物private void fight() {for (int i = 0; i < flyings.size(); i++) {Fly fly = flyings.get(i);for (int j = 0; j < bullets.size(); j++) {Bullet bullet = bullets.get(j);if(bullet.getX()< (fly.getX()+fly.getImageWidth()) && bullet.getX()+bullet.getImageWidth()> fly.getX() &&bullet.getY()+bullet.getImageHeight() > fly.getY() && bullet.getY()< (fly.getY()+fly.getImageHeight())&&fly.blood>0 ){fly.blood -= 1;bullet.blood -= 1;//如果血量為零就消失if(bullet.blood==0){bullets.remove(bullet);}//加分if(fly.getBlood()==0){if(fly instanceof Enemy){Enemy enemy =(Enemy)fly;hero.setScore(hero.getScore()+enemy.getScore());}//小蜜蜂有幾率加血if(fly instanceof Award) { //蜜蜂加血Award add = (Bee) fly;int n = (int) (Math.random() * 10);if(n%3==0){hero.setBlood(hero.getBlood()+add.addblood());}}//打敗大飛機雙倍火力if(fly instanceof BigPlane){BigPlane bigPlane =(BigPlane) fly;if(bigPlane.getBlood()==0){int n = (int) (Math.random()*10);if(n%3==0){hero.doubleFire();}}}}}}}}//判斷子彈是否越界private void outOfBullet() {for (int i = 0; i < bullets.size(); i++) {Bullet bullet = bullets.get(i);if(bullet.getY()< 0){bullets.remove(bullet);}}}//判斷所有飛行物是否越界private void outOfBoundAction() {for (int i = 0; i < flyings.size(); i++) {Fly fly = flyings.get(i);if(fly.getY() > 600){flyings.remove(fly);hero.setScore(hero.getScore()-2);}}}//子彈運動private void bulletmove() {for (int i = 0; i < bullets.size(); i++) {Bullet bullet = bullets.get(i);bullet.move();}}//所有飛行物的moveprivate void flymove() {for (int i = 0; i < flyings.size(); i++) {Fly fly = flyings.get(i);fly.move();if(fly.remove){flyings.remove(fly);}}}//生成子彈int i=0;private void createbullet() {i++;Bullet bullet;if(i%10==0){Bullet [] bs = hero.shoot();for(int i = 0 ; i < bs.length ; i++){bullets.add(bs[i]);}}/*bullet = new Bullet(hero.getX(), hero.getY());bullets.add(bullet);*/}//生成飛行物int flyingIndex=0;private void createArrayFly() {flyingIndex++;//判斷定時器進入的時候if(flyingIndex%10 == 0){int ran = (int) (Math.random()*100);//創建父類對象Fly fly;if(ran<=10){fly = new Bee();}else if(ran>10&&ran<=30){fly = new BigPlane();}else{fly = new LittlePlane();}//將fly添加到flyings中flyings.add(fly);}}@Overridepublic void paint(Graphics g) {//調用父類的畫畫方法super.paint(g);//畫背景BufferedImage bg = null;//加載圖片//Draw01.class獲取類的字節碼對象try {bg= ImageIO.read(Draw.class.getResourceAsStream("image/background.png"));} catch (IOException e) {e.printStackTrace();}//畫圖片g.drawImage(bg,0,0,null);//英雄機g.drawImage(hero.getImage(),hero.getX(),hero.getY(),null);//狀態切換if(start==START){g.drawImage(ImageFiler.start,0,0,null);}else if(start==RUNNING){//g.drawImage(ImageFiler.heroplane1,heroPlane1.getX(),heroPlane1.getY(),null);//畫所有飛行物paintflyings(g);//小飛機// LittlePlane littlePlane = new LittlePlane();//g.drawImage(littlePlane.getImage(),littlePlane.getX(),littlePlane.getY(),null);//g.drawImage(ImageFiler.littleplane,littlePlane.getX(),littlePlane.getY(),null);//大飛機//BigPlane bigPlane = new BigPlane();//g.drawImage(bigPlane.getImage(),bigPlane.getX(),bigPlane.getY(),null);//小蜜蜂//Bee bee = new Bee();// g.drawImage(bee.getImage(),bee.getX(),bee.getY(),null);//子彈//Bullet bullet = new Bullet(200, 400);//g.drawImage(bullet.getImage(),bullet.getX(),bullet.getY(),null);//畫子彈paintBullet(g);if(hero.blood==0){start=GAME_OVER;}}else if(start==PAUSE){paintflyings(g);paintBullet(g);g.drawImage(ImageFiler.pause,0,0,null);}else if(start==GAME_OVER){g.drawImage(ImageFiler.gameover,0,0,null);}//設置字體大小Font font = new Font("微軟雅黑",Font.BOLD,20);g.setFont(font);//設置顏色Color color = new Color(0,0,0);g.setColor(color);g.drawString("Score:"+hero.score,0,30);g.drawString("Life:"+hero.blood,0,50);}//畫子彈private void paintBullet(Graphics g) {for (int i = 0; i < bullets.size(); i++) {Bullet bullet = bullets.get(i);g.drawImage(bullet.getImage(),bullet.getX(),bullet.getY(),null);}}//畫所有飛行物private void paintflyings(Graphics g) {for (int i = 0; i < flyings.size(); i++) {Fly fly = flyings.get(i);g.drawImage(fly.getImage(),fly.getX(),fly.getY(),null);}}}HeroPlane類:英雄機類
package planewar;/*英雄機*/ public class HeroPlane extends Fly implements Enemy , Award {int score = 0;Bullet[] bs;HeroPlane(){x=150;y=400;image=ImageFiler.heroplane;imageWidth=image.getWidth();imageHeight=image.getHeight();blood=3;}//計數int count = 0;//數組存圖片//BufferedImage[] images = {ImageFiler.heroplane,ImageFiler.heroplane1};@Overridevoid move() {//圖片的切換count++;//images[count%2];//this.setImage( images[count%2]);if(count%5==0){setImage(ImageFiler.heroplane1);}else{setImage(ImageFiler.heroplane);}//跟隨鼠標移動}int doublefire = 0;//剩余雙倍火力public void doubleFire(){doublefire += 15;}public Bullet[] shoot(){Bullet[] bs = new Bullet[0];if(doublefire == 0){bs = new Bullet[1];bs[0]= new Bullet(this.getX(), this.getY());}else{bs = new Bullet[2];bs[0]= new Bullet(this.getX()-getImageWidth()/4, this.getY());bs[1]= new Bullet(this.getX()+getImageWidth()/4, this.getY());doublefire--;}return bs;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}@Overridepublic int addblood() {return blood;} }Bullet類:子彈類
package planewar; /*子彈*/ public class Bullet extends Fly{int speed;Bullet(int x , int y){blood=1;image=ImageFiler.bullet;imageWidth=image.getWidth();imageHeight=image.getHeight();this.x=x+46;this.y=y-imageHeight;speed=3;}@Overridevoid move() {y -=speed;}public int getSpeed() {return speed;}public void setSpeed(int speed) {this.speed = speed;} }LittlePlane類:小敵機類
package planewar;import java.util.ArrayList;/*小敵機*/ public class LittlePlane extends Fly implements Enemy{int score = 1;int speed;int count=0;//構造方法LittlePlane(){image = ImageFiler.littleplane;imageWidth = image.getWidth();imageHeight = image.getHeight();x= (int) (Math.random()*400);y=-imageHeight;blood=1;//初始化速度speed=3;}@Overridevoid move() {//隨機x坐標 y++下移//成員變量是private修飾//setY(getY()+speed);//成員變量是protected修飾if(blood!=0){y +=speed;}else{if(count==0){setImage(ImageFiler.littleplane1);}else if(count==4){setImage(ImageFiler.littleplane2);}else if(count==8){setImage(ImageFiler.littleplane3);}else if(count==12){setImage(ImageFiler.littleplane4);}else if(count == 16){remove = true;}count++;}}public int getScore() {return score;}public void setScore(int score) {this.score = score;}public int getSpeed() {return speed;}public void setSpeed(int speed) {this.speed = speed;} }BigPlane類:大敵機類
package planewar; /*大敵機*/ public class BigPlane extends Fly implements Enemy{int score =5;int speed;int count =0;BigPlane(){blood=5;image = ImageFiler.bigplane;imageWidth=image.getWidth();imageHeight=image.getHeight();x= (int) (Math.random()*400);y=-imageHeight;speed=1;}@Overridevoid move() {//隨機x坐標 y++下移if(blood!=0){y +=speed;}else{if(count==0){setImage(ImageFiler.bigplane1);}else if(count==4){setImage(ImageFiler.bigplane2);}else if(count==8){setImage(ImageFiler.bigplane3);}else if(count==12){setImage(ImageFiler.bigplane4);}else if(count==16){remove=true;}count++;}}public int getScore() {return score;}public void setScore(int score) {this.score = score;}public int getSpeed() {return speed;}public void setSpeed(int speed) {this.speed = speed;} }Bee類:小蜜蜂類
package planewar; /*小蜜蜂*/ public class Bee extends Fly implements Award {int speed;boolean aBoolean=true;int count=0;Bee(){blood=1;image=ImageFiler.bee;imageWidth=image.getWidth();imageHeight=image.getHeight();x= (int) (Math.random()*400);y=-imageHeight;speed=2;}@Overridevoid move() {//隨機x坐標y++ x++ if(x=400) x--;if(x=0) x++;if(blood!=0){//y +=speed;if(aBoolean){x +=speed*2;y +=speed;}else {x -=speed*2;y +=speed;}if(x>400-imageWidth){x -=speed*2;aBoolean=false;}else if(x<0){x +=speed*2;aBoolean=true;}}else{if(count==0){setImage(ImageFiler.bee1);}else if(count==4){setImage(ImageFiler.bee2);}else if(count==8){setImage(ImageFiler.bee3);}else if(count==12){setImage(ImageFiler.bee4);}else if(count == 16){remove=true;}count++;}}public int getSpeed() {return speed;}public void setSpeed(int speed) {this.speed = speed;}@Overridepublic int addblood() {return 1;} }Enemy接口:敵機得分接口
package planewar; /*加分數*/ public interface Enemy {int getScore(); }Award接口:加血獎勵接口
package planewar;public interface Award {int addblood(); }運行結果:
在這三天邊學邊做的過程中收獲非常多,理解了很多知識點,學會了自己查找問題。
全部代碼都在上面,圖片素材不知道怎么上傳,需要的可以隨時找我!
總結
以上是生活随笔為你收集整理的JAVA编写飞机大战---分析过程及源代码(超详细超完整)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 南师大632c语言程序设计,单片机c语言
- 下一篇: 大数据和人工智能的关系是什么?