最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Java語言在窗體上實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲的完整步驟

 更新時(shí)間:2022年02月17日 09:25:24   作者:newlw  
這篇文章主要給大家介紹了基于Java語言在窗體上實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲的完整步驟,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

小組項(xiàng)目

飛機(jī)大戰(zhàn):用 Java 語言在窗體上實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲,運(yùn)行程序后,出現(xiàn)一個(gè)窗體,在窗體上用鼠標(biāo)控制英雄機(jī)的移動,通過子彈打擊敵機(jī)進(jìn)行分?jǐn)?shù)的計(jì)算,以及英雄機(jī)血量的計(jì)算等。

主要模塊:登陸界面、音樂、子彈、敵機(jī)、英雄機(jī)、背景圖、結(jié)束界面、BOSS 機(jī)、分?jǐn)?shù)計(jì)算、血量計(jì)算。

負(fù)責(zé)模塊:登陸界面、音樂、子彈、結(jié)束界面。

模塊需求描述

登陸界面:運(yùn)行程序后,彈出窗體,在窗體上顯示關(guān)卡模式的選擇,點(diǎn)擊其中的模式后,開始游戲。

結(jié)束界面:重新選擇關(guān)卡模式,即可開始游戲

音樂:登陸音樂,開始游戲音樂。

  1. 子彈的創(chuàng)建
  2. 子彈的發(fā)射
  3. 子彈的移動
  • 一直向上:中間的子彈
  • 左上方向:左邊的子彈
  • 右上方向:右邊的子彈

4.子彈與敵機(jī)碰撞

5.子彈的類型升級

描述:當(dāng)子彈打到道具機(jī)時(shí),子彈一次發(fā)射的個(gè)數(shù)增加一個(gè),最大為 3 個(gè),當(dāng)發(fā)射的個(gè)數(shù)為 3 時(shí),子彈再打到道具機(jī),子彈的類型就升一級,發(fā)射的個(gè)數(shù)置為 1,繼續(xù)重新計(jì)算。第四種子彈只發(fā)射 3 個(gè),發(fā)射后,子彈類型置為第三種子彈,第四種子彈無敵的,打到敵機(jī)不會消失。若期間英雄機(jī)被敵機(jī)碰到,子彈的類型置為 1,發(fā)射的個(gè)數(shù)置為 1。

類型:

  • 第一種子彈:傷害值:1
  • 第二種子彈:傷害值:2
  • 第三種子彈:傷害值:3
  • 第四種子彈:傷害值:100

6.子彈的一次發(fā)射個(gè)數(shù)的升級

描述:在子彈的類型升級中有涉及

類型:

  • 一次發(fā)射一個(gè)子彈
  • 一次發(fā)射兩個(gè)子彈
  • 一次發(fā)射三個(gè)子彈

7.子彈與敵機(jī)碰撞

描述:當(dāng)子彈與敵機(jī)碰撞后,子彈消失,敵機(jī)消失,消滅敵機(jī)數(shù)增加

總體開發(fā)思想

主要的數(shù)據(jù)結(jié)構(gòu)

集合:用集合來存儲子彈的對象,子彈的發(fā)射是從集合中調(diào)出對象,子彈的消失是從集合中刪除相應(yīng)的子彈對象

List<Fire> fires = new ArrayList<Fire>();

移動與碰撞原理

子彈的移動:子彈圖片在窗口中顯示位置橫縱坐標(biāo)的改變

移動方向:

直向上:子彈的橫坐標(biāo)不變,縱坐標(biāo)逐漸變大

左上方向:子彈的橫坐標(biāo)逐漸變小,縱坐標(biāo)逐漸變大

右上方向:子彈的橫坐標(biāo)逐漸變大,縱坐標(biāo)逐漸變大

子彈與敵機(jī)的碰撞:子彈的位置坐標(biāo)在敵機(jī)圖片的位置大小范圍內(nèi)

音樂播放原理

在音樂類中,使用文檔輸入流來讀入音頻,再使用多線程實(shí)現(xiàn)游戲登陸和播放音樂、游戲運(yùn)行和播放音樂的同時(shí)進(jìn)行,在主類中調(diào)用音樂播放的方法。

界面設(shè)計(jì)原理

運(yùn)行程序后,游戲運(yùn)行狀態(tài)為 false,此時(shí)調(diào)用畫板畫出背景圖,選中相應(yīng)的模式后,游戲運(yùn)行狀態(tài)為 ture,登錄界面切換為游戲運(yùn)行界面,游戲結(jié)束后,游戲運(yùn)行狀態(tài)為 false,重新顯示登錄界面。

選擇關(guān)卡模式:調(diào)用鼠標(biāo)監(jiān)聽器,用鼠標(biāo)點(diǎn)擊相應(yīng)的模式字體區(qū)域,獲取到鼠標(biāo)點(diǎn)擊的相應(yīng)坐標(biāo)后,在相應(yīng)的坐標(biāo)區(qū)域中選著相應(yīng)的關(guān)卡模式,關(guān)卡模式是根據(jù)每循環(huán)多少次創(chuàng)建一個(gè)敵機(jī)來實(shí)現(xiàn)的。

開發(fā)語言:Java

功能實(shí)現(xiàn)

1.登錄與結(jié)束界面

在畫板類中:

登陸界面的實(shí)現(xiàn):

// 當(dāng)游戲結(jié)束時(shí),
if (gameover) {
//畫游戲登陸時(shí)的界面
try {
bg = App.getImg("/img/face.png");
} catch (IOException e) {
printStackTrace();//捕獲拋出異常
}

drawImage(bg, 0 ,  0, 512, 728,  null);//畫背景圖片
//選擇關(guān)卡模式(鼠標(biāo)點(diǎn)擊相應(yīng)的位置進(jìn)行操作)
//畫筆為黑色
setColor(Color.black);
//字體大小和類型
setFont(new Font("楷體", Font.BOLD, 30));
//畫的內(nèi)容和位置
drawString("請選擇關(guān)卡模式:", 130, 450);
drawString("(鼠標(biāo)點(diǎn)擊相應(yīng)的位置進(jìn)行操作)", 40, 480);
//畫筆為藍(lán)色
setColor(Color.blue);
//字體大小和類型
setFont(new Font("楷體", Font.BOLD, 50));
//畫的內(nèi)容和位置
drawString("1、簡單模式", 100, 550);
drawString("2、普通模式" , 100, 600);
drawString("3、困難模式" , 100, 650);
}


讀取關(guān)卡模式:

//當(dāng)游戲結(jié)束時(shí),讀取鼠標(biāo)的點(diǎn)擊位置
if(gameover&&ms==0) {
int x=e.getX();//獲取鼠標(biāo)的橫坐標(biāo)
int y=e.getY();//獲取鼠標(biāo)的縱坐標(biāo)
if(y>=500&&y<550&&x>=100&&x<400) {
ms=1;//模式 1
}else if(y>=550&&y<600&&x>=100&&x<400) {
ms=2; //模式 2
}else if(y>=600&&y<650&&x>=100&&x<400) {
ms=3; //模式 3
}
// 刷新界面
repaint();
}

2.播放音樂

在音樂類中:

讀取音樂文件的方法:

static Player player = null;
static void  play(String str) {
    try {
        File file = new File(str);//讀取文件
        FileInputStream fis = new FileInputStream(file);
        BufferedInputStream stream = new BufferedInputStream(fis);//讀取流的轉(zhuǎn)化
        player = new Player(stream);//創(chuàng)建一個(gè)播放音樂類對象
        player.play();//播放音樂
    } catch (FileNotFoundException | JavaLayerException e1) {
        printStackTrace();//拋出捕獲異常
    }
}

播放音樂的方法:

/*
播放音樂的線程
*/
//游戲運(yùn)行音樂
public void music1() {
    new Thread() {
        @Override
        public void run() {
            while (true) {
                System.out.println("播放音樂");
//如果游戲沒結(jié)束就播放
                if (!GamePanel.gameover) {
                    Music.play("D:\\java文件\\飛機(jī)大戰(zhàn).mp3");
                }
            }
        }
    } .start();
}
//登陸音樂
public void music2() {
    new Thread() {
        @Override
        public void run() {
            Music.play("D:\\java文件\\mini.mp3");
        }
    } .start();
}

在主類中:

//創(chuàng)建音樂類對象
Music music =new Music();
//播放登陸音樂
music.music2();
//播放游戲運(yùn)行音樂
music.music1();

3.子彈

創(chuàng)建

子彈類中:

//hx、hy子彈的橫縱坐標(biāo),dir子彈的移動方向,num子彈的類型
public Fire(int hx,int hy,int dir,int num) throws IOException {
//確定子彈的圖片
    img=App.getImg("/img/fire"+num+".png");
//確定子彈火力的大小
    if(num==1) {
        fr=1;
    } else if(num==2) {
        fr=2;
    } else if(num==3) {
        fr=3;
    } else if(num==4) {
        fr=100;
    }
    w=35;
    h=35;
//確定子彈的位置(初始位置在英雄機(jī)上)
    x=hx;
    y=hy;
    this.dir=dir;
    this.num=num;
}

在畫板類中:

/*
*創(chuàng)建子彈的方法
*/
int findex = 0;// 記錄shoot方法執(zhí)行的次數(shù)
protected void shoot() throws IOException {
    findex++;
    if (findex == 20) {//減少創(chuàng)建的頻率
        if (power == 1) {//當(dāng)火力值為1,即一次發(fā)射一顆子彈
// 創(chuàng)建子彈,num子彈的類型
            Fire fire3 = new Fire(hero.x + 40, hero.y, 1, num);
// 將子彈加入到彈藥庫中
            fires.add(fire3);
//當(dāng)火力值為2,即一次發(fā)射兩顆子彈
        } else if (power == 2) {
// 創(chuàng)建子彈
            Fire fire1 = new Fire(hero.x + 10, hero.y, 1, num);
// 將子彈加入到彈藥庫中
            fires.add(fire1);
// 創(chuàng)建子彈
            Fire fire2 = new Fire(hero.x + 80, hero.y, 1, num);
// 將子彈加入到彈藥庫中
            fires.add(fire2);
//當(dāng)火力值為3,即一次發(fā)射三顆子彈
        } else if (power == 3) {
// 創(chuàng)建子彈
            Fire fire1 = new Fire(hero.x, hero.y, 0, num);
// 將子彈加入到彈藥庫中
            fires.add(fire1);
// 創(chuàng)建子彈
            Fire fire2 = new Fire(hero.x + 50, hero.y - 20, 1, num);
// 將子彈加入到彈藥庫中
            fires.add(fire2);
// 創(chuàng)建子彈
            Fire fire3 = new Fire(hero.x + 100, hero.y, 2, num);
// 將子彈加入到彈藥庫中
            fires.add(fire3);
//當(dāng)火力值為4,即一次發(fā)射三顆無敵子彈
        } else if (power == 4) {
// 創(chuàng)建子彈
            Fire fire1 = new Fire(hero.x+15, hero.y, 0, num);
// 將子彈加入到彈藥庫中
            fires.add(fire1);
// 創(chuàng)建子彈
            Fire fire2 = new Fire(hero.x, hero.y - 20, 1, num);
// 將子彈加入到彈藥庫中
            fires.add(fire2);
// 創(chuàng)建子彈
            Fire fire3 = new Fire(hero.x + 70, hero.y, 2, num);
// 將子彈加入到彈藥庫中
            fires.add(fire3);
//power置為1,無敵子彈創(chuàng)建完后,變成類型3
            power=1;
            num=3;
        }
        findex = 0;// 計(jì)數(shù)器歸零
    }
}
-

發(fā)射

在畫板類中:

// 在窗體上畫子彈
// 遍歷集合,畫出所有的敵機(jī)
for (int i = 0; i < fires.size(); i++) {
// 獲取每一個(gè)子彈
    Fire fire = fires.get(i);
//畫出子彈
    drawImage(fire.img, fire.x, fire.y, fire.w, fire.h, null);
}

移動

子彈類中:

/*
* 子彈移動的方法
*/
public void move() {
if(dir==0) {
//左上
y=y-10;
x=x-2;
}else if(dir==1) {
//直走
y=y-10;
}else if(dir==2) {
//右上
y=y-10;
x=x+2;
}
}

碰撞敵機(jī)與升級

在畫板類中:

/*

?    *判斷一顆子彈是否擊中了敵機(jī)

*/
private void bang(Fire fire) {
// 遍歷所有的敵機(jī)
    for (int i = 0; i < eps.size(); i++) {
// 獲取每一個(gè)敵機(jī)
        Ep e = eps.get(i);
// 判斷該子彈是否擊中敵機(jī)
        if (e.shootBy(fire)) {
// 如果敵機(jī)被子彈擊中
// 如果不是導(dǎo)彈機(jī)(導(dǎo)彈機(jī)不會死亡,編號是15)
            if (e.type != 15) {
// 1.讓敵機(jī)的血量減少
                hp=e.hp-fire.fr;
// 當(dāng)敵機(jī)的血量減少到零時(shí),死亡
                if (e.hp <= 0) {
// 判斷敵機(jī)是否是道具機(jī)(道具機(jī)編號為12,打死道具機(jī),子彈會升級)
                    if (e.type == 12) {
// 增加火力值,即一次發(fā)射的子彈數(shù)
                        power++;
// 如果power值大于3,增加英雄機(jī)血量,子彈類型升級
                        if (power > 3) {
                            hero.hp++;//英雄機(jī)增加血量
                            if (hero.hp > 5) {
                                hero.hp = 5;
                            }
//類型1-》類型2
                            if (num == 1) {
                                num = 2;
                                power=1;
//類型2-》類型3
                            } else if (num == 2) {
                                num = 3;
                                power=1;
//類型3-》類型4(創(chuàng)建完子彈類型4后,創(chuàng)建方法后面num置為3,power置為1)
                            } else if(num==3) {
                                num=4;
                                power=4;
                            }
                        }
                    }
// 2.敵機(jī)死亡(消失:從敵機(jī)大本營中刪除)
                    eps.remove(e);
// 3.增加分?jǐn)?shù)
                    score =e.type+ score;
//4.消滅的敵機(jī)數(shù)
                    Ep.number++;
                }
// 4.子彈消失:如果不是類型4(類型4無敵的),就從子彈庫中刪除
                if(num!=4) {
                    fires.remove(fire);
                }
            }
        }
    }
}

運(yùn)行測試

登陸界面

發(fā)射子彈

子彈類型 1

子彈類型 2

子彈類型 3

子彈類型 4

總結(jié)

到此這篇關(guān)于基于Java語言在窗體上實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲的文章就介紹到這了,更多相關(guān)Java在窗體實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

延庆县| 龙口市| 孝感市| 都江堰市| 蛟河市| 广宗县| 南靖县| 南漳县| 资兴市| 永川市| 南宁市| 普格县| 东源县| 恩施市| 江西省| 武隆县| 垫江县| 泗阳县| 法库县| 九寨沟县| 菏泽市| 新沂市| 大洼县| 麻江县| 通城县| 洛南县| 翁源县| 闸北区| 衡南县| 靖边县| 民权县| 历史| 兖州市| 新乐市| 赤壁市| 洛隆县| 高密市| 贺州市| 柞水县| 孟村| 邓州市|