日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java飞机大战游戏(需求分析+代码+图片)

發布時間:2023/12/15 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java飞机大战游戏(需求分析+代码+图片) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

shoot射擊游戲項目一

1.需求分析:

運行項目,看結果:

A:小敵機,大敵機,蜜蜂,--------敵人

英雄機發射子彈

B:

子彈擊中小敵機----玩家得分 1分

子彈擊中大敵機----玩家得分 5分

子彈擊中小蜜蜂-----玩家得 1生命或者火力值30

C:

英雄機的火力值變為0 的時候,就變成單倍火力

火力值變為0 的時候,變為雙倍火力;依此減少2

D:碰撞

敵人與英雄機發發生碰撞,碰撞之后,英雄機的生命值減少,變位0的時候,游戲結束

2.計數分析

設計類:

A:找對象:6個對象

英雄機,小敵機,大敵機,蜜蜂,子彈,天空

B:抽類

Hero/Airplane/BIgAirplane/Bee/Bullet/Sky

C:設計成員變量和方法

shoot射擊游戲項目二

1.需求分析:

A:設計一個父類、超類:并且讓6個對象繼承超類,測試

B:給超累添加構造方法;讓六個對像分別調用超類

C: 設置對象數組,進行測試

D:在六各子類,派生類中重寫

E:畫窗體

2.技術分析:

重寫和重載:

重寫:(Override)

  • 發生在父子類中,方法名形同,參數列表相同,方法體不同;
  • 遵循“運行期綁定”,看對象的類型來調用方法;

重載:(Overload)

  • 發生在一個類中,方法名相同,參數列表不同,方法體不同:
  • 遵循“編譯器綁定”,看參數,引用類型綁定法;

shoot射擊游戲項目三

A:給類中添加修飾符

B:給6個派生類中添加圖片屬性

1):6個類種添加Static

2)在父類中添加靜態方法Loadlmage()添加圖片

3):六個派生類中static代碼塊調用Loadlmage()方法

2:技術實現:

修飾符

y/n public protected default private 同一個類 y y y y 同一個包中不同類 y y y 不同包類 y y 不同胞中的類 y

Shoot射擊游戲四

1.需求分析

A:將窗體大小設置成常量

B:畫對象:

想畫對象先獲取圖片,針對每個對象能夠獲取到圖片,

獲取到圖片的行為事共有的,設計到父類中;

每個對象得到圖片的行為是不一樣的,設計了抽象的方法----getImage();

在不同狀態下,得到不同的圖片;

狀態:設計到父類中,設計常量:Life DEAD; REMOVE

默認狀態:state=LIFE

獲取圖片的同時,需不需要判斷當前的裝態???? y

每個對象都需要判斷。設計到超類,父類中;

而每個對象判斷行為都是不一樣的,設計普通方法即可;

-----FlyObject:isLife()/isDead()/isRemove()

C:在6個子類中重寫getImage()方法

  • Sky:直接返回即可
  • 子彈Bullet:如果是存活的返回images即可
    如果是over的刪除即可
  • 英雄機:如果是存活,返回imgaes[0]/images[1]
  • 小敵機:如多存活,返回images[0]
    如果over,images[1]—images[4]進行切換,切換完畢,到了images[4]后進行刪除

D:得到不同狀態下的圖片,進行開始畫出來;

畫對象的行為是共有的,所以涉及到超類中;

每個對象畫的方式都是一樣的,所以設計為【普通方法】

E:測試,調用即可

設計規則:

  • 將所有子類所共有的行為和屬性,可以設計到超累中;抽共性
  • 所有子類的行為都是一樣的,設計為普通方法;所有子類的行為都是不一樣的—設計成抽象方法

Shoot射擊游戲五

1.需求分析

A:敵人入場

  • 產生敵人:在ShootMain類中nextOne()

  • 需要定時加載敵人----enterAction()實現敵人入場;

  • 每400毫秒,獲取到敵人,擴容,將敵人添加到數組最后一位

  • 英雄機中發射子彈,hero類設計有一個方法來實現子彈的發射----shoot()

  • run()方法中,子彈發射shootAction()

  • 每400毫秒。獲取到子彈數組,擴容,將子彈數組添加到

C:飛行物移動

D:英雄機隨鼠標移動

  • 在hero()中設計方法:moveto()實現英雄機的移動
  • 在ShootMain中建立監聽機制,檢測鼠標移動

E:刪除越界飛行物

  • 在Flyobject中設計一個方法outOfBounds()—檢測是否越界
  • 在run()方法中,寫一個方法outOfBountAction()刪除飛行物越界
  • 遍歷敵人,子彈數組,如果對象不越界,那么將存放到不越界的數組中,將不越界的數組復制到敵人,子彈數組

F:設計接口

  • 擊中小敵機+大敵機-----得1 分 或者3分
  • 擊中蜜蜂----隨機得生命或者活力值

Shoot射擊游戲六

子彈與敵人碰撞:

  • 設計到父類中,hit()方法,實現檢測子彈與敵人大聲碰撞
  • 在父類中設計一個goDead()實現飛行物over
  • 在Hero類種設計實現addLife(),addDoubleFire()
  • 通過AirPlane和BigAirplane中的接口來實現玩家得分
  • 通過Bee中的接口來實現玩家獲得獎勵

代碼實現

子彈:

package cn.tedu.shoot;import java.awt.image.BufferedImage;/*** 子彈* @author Administrator**/ public class Bullet extends FlyingObject{private static BufferedImage images;//靜態代碼塊static {images = loadImage("bullet.png");}private int speed;//速度/**構造方法*/public Bullet(int x, int y){super(8, 14, x, y);speed = 2;}/**子彈的移動*/public void step(){this.y -= speed;}/**重寫getImage()方法獲取到圖片*/@Overridepublic BufferedImage getImage() {if (isLife()) {return images;}else if(isDead()){state = REMOVE;//修改狀態為刪除狀態}return null;}/**檢測是否越界*/@Overridepublic boolean outOfBounds() {return this.y <= -this.height;}}

大敵機:

package cn.tedu.shoot;import java.awt.image.BufferedImage; import java.util.Random;/*** 大敵機:* * @author Administrator**/ public class BigAirplane extends FlyingObject implements Enemy{private static BufferedImage[] images;// 靜態代碼塊static {images = new BufferedImage[5];for (int i = 0; i < images.length; i++) {images[i] = loadImage("bigplane" + i + ".png");}}int speed;// 速度/** 構造方法 */public BigAirplane() {super(99, 89);this.speed = 2;}public void step(){this.y += speed;}// 得到圖片int index = 1;@Overridepublic BufferedImage getImage() {// 10Mif (isLife()) {return images[0];} else if (isDead()) {// 圖片的切換BufferedImage img = images[index++];if (index == images.length) {state = REMOVE;}return img;}/** images[index++]; index = 1; 10M images[1] index = 2 返回images[1] 20M* images[2] index = 3 返回images[2] 30M images[3] index = 4 返回images[3]* 40M images[4] index = 5 返回images[4]*/return null;}/**重寫得分接口*/@Overridepublic int getScore() {return 3;}}

小敵機:

package cn.tedu.shoot; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.util.Random; /*** 小敵機:* @author Administrator**/ public class Airplane extends FlyingObject implements Enemy{private static BufferedImage[] images;//靜態代碼塊static {images = new BufferedImage[5];for (int i = 0; i < images.length; i++) {images[i] = loadImage("airplane" + i + ".png");}}private int speed;//速度/**構造方法*/public Airplane(){super(49, 36);this.speed = 5;}/**移動*/public void step(){this.y += speed;}//得到圖片int index = 1;@Overridepublic BufferedImage getImage() {//10Mif (isLife()) {return images[0];}else if(isDead()){//圖片的切換BufferedImage img = images[index++];if (index == images.length) {state = REMOVE;}return img;}/*images[index++];* index = 1;* 10M images[1] index = 2 返回images[1]* 20M images[2] index = 3 返回images[2]* 30M images[3] index = 4 返回images[3]* 40M images[4] index = 5 返回images[4]* */return null;}@Overridepublic int getScore() {return 1;} }

英雄機

package cn.tedu.shoot;import java.awt.image.BufferedImage;/*** 英雄機:* * @author Administrator**/ public class Hero extends FlyingObject{private static BufferedImage[] images;//靜態代碼塊static {images = new BufferedImage[2];for (int i = 0; i < images.length; i++) {images[i] = loadImage("hero" + i + ".png");}}//成員變量private int life;//生命值private int doubleFire;//火力/**構造方法*/public Hero() {super(97, 124, 140, 400);life = 6;doubleFire = 0;//單倍火力}/**英雄機的移動:隨著鼠標的移動而動*/public void movedTo(int x, int y){this.x = x - this.width/2;this.y = y - this.height/2;}/**英雄機的移動*/public void step(){System.out.println("圖片的切換");}int index = 0;@Overridepublic BufferedImage getImage() { // return images[0];return images[index++/10%images.length];}/**英雄機產生子彈*/public Bullet[] shoot(){int xStep = this.width/4;int yStep = 15;if (doubleFire > 0) {//雙倍火力Bullet[] bs = new Bullet[2];bs[0] = new Bullet(this.x + xStep * 1, this.y - yStep);bs[1] = new Bullet(this.x + xStep * 3, this.y - yStep);doubleFire -= 2;return bs;}else{Bullet[] bs = new Bullet[1];bs[0] = new Bullet(this.x + xStep * 2, this.y - yStep);return bs;}}public void addDoubleFire(){doubleFire += 10;}public void addLife(){life++;}/**獲得生命*/public int getLife(){return life;}/**減少生命*/public void substractLife(){life--;}/**清空火力*/public void clearDoubleFire(){doubleFire = 0;}}

蜜蜂:

package cn.tedu.shoot;import java.awt.image.BufferedImage; import java.util.Random;/*** 蜜蜂:* * @author 小二郎**/ public class Bee extends FlyingObject implements Award{private static BufferedImage[] images;// 靜態代碼塊static {images = new BufferedImage[5];for (int i = 0; i < images.length; i++) {images[i] = loadImage("bee" + i + ".png");}}private int xSpeed;// x坐標的速度private int ySpeed;// y坐標的速度private int awardType;// 獲取獎勵的類型public Bee() {super(29, 39);xSpeed = 1;ySpeed = 2;Random rand = new Random();awardType = rand.nextInt(2);// 0 1}public void step() {x += xSpeed;y += ySpeed;if (x < 0 || x >= ShootMain.SCREEN_WIDTH - this.width) {xSpeed *= -1;}}// 得到圖片int index = 1;@Overridepublic BufferedImage getImage() {// 10Mif (isLife()) {return images[0];} else if (isDead()) {// 圖片的切換BufferedImage img = images[index++];if (index == images.length) {state = REMOVE;}return img;}return null;}@Overridepublic int getAwardType() {// TODO Auto-generated method stubreturn awardType;}}

天空:

package cn.tedu.shoot;import java.awt.Graphics; import java.awt.image.BufferedImage;/*** 天空:* * @author Administrator**/ public class Sky extends FlyingObject {private static BufferedImage images;// 靜態代碼塊static {images = loadImage("background.png");}private int speed;// 速度public int y1;// 第二張圖片的坐標/** 構造方法 */public Sky() {super(ShootMain.SCREEN_WIDTH, ShootMain.SCREEN_HEIGHT, 0, 0);speed = 1;y1 = -ShootMain.SCREEN_HEIGHT;}/** 天空移動 */public void step() {y += speed;y1 += speed;if (y >= ShootMain.SCREEN_HEIGHT) {y = -ShootMain.SCREEN_HEIGHT;}if (y1 >= ShootMain.SCREEN_HEIGHT) {y1 = -ShootMain.SCREEN_HEIGHT;}}@Overridepublic BufferedImage getImage() {return images;}/** 重寫父類中的方法 */@Overridepublic void paintObject(Graphics g) {g.drawImage(getImage(), x, y, null);g.drawImage(getImage(), x, y1, null);}}

飛行物得父類

package cn.tedu.shoot;import java.awt.Graphics; import java.awt.image.BufferedImage; import java.util.Random;import javax.imageio.ImageIO;/*** 父類:飛行物* * @author 小二郎**/ public abstract class FlyingObject {// 成員變量protected int width;// 寬protected int height;// 高protected int x;// x坐標protected int y;// y坐標// 設計三種狀態public static final int LIFE = 0;// 存活public static final int DEAD = 1;// overpublic static final int REMOVE = 2;// 刪除public int state = LIFE;// 當前狀態為存活/** 提供敵人(小敵機+大敵機+蜜蜂) */public FlyingObject(int width, int height) {this.width = width;this.height = height;Random rand = new Random();// 小敵機出現的位置this.x = rand.nextInt(ShootMain.SCREEN_WIDTH - this.width);this.y = -this.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 step() {}/** 讀取圖片 */public static BufferedImage loadImage(String fileName) {try {// 同包之內的圖片讀取BufferedImage img = ImageIO.read(FlyingObject.class.getResource(fileName));return img;} catch (Exception e) {e.printStackTrace();throw new RuntimeException();}}/** 獲取圖片 */public abstract BufferedImage getImage();/** 畫圖片 g:畫筆 */public void paintObject(Graphics g) {g.drawImage(this.getImage(), this.x, this.y, null);}/** 判斷當前狀態是不是存活的 */public boolean isLife() {return state == LIFE;}/** 判斷當前狀態是不是over的 */public boolean isDead() {return state == DEAD;}/** 判斷當前狀態是不是刪除的 */public boolean isRemove() {return state == REMOVE;}/** 檢測越界的方法 */public boolean outOfBounds() {return this.y >= ShootMain.SCREEN_HEIGHT;}/* 實現子彈與敵人發生碰撞 other:子彈敵人 */public boolean hit(FlyingObject other) {int x1 = this.x - other.width;int y1 = this.y - other.height;int x2 = this.x + this.width;int y2 = this.y + this.height;int x = other.x;int y = other.y;return x >= x1 && x <= x2 && y >= y1 && y <= y2;}/** 飛行物over */public void goDead() {state = DEAD;// 將對象狀態修改為DAED}public int getScore() {// TODO Auto-generated method stubreturn 0;}}

得分接口

package cn.tedu.shoot; /*** 得分接口* @author 小二郎**/ public interface Enemy {/*得分*/public int getScore();}

獎勵接口

package cn.tedu.shoot; /*** 得分接口* @author 小二郎**/ public interface Enemy {/*得分*/public int getScore();}

主函數得類:

package cn.tedu.shoot;import java.awt.AWTError; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.util.Arrays; import java.util.Random; import java.util.Timer; import java.util.TimerTask;import javax.swing.JFrame; import javax.swing.JPanel;/*** 主函數的類:* * @author Administrator**/ public class ShootMain extends JPanel {public static final int SCREEN_WIDTH = 400;public static final int SCREEN_HEIGHT = 700;//起始狀態START/RUNNING/PAUSE/GAME_OVER//默認起始狀態/** 鼠標點擊事件:* 開始--運行 結束---開始* 鼠標移動事件:* 啟動狀態:結束----啟動* 暫停狀態:鼠標從屏幕里劃到外* 運行狀態:從外到內的時候* 結束狀態:英雄機的生命為0*/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;public int state = START;//默認狀態public static BufferedImage start;public static BufferedImage pause;public static BufferedImage gameover;//靜態代碼塊static{start = FlyingObject.loadImage("start.png");pause = FlyingObject.loadImage("pause.png");gameover = FlyingObject.loadImage("gameover"+ ".png");}private Sky sky = new Sky();private Hero hero = new Hero();private FlyingObject[] flys = {};private Bullet[] bullets = {};/** 產生敵人對象 */public FlyingObject nextOne() {Random rand = new Random();int type = rand.nextInt(20);if (type < 5) {return new Airplane();} else if (type < 12) {return new Bee();} else {return new BigAirplane();}}/** 實現敵人入場 */int enterIndex = 0;public void enterAction() {enterIndex++;if (enterIndex % 40 == 0) {// 獲取到敵人FlyingObject f = nextOne();// 敵人添加到數組的最后一位上flys = Arrays.copyOf(flys, flys.length + 1);flys[flys.length - 1] = f;}}/** 子彈入場 */int shootIndex = 0;public void shootAction() {shootIndex++;if (shootIndex % 40 == 0) {Bullet[] bs = hero.shoot();// 獲取子彈數組bullets = Arrays.copyOf(bullets, bullets.length + bs.length);// 將產生的子彈數組放到源數組中的最后一個元素System.arraycopy(bs, 0, bullets, bullets.length - bs.length,bs.length);}}/** 飛行物移動 */public void stepAction() {sky.step();for (int i = 0; i < flys.length; i++) {flys[i].step();}for (int i = 0; i < bullets.length; i++) {bullets[i].step();}}/**刪除越界的飛行物*/public void outOfBoundsAction(){int index = 0;//存放不越界數組的下標,個數//新建不越界的敵人數組FlyingObject[] flysLive = new FlyingObject[flys.length];for (int i = 0; i < flys.length; i++) {//獲取到每一個敵人FlyingObject f = flys[i];//判斷敵人是否不越界if (!f.outOfBounds()) {//如果不越界,flysLive[index] = f;index++;}//將不越界的敵人存放到不越界的數組中}flys = Arrays.copyOf(flysLive, index);//System.out.println("index == " + index);index = 0;Bullet[] bulletLive = new Bullet[bullets.length];for (int i = 0; i < bullets.length; i++) {Bullet b = bullets[i];if (!b.outOfBounds()) {bulletLive[index] = b;index++;}}bullets = Arrays.copyOf(bulletLive, index);}/**子彈與敵人的碰撞*/int score = 0;//玩家的得分記錄public void bulletBangAction(){//遍歷所有的子彈for (int i = 0; i < bullets.length; i++) {//獲取每一個子彈Bullet b = bullets[i];//遍歷所有的敵人for (int j = 0; j < flys.length; j++) {//獲取每一個敵人FlyingObject f = flys[j];//判斷碰撞if (f.isLife() && b.isLife() && f.hit(b)) {f.goDead();//敵人overb.goDead();//子彈overif (f instanceof Enemy) {//如果撞上的是敵人能得分Enemy e = (Enemy)f;score += e.getScore();}//如果撞上的是獎勵if (f instanceof Award) {Award a = (Award)f;int type = a.getAwardType();switch (type) {case Award.DOUBLE_FIRE://火力hero.addDoubleFire();break;case Award.LIFE://生命hero.addLife();break;}}}}}}/**英雄機與敵人發生碰撞*/public void heroBangAction(){/** 思路:* 1)借助FlyingObject中的hit()方法檢測碰撞* 2)借助FlyingObject中的goDead()方法over* 3)在Hero類中設計一個方法實現碰撞之后* substractLife()減少生命, clearDoubleFire()火力清0* 4) 在run()方法中實現英雄機與敵人發生碰撞* heroBangAction();* 遍歷敵人獲取到每一個敵人:* 判斷撞上了:* 敵人over,英雄機減少生命,清空火力*///遍歷所有的敵人for (int i = 0; i < flys.length; i++) {//獲取每一個敵人FlyingObject f = flys[i];if (hero.isLife() && f.isLife() && f.hit(hero)) {f.goDead();hero.substractLife();//減少生命hero.clearDoubleFire();//清空火力}}}/**檢測游戲是否結束*/public void checkGameOverAction(){//判斷英雄機的生命值,//如果小于0的話,游戲結束,修改狀態if(hero.getLife() <= 0){state = GAME_OVER;}}/** 測試方法 */public void action() {// 數組越界、數組空指針異常//鼠標適配器MouseAdapter ma = new MouseAdapter() {/**重寫鼠標的移動事件*/public void mouseMoved(MouseEvent e){int x = e.getX();int y = e.getY();hero.movedTo(x, y);}/**重寫鼠標的點擊事件*/@Overridepublic void mouseClicked(MouseEvent e) {//根據當前狀態的不同,進行相應的處理switch (state) {case START:state = RUNNING;break;case GAME_OVER:score = 0;sky = new Sky();hero = new Hero();flys = new FlyingObject[0];bullets = new Bullet[0];state = START;//修改狀態為開始狀態break;}}/**重寫鼠標的移入事件*/@Overridepublic void mouseEntered(MouseEvent e) {if (state == PAUSE) {state = RUNNING;}}/**重寫鼠標的移出事件*/@Overridepublic void mouseExited(MouseEvent e) {if (state == RUNNING) {state = PAUSE;}}};this.addMouseListener(ma);//處理鼠標的操作事件this.addMouseMotionListener(ma);//處理鼠標的移動事件// 定時器對象Timer timer = new Timer();int inters = 10;timer.schedule(new TimerTask() {@Overridepublic void run() {if (state == RUNNING) {enterAction();// 敵人入場shootAction();// 子彈入場stepAction();// 飛行物移動outOfBoundsAction();//刪除越界的飛行物bulletBangAction();//子彈與敵人的碰撞heroBangAction();//英雄機與敵人發生碰撞checkGameOverAction();//檢測游戲是都結束}repaint();// 重繪,調用paint方法}}, inters, inters);// 計劃任務/** 7.30 20 第一次 10 第一次---第二次*/}/** 畫對象 */@Overridepublic void paint(Graphics g) {super.paint(g);sky.paintObject(g);hero.paintObject(g);// 畫敵人for (int i = 0; i < flys.length; i++) {flys[i].paintObject(g);}for (int i = 0; i < bullets.length; i++) {bullets[i].paintObject(g);}g.drawString("分數:" + score, 30, 60);g.drawString("生命:" + hero.getLife(), 30, 80);switch (state) {//根據不同狀態畫不同的狀態圖case START://開始狀態的啟動圖g.drawImage(start, 0, 0, null);break;case PAUSE://暫停狀態的圖g.drawImage(pause, 0, 0, null);break;case GAME_OVER://游戲結束的時候狀態圖g.drawImage(gameover, 0, 0, null);break;}}/** 主函數:程序的入口 */public static void main(String[] args) {ShootMain sm = new ShootMain();JFrame jf = new JFrame();jf.add(sm);// 將畫布裝在窗體上jf.setSize(SCREEN_WIDTH, SCREEN_HEIGHT);// 窗體的大小jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.setLocationRelativeTo(null);// 居中顯示jf.setVisible(true);sm.action();} }

圖片:




















總結

以上是生活随笔為你收集整理的Java飞机大战游戏(需求分析+代码+图片)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。