基于Java語言在窗體上實現(xiàn)飛機大戰(zhàn)小游戲的完整步驟
小組項目
飛機大戰(zhàn):用 Java 語言在窗體上實現(xiàn)飛機大戰(zhàn)小游戲,運行程序后,出現(xiàn)一個窗體,在窗體上用鼠標控制英雄機的移動,通過子彈打擊敵機進行分數(shù)的計算,以及英雄機血量的計算等。
主要模塊:登陸界面、音樂、子彈、敵機、英雄機、背景圖、結(jié)束界面、BOSS 機、分數(shù)計算、血量計算。
負責模塊:登陸界面、音樂、子彈、結(jié)束界面。
模塊需求描述
登陸界面:運行程序后,彈出窗體,在窗體上顯示關(guān)卡模式的選擇,點擊其中的模式后,開始游戲。
結(jié)束界面:重新選擇關(guān)卡模式,即可開始游戲
音樂:登陸音樂,開始游戲音樂。
- 子彈的創(chuàng)建
- 子彈的發(fā)射
- 子彈的移動
- 一直向上:中間的子彈
- 左上方向:左邊的子彈
- 右上方向:右邊的子彈
4.子彈與敵機碰撞
5.子彈的類型升級
描述:當子彈打到道具機時,子彈一次發(fā)射的個數(shù)增加一個,最大為 3 個,當發(fā)射的個數(shù)為 3 時,子彈再打到道具機,子彈的類型就升一級,發(fā)射的個數(shù)置為 1,繼續(xù)重新計算。第四種子彈只發(fā)射 3 個,發(fā)射后,子彈類型置為第三種子彈,第四種子彈無敵的,打到敵機不會消失。若期間英雄機被敵機碰到,子彈的類型置為 1,發(fā)射的個數(shù)置為 1。
類型:
- 第一種子彈:傷害值:1
- 第二種子彈:傷害值:2
- 第三種子彈:傷害值:3
- 第四種子彈:傷害值:100
6.子彈的一次發(fā)射個數(shù)的升級
描述:在子彈的類型升級中有涉及
類型:
- 一次發(fā)射一個子彈
- 一次發(fā)射兩個子彈
- 一次發(fā)射三個子彈
7.子彈與敵機碰撞
描述:當子彈與敵機碰撞后,子彈消失,敵機消失,消滅敵機數(shù)增加
總體開發(fā)思想
主要的數(shù)據(jù)結(jié)構(gòu)
集合:用集合來存儲子彈的對象,子彈的發(fā)射是從集合中調(diào)出對象,子彈的消失是從集合中刪除相應(yīng)的子彈對象
List<Fire> fires = new ArrayList<Fire>();
移動與碰撞原理
子彈的移動:子彈圖片在窗口中顯示位置橫縱坐標的改變
移動方向:
直向上:子彈的橫坐標不變,縱坐標逐漸變大
左上方向:子彈的橫坐標逐漸變小,縱坐標逐漸變大
右上方向:子彈的橫坐標逐漸變大,縱坐標逐漸變大
子彈與敵機的碰撞:子彈的位置坐標在敵機圖片的位置大小范圍內(nèi)
音樂播放原理
在音樂類中,使用文檔輸入流來讀入音頻,再使用多線程實現(xiàn)游戲登陸和播放音樂、游戲運行和播放音樂的同時進行,在主類中調(diào)用音樂播放的方法。
界面設(shè)計原理
運行程序后,游戲運行狀態(tài)為 false,此時調(diào)用畫板畫出背景圖,選中相應(yīng)的模式后,游戲運行狀態(tài)為 ture,登錄界面切換為游戲運行界面,游戲結(jié)束后,游戲運行狀態(tài)為 false,重新顯示登錄界面。
選擇關(guān)卡模式:調(diào)用鼠標監(jiān)聽器,用鼠標點擊相應(yīng)的模式字體區(qū)域,獲取到鼠標點擊的相應(yīng)坐標后,在相應(yīng)的坐標區(qū)域中選著相應(yīng)的關(guān)卡模式,關(guān)卡模式是根據(jù)每循環(huán)多少次創(chuàng)建一個敵機來實現(xiàn)的。

開發(fā)語言:Java
功能實現(xiàn)
1.登錄與結(jié)束界面
在畫板類中:
登陸界面的實現(xiàn):
// 當游戲結(jié)束時,
if (gameover) {
//畫游戲登陸時的界面
try {
bg = App.getImg("/img/face.png");
} catch (IOException e) {
printStackTrace();//捕獲拋出異常
}
drawImage(bg, 0 , 0, 512, 728, null);//畫背景圖片
//選擇關(guān)卡模式(鼠標點擊相應(yīng)的位置進行操作)
//畫筆為黑色
setColor(Color.black);
//字體大小和類型
setFont(new Font("楷體", Font.BOLD, 30));
//畫的內(nèi)容和位置
drawString("請選擇關(guān)卡模式:", 130, 450);
drawString("(鼠標點擊相應(yīng)的位置進行操作)", 40, 480);
//畫筆為藍色
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)卡模式:
//當游戲結(jié)束時,讀取鼠標的點擊位置
if(gameover&&ms==0) {
int x=e.getX();//獲取鼠標的橫坐標
int y=e.getY();//獲取鼠標的縱坐標
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)建一個播放音樂類對象
player.play();//播放音樂
} catch (FileNotFoundException | JavaLayerException e1) {
printStackTrace();//拋出捕獲異常
}
}
播放音樂的方法:
/*
播放音樂的線程
*/
//游戲運行音樂
public void music1() {
new Thread() {
@Override
public void run() {
while (true) {
System.out.println("播放音樂");
//如果游戲沒結(jié)束就播放
if (!GamePanel.gameover) {
Music.play("D:\\java文件\\飛機大戰(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(); //播放游戲運行音樂 music.music1();
3.子彈
創(chuàng)建
子彈類中:
//hx、hy子彈的橫縱坐標,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;
//確定子彈的位置(初始位置在英雄機上)
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) {//當火力值為1,即一次發(fā)射一顆子彈
// 創(chuàng)建子彈,num子彈的類型
Fire fire3 = new Fire(hero.x + 40, hero.y, 1, num);
// 將子彈加入到彈藥庫中
fires.add(fire3);
//當火力值為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);
//當火力值為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);
//當火力值為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;// 計數(shù)器歸零
}
}
-發(fā)射
在畫板類中:
// 在窗體上畫子彈
// 遍歷集合,畫出所有的敵機
for (int i = 0; i < fires.size(); i++) {
// 獲取每一個子彈
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;
}
}
碰撞敵機與升級
在畫板類中:
/*
? *判斷一顆子彈是否擊中了敵機
*/
private void bang(Fire fire) {
// 遍歷所有的敵機
for (int i = 0; i < eps.size(); i++) {
// 獲取每一個敵機
Ep e = eps.get(i);
// 判斷該子彈是否擊中敵機
if (e.shootBy(fire)) {
// 如果敵機被子彈擊中
// 如果不是導彈機(導彈機不會死亡,編號是15)
if (e.type != 15) {
// 1.讓敵機的血量減少
hp=e.hp-fire.fr;
// 當敵機的血量減少到零時,死亡
if (e.hp <= 0) {
// 判斷敵機是否是道具機(道具機編號為12,打死道具機,子彈會升級)
if (e.type == 12) {
// 增加火力值,即一次發(fā)射的子彈數(shù)
power++;
// 如果power值大于3,增加英雄機血量,子彈類型升級
if (power > 3) {
hero.hp++;//英雄機增加血量
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.敵機死亡(消失:從敵機大本營中刪除)
eps.remove(e);
// 3.增加分數(shù)
score =e.type+ score;
//4.消滅的敵機數(shù)
Ep.number++;
}
// 4.子彈消失:如果不是類型4(類型4無敵的),就從子彈庫中刪除
if(num!=4) {
fires.remove(fire);
}
}
}
}
}
運行測試
登陸界面

發(fā)射子彈

子彈類型 1

子彈類型 2

子彈類型 3

子彈類型 4
總結(jié)
到此這篇關(guān)于基于Java語言在窗體上實現(xiàn)飛機大戰(zhàn)小游戲的文章就介紹到這了,更多相關(guān)Java在窗體實現(xiàn)飛機大戰(zhàn)小游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java版飛機大戰(zhàn)實戰(zhàn)項目詳細步驟
- java實現(xiàn)飛機大戰(zhàn)案例詳解
- java實戰(zhàn)之飛機大戰(zhàn)小游戲(源碼加注釋)
- Java實現(xiàn)飛機大戰(zhàn)-連接數(shù)據(jù)庫并把得分寫入數(shù)據(jù)庫
- java實現(xiàn)飛機大戰(zhàn)游戲
- 一天時間用Java寫了個飛機大戰(zhàn)游戲,朋友直呼高手
- Java實現(xiàn)游戲飛機大戰(zhàn)-III的示例代碼
- Java實現(xiàn)經(jīng)典游戲飛機大戰(zhàn)-I的示例代碼
- Java實現(xiàn)飛機大戰(zhàn)-II游戲詳解
- java實現(xiàn)飛機大戰(zhàn)小游戲
相關(guān)文章
Java 和 Javascript 的 Date 與 .Net 的 DateTime 之間的相互轉(zhuǎn)換
這篇文章主要介紹了Java 和 Javascript 的 Date 與 .Net 的 DateTime 之間的相互轉(zhuǎn)換的相關(guān)資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-06-06
Springboot內(nèi)置的工具類之CollectionUtils示例講解
這篇文章主要介紹了Springboot內(nèi)置的工具類之CollectionUtils,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12
IntelliJ IDEA基于Maven構(gòu)建Java項目
在 Java 開發(fā)中,使用 Maven 是一種廣泛采用的構(gòu)建工具,本文主要介紹了IntelliJ IDEA基于Maven構(gòu)建Java項目,具有一定的參考價值,感興趣的可以了解一下2024-03-03
springboot 實現(xiàn)記錄業(yè)務(wù)日志和異常業(yè)務(wù)日志的操作
這篇文章主要介紹了springboot 實現(xiàn)記錄業(yè)務(wù)日志和異常業(yè)務(wù)日志的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07

