基于Java語(yǔ)言在窗體上實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲的完整步驟
小組項(xiàng)目
飛機(jī)大戰(zhàn):用 Java 語(yǔ)言在窗體上實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲,運(yùn)行程序后,出現(xiàn)一個(gè)窗體,在窗體上用鼠標(biāo)控制英雄機(jī)的移動(dòng),通過(guò)子彈打擊敵機(jī)進(jìn)行分?jǐn)?shù)的計(jì)算,以及英雄機(jī)血量的計(jì)算等。
主要模塊:登陸界面、音樂(lè)、子彈、敵機(jī)、英雄機(jī)、背景圖、結(jié)束界面、BOSS 機(jī)、分?jǐn)?shù)計(jì)算、血量計(jì)算。
負(fù)責(zé)模塊:登陸界面、音樂(lè)、子彈、結(jié)束界面。
模塊需求描述
登陸界面:運(yùn)行程序后,彈出窗體,在窗體上顯示關(guān)卡模式的選擇,點(diǎn)擊其中的模式后,開(kāi)始游戲。
結(jié)束界面:重新選擇關(guān)卡模式,即可開(kāi)始游戲
音樂(lè):登陸音樂(lè),開(kāi)始游戲音樂(lè)。
- 子彈的創(chuàng)建
- 子彈的發(fā)射
- 子彈的移動(dòng)
- 一直向上:中間的子彈
- 左上方向:左邊的子彈
- 右上方向:右邊的子彈
4.子彈與敵機(jī)碰撞
5.子彈的類(lèi)型升級(jí)
描述:當(dāng)子彈打到道具機(jī)時(shí),子彈一次發(fā)射的個(gè)數(shù)增加一個(gè),最大為 3 個(gè),當(dāng)發(fā)射的個(gè)數(shù)為 3 時(shí),子彈再打到道具機(jī),子彈的類(lèi)型就升一級(jí),發(fā)射的個(gè)數(shù)置為 1,繼續(xù)重新計(jì)算。第四種子彈只發(fā)射 3 個(gè),發(fā)射后,子彈類(lèi)型置為第三種子彈,第四種子彈無(wú)敵的,打到敵機(jī)不會(huì)消失。若期間英雄機(jī)被敵機(jī)碰到,子彈的類(lèi)型置為 1,發(fā)射的個(gè)數(shù)置為 1。
類(lèi)型:
- 第一種子彈:傷害值:1
- 第二種子彈:傷害值:2
- 第三種子彈:傷害值:3
- 第四種子彈:傷害值:100
6.子彈的一次發(fā)射個(gè)數(shù)的升級(jí)
描述:在子彈的類(lèi)型升級(jí)中有涉及
類(lèi)型:
- 一次發(fā)射一個(gè)子彈
- 一次發(fā)射兩個(gè)子彈
- 一次發(fā)射三個(gè)子彈
7.子彈與敵機(jī)碰撞
描述:當(dāng)子彈與敵機(jī)碰撞后,子彈消失,敵機(jī)消失,消滅敵機(jī)數(shù)增加
總體開(kāi)發(fā)思想
主要的數(shù)據(jù)結(jié)構(gòu)
集合:用集合來(lái)存儲(chǔ)子彈的對(duì)象,子彈的發(fā)射是從集合中調(diào)出對(duì)象,子彈的消失是從集合中刪除相應(yīng)的子彈對(duì)象
List<Fire> fires = new ArrayList<Fire>();
移動(dòng)與碰撞原理
子彈的移動(dòng):子彈圖片在窗口中顯示位置橫縱坐標(biāo)的改變
移動(dòng)方向:
直向上:子彈的橫坐標(biāo)不變,縱坐標(biāo)逐漸變大
左上方向:子彈的橫坐標(biāo)逐漸變小,縱坐標(biāo)逐漸變大
右上方向:子彈的橫坐標(biāo)逐漸變大,縱坐標(biāo)逐漸變大
子彈與敵機(jī)的碰撞:子彈的位置坐標(biāo)在敵機(jī)圖片的位置大小范圍內(nèi)
音樂(lè)播放原理
在音樂(lè)類(lèi)中,使用文檔輸入流來(lái)讀入音頻,再使用多線程實(shí)現(xiàn)游戲登陸和播放音樂(lè)、游戲運(yùn)行和播放音樂(lè)的同時(shí)進(jìn)行,在主類(lèi)中調(diào)用音樂(lè)播放的方法。
界面設(shè)計(jì)原理
運(yùn)行程序后,游戲運(yùn)行狀態(tài)為 false,此時(shí)調(diào)用畫(huà)板畫(huà)出背景圖,選中相應(yīng)的模式后,游戲運(yùn)行狀態(tài)為 ture,登錄界面切換為游戲運(yùn)行界面,游戲結(jié)束后,游戲運(yùn)行狀態(tài)為 false,重新顯示登錄界面。
選擇關(guān)卡模式:調(diào)用鼠標(biāo)監(jiān)聽(tīng)器,用鼠標(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ī)來(lái)實(shí)現(xiàn)的。
開(kāi)發(fā)語(yǔ)言:Java
功能實(shí)現(xiàn)
1.登錄與結(jié)束界面
在畫(huà)板類(lèi)中:
登陸界面的實(shí)現(xiàn):
// 當(dāng)游戲結(jié)束時(shí), if (gameover) { //畫(huà)游戲登陸時(shí)的界面 try { bg = App.getImg("/img/face.png"); } catch (IOException e) { printStackTrace();//捕獲拋出異常 } drawImage(bg, 0 , 0, 512, 728, null);//畫(huà)背景圖片 //選擇關(guān)卡模式(鼠標(biāo)點(diǎn)擊相應(yīng)的位置進(jìn)行操作) //畫(huà)筆為黑色 setColor(Color.black); //字體大小和類(lèi)型 setFont(new Font("楷體", Font.BOLD, 30)); //畫(huà)的內(nèi)容和位置 drawString("請(qǐng)選擇關(guān)卡模式:", 130, 450); drawString("(鼠標(biāo)點(diǎn)擊相應(yīng)的位置進(jìn)行操作)", 40, 480); //畫(huà)筆為藍(lán)色 setColor(Color.blue); //字體大小和類(lèi)型 setFont(new Font("楷體", Font.BOLD, 50)); //畫(huà)的內(nèi)容和位置 drawString("1、簡(jiǎn)單模式", 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.播放音樂(lè)
在音樂(lè)類(lèi)中:
讀取音樂(lè)文件的方法:
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è)播放音樂(lè)類(lèi)對(duì)象 player.play();//播放音樂(lè) } catch (FileNotFoundException | JavaLayerException e1) { printStackTrace();//拋出捕獲異常 } }
播放音樂(lè)的方法:
/* 播放音樂(lè)的線程 */ //游戲運(yùn)行音樂(lè) public void music1() { new Thread() { @Override public void run() { while (true) { System.out.println("播放音樂(lè)"); //如果游戲沒(méi)結(jié)束就播放 if (!GamePanel.gameover) { Music.play("D:\\java文件\\飛機(jī)大戰(zhàn).mp3"); } } } } .start(); } //登陸音樂(lè) public void music2() { new Thread() { @Override public void run() { Music.play("D:\\java文件\\mini.mp3"); } } .start(); }
在主類(lèi)中:
//創(chuàng)建音樂(lè)類(lèi)對(duì)象 Music music =new Music(); //播放登陸音樂(lè) music.music2(); //播放游戲運(yùn)行音樂(lè) music.music1();
3.子彈
創(chuàng)建
子彈類(lèi)中:
//hx、hy子彈的橫縱坐標(biāo),dir子彈的移動(dòng)方向,num子彈的類(lèi)型 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; }
在畫(huà)板類(lèi)中:
/* *創(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子彈的類(lèi)型 Fire fire3 = new Fire(hero.x + 40, hero.y, 1, num); // 將子彈加入到彈藥庫(kù)中 fires.add(fire3); //當(dāng)火力值為2,即一次發(fā)射兩顆子彈 } else if (power == 2) { // 創(chuàng)建子彈 Fire fire1 = new Fire(hero.x + 10, hero.y, 1, num); // 將子彈加入到彈藥庫(kù)中 fires.add(fire1); // 創(chuàng)建子彈 Fire fire2 = new Fire(hero.x + 80, hero.y, 1, num); // 將子彈加入到彈藥庫(kù)中 fires.add(fire2); //當(dāng)火力值為3,即一次發(fā)射三顆子彈 } else if (power == 3) { // 創(chuàng)建子彈 Fire fire1 = new Fire(hero.x, hero.y, 0, num); // 將子彈加入到彈藥庫(kù)中 fires.add(fire1); // 創(chuàng)建子彈 Fire fire2 = new Fire(hero.x + 50, hero.y - 20, 1, num); // 將子彈加入到彈藥庫(kù)中 fires.add(fire2); // 創(chuàng)建子彈 Fire fire3 = new Fire(hero.x + 100, hero.y, 2, num); // 將子彈加入到彈藥庫(kù)中 fires.add(fire3); //當(dāng)火力值為4,即一次發(fā)射三顆無(wú)敵子彈 } else if (power == 4) { // 創(chuàng)建子彈 Fire fire1 = new Fire(hero.x+15, hero.y, 0, num); // 將子彈加入到彈藥庫(kù)中 fires.add(fire1); // 創(chuàng)建子彈 Fire fire2 = new Fire(hero.x, hero.y - 20, 1, num); // 將子彈加入到彈藥庫(kù)中 fires.add(fire2); // 創(chuàng)建子彈 Fire fire3 = new Fire(hero.x + 70, hero.y, 2, num); // 將子彈加入到彈藥庫(kù)中 fires.add(fire3); //power置為1,無(wú)敵子彈創(chuàng)建完后,變成類(lèi)型3 power=1; num=3; } findex = 0;// 計(jì)數(shù)器歸零 } } -
發(fā)射
在畫(huà)板類(lèi)中:
// 在窗體上畫(huà)子彈 // 遍歷集合,畫(huà)出所有的敵機(jī) for (int i = 0; i < fires.size(); i++) { // 獲取每一個(gè)子彈 Fire fire = fires.get(i); //畫(huà)出子彈 drawImage(fire.img, fire.x, fire.y, fire.w, fire.h, null); }
移動(dòng)
子彈類(lèi)中:
/* * 子彈移動(dòng)的方法 */ 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í)
在畫(huà)板類(lèi)中: /* ? *判斷一顆子彈是否擊中了敵機(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ī)不會(huì)死亡,編號(hào)是15) if (e.type != 15) { // 1.讓敵機(jī)的血量減少 hp=e.hp-fire.fr; // 當(dāng)敵機(jī)的血量減少到零時(shí),死亡 if (e.hp <= 0) { // 判斷敵機(jī)是否是道具機(jī)(道具機(jī)編號(hào)為12,打死道具機(jī),子彈會(huì)升級(jí)) if (e.type == 12) { // 增加火力值,即一次發(fā)射的子彈數(shù) power++; // 如果power值大于3,增加英雄機(jī)血量,子彈類(lèi)型升級(jí) if (power > 3) { hero.hp++;//英雄機(jī)增加血量 if (hero.hp > 5) { hero.hp = 5; } //類(lèi)型1-》類(lèi)型2 if (num == 1) { num = 2; power=1; //類(lèi)型2-》類(lèi)型3 } else if (num == 2) { num = 3; power=1; //類(lèi)型3-》類(lèi)型4(創(chuàng)建完子彈類(lèi)型4后,創(chuàng)建方法后面num置為3,power置為1) } else if(num==3) { num=4; power=4; } } } // 2.敵機(jī)死亡(消失:從敵機(jī)大本營(yíng)中刪除) eps.remove(e); // 3.增加分?jǐn)?shù) score =e.type+ score; //4.消滅的敵機(jī)數(shù) Ep.number++; } // 4.子彈消失:如果不是類(lèi)型4(類(lèi)型4無(wú)敵的),就從子彈庫(kù)中刪除 if(num!=4) { fires.remove(fire); } } } } }
運(yùn)行測(cè)試
登陸界面
發(fā)射子彈
子彈類(lèi)型 1
子彈類(lèi)型 2
子彈類(lèi)型 3
子彈類(lèi)型 4
總結(jié)
到此這篇關(guān)于基于Java語(yǔ)言在窗體上實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲的文章就介紹到這了,更多相關(guān)Java在窗體實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java版飛機(jī)大戰(zhàn)實(shí)戰(zhàn)項(xiàng)目詳細(xì)步驟
- java實(shí)現(xiàn)飛機(jī)大戰(zhàn)案例詳解
- java實(shí)戰(zhàn)之飛機(jī)大戰(zhàn)小游戲(源碼加注釋)
- Java實(shí)現(xiàn)飛機(jī)大戰(zhàn)-連接數(shù)據(jù)庫(kù)并把得分寫(xiě)入數(shù)據(jù)庫(kù)
- java實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲
- 一天時(shí)間用Java寫(xiě)了個(gè)飛機(jī)大戰(zhàn)游戲,朋友直呼高手
- Java實(shí)現(xiàn)游戲飛機(jī)大戰(zhàn)-III的示例代碼
- Java實(shí)現(xiàn)經(jīng)典游戲飛機(jī)大戰(zhàn)-I的示例代碼
- Java實(shí)現(xiàn)飛機(jī)大戰(zhàn)-II游戲詳解
- java實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲
相關(guān)文章
在IDEA中創(chuàng)建SpringBoot項(xiàng)目的詳細(xì)步驟
這篇文章主要給大家介紹了在IDEA中創(chuàng)建SpringBoot項(xiàng)目的詳細(xì)步驟,文中有詳細(xì)的圖文介紹和代碼示例,對(duì)大家的學(xué)習(xí)和工作有一定的幫助,需要的朋友可以參考下2023-09-09Spring Cloud Sleuth整合zipkin過(guò)程解析
這篇文章主要介紹了Spring Cloud Sleuth整合zipkin過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12使用Java反射機(jī)制提高SpringBoot的代碼質(zhì)量和可維護(hù)性
保持好的代碼質(zhì)量和遵守編碼標(biāo)準(zhǔn)是開(kāi)發(fā)可維護(hù)和健壯軟件的重要方面,在本文中,我們將探討如何使用 Java 反射來(lái)提高 Spring Boot 應(yīng)用程序的代碼質(zhì)量和可維護(hù)性,需要的朋友可以參考下2023-10-10