999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于JAVA平臺的魔塔游戲設(shè)

2018-09-05 10:19:04許益凡薛益鴿
智能計算機與應(yīng)用 2018年3期
關(guān)鍵詞:界面游戲

許益凡 薛益鴿

計文章編號: 2095-2163(2018)03-0235-06中圖分類號: 文獻標志碼: A

摘要: 關(guān)鍵詞: (College of Information Engineering, Wenzhou Business College, Wenzhou Zhejiang 325035, China)

Abstract: With the rise of the gaming market, various programming languages are widely used,JAVA language is the most widely used and the highest using proportion. This article takes the extremely classic magic tower game as an example, with the help of the JAVA languages object-oriented characteristic using the programming techniques: package and inherited.

Key words:

作者簡介: 許益凡(1997-),男,本科生,主要研究方向:JAVA的桌面應(yīng)用、前端塔建; 薛益鴿(1990-),男,碩士,助教,主要研究方向:計算智能。

通訊作者: 收稿日期: 引言

游戲作為大眾生活必不可少的一項娛樂方式,近年來發(fā)展勢頭良好。開發(fā)游戲的語言有很多種,JAVA是當前最流行最熱門的一種編程語言, 因其是一種可以撰寫跨平臺應(yīng)用程序的面向?qū)ο蟮某绦蛟O(shè)計語言\[3\],并具有卓越的通用性、高效性和平臺移植性\[2\],同時,JAVA語言在游戲開發(fā)方面,又因為其語言嚴謹、可讀性強、高度的便利性等優(yōu)勢,在游戲開發(fā)中具有非常重要的地位\[3\]。

魔塔游戲是一款策略類的RPG(角色扮演)游戲。游戲雖不大卻充滿難度,往往一步小小的失誤就會讓游戲失敗,前功盡棄\[4\]。本文基于JAVA平臺對魔塔游戲進行設(shè)計和開發(fā)。整個游戲在Microsoft Windows 7 64位操作系統(tǒng)下,利用 IntelliJ IDEA 2017.2.4 x64開發(fā)工具進行開發(fā)。游戲的菜單欄、操作欄和商品購買使用鼠標進行操作;勇士移動使用方向鍵上、下、左、右操作;打開/關(guān)閉怪物手冊用快捷鍵A; 往上跳躍樓層用快捷鍵Z;往下跳躍樓層用快捷鍵X。

1需求分析及流程

1.1功能需求

通過對魔塔游戲的多次試玩和深入分析,可以發(fā)現(xiàn),該款游戲雖然像容易通關(guān)的地牢游戲,但每一小小的決定都影響著能否救出公主順利通關(guān)。如圖1所示,此游戲有著繁多的屬性和獨有的傷害計算公式,傷害所扣除的血量并不是簡單地直接攻擊減去防御,而是需要經(jīng)過傷害次數(shù)的參與計算。傷害次數(shù)是敵人的血量除去自身攻擊與敵方防御之差。最終損失的血量又是需要次數(shù)乘以敵人的攻擊與自身防御之差,若損失的血量超過擁有的血量則無法攻擊此怪物,此時,若不提升自身能力則會卡在這個怪物面前,導致游戲失敗。

本文設(shè)計的游戲主要涉及下列功能模塊:戰(zhàn)斗以及血量的計算模塊、查看怪物手冊模塊、商店交易模塊、游戲的存檔與讀取模塊、重新開始游戲模塊、退出游戲模塊、與NPC對話模塊、樓層跳轉(zhuǎn)和金手指系統(tǒng)模塊。功能結(jié)構(gòu)如圖2所示。

1.2游戲整體流程

游戲流程如下所述:游戲開始,勇士出現(xiàn)在魔塔的一層,沒有配備裝備,只被賦予了初始的屬性和3把不同顏色的鑰匙。勇士行動中遇到的事件如下:

(1)獲取物品??商嵘率康墓舴烙葘傩?,增加勇士的綜合實力,同時,有機會獲取到特殊物品,特殊物品具有的特殊功能對游戲進展有很大幫助。

(2)遭遇怪物。怪物種類繁多,屬性也不近相同,如“小怪物”、“士兵隊長”、“蝙蝠怪”、“骷髏怪”、“法師”、“衛(wèi)兵”等等。越高級的怪物屬性越高,所需勇士的實力也就越高。其中,魔王是整個游戲中最強大也是最困難的一個怪物類NPC,魔王強具有強大的屬性和華麗的外觀,鎮(zhèn)守著去往救助公主的通道,只有打敗魔王才可以救出公主完成游戲。

(3)遇到商店。玩家可根據(jù)自身的購買能力提升自身的屬性或等級,更好地進行游戲。

(4)NPC。在本文設(shè)計的游戲中,去除了一些購買鑰匙的NPC,將其整合在商店和金手指中。同時,保留了公主這個重要角色并添加了新的劇情:擊殺魔王后需解除公主手上的鎖鏈才能將她救走,則游戲成功,否則游戲失敗。流程如圖3所示。

2程序?qū)崿F(xiàn)

本款游戲具有以下3種特性:可靠性,即程序執(zhí)行時不會出現(xiàn)故障;可維護性,即在不破壞玩家數(shù)據(jù)的前提下進行維護修復程序BUG;擴展性,即在原有基礎(chǔ)上有更多的創(chuàng)新,使用戶不產(chǎn)生使用疲勞,開發(fā)新的功能模塊\[5\]。下面,詳細介紹游戲中各功能的實現(xiàn)。

2.1游戲界面的實現(xiàn)

游戲界面是游戲開發(fā)的點睛之筆。本文開發(fā)的游戲界面在原版的基礎(chǔ)上增加了金手指菜單。游戲界面由以下3個板塊構(gòu)成:游戲主界面,顯示游戲的內(nèi)容,大部分游戲的操作全在這里操作并顯示;游戲控制面板,顯示勇者的屬性及攜帶的鑰匙數(shù)量,并提供了保存、讀取、退出、重玩游戲的按鈕;游戲菜單欄,集合了所有可進行的操作,并添加了可玩性極高的金手指,給初玩者一個良好的體驗。圖4示出了游戲界面。

游戲主頁面中地圖復雜多樣、各個樓層的地圖都不相同,怪物NPC也是層出不窮,因此本文將圖片以數(shù)字形式儲存在一個二維數(shù)組里,需要時讀取該數(shù)組并“畫”在界面上,不同數(shù)字代表不同圖片,即代表不同的角色、不同的游戲環(huán)境。同時,也為勇士行動操作提供更好的判斷。第0層地圖的儲存圖的代碼如下:

map1 = new int\[\]\[\]{

{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},

{-1, 1, 3, 3, 3, 3, 1000, 3, 3, 3, 3, 1, -1},

.................. }

魔塔有很多層,每一層創(chuàng)建一個數(shù)組,同時,創(chuàng)建了一個專門用來儲存初始地圖的類MapPackage,以方便調(diào)用讀取顯示。以下是部分代碼(第0、1層):

public classSaveMap {

public Map map;

public int\[\]\[\] map1;

public SaveMap() {

map1 = new int\[\]\[\]{

{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},

{-1, 1, 3, 3, 3, 3, 1000, 3, 3, 3, 3, 1, -1},

....................... };

為了在界面上畫出地圖,本文首先把所有圖片和怪物分類存入數(shù)組,然后根據(jù)所在樓層找到相應(yīng)的二維數(shù)組,使用2個嵌套的for循環(huán)對其進行遍歷,將數(shù)字與實例化的圖片對象進行匹配,一個一個“畫”在界面上。部分代碼如下:

importjavax.swing.*;

public class Map {

public MapPackge mapPackge;

public Map() {

mapPackge = new MapPackge();

map = new int\[13\]\[13\];

wall = Toolkit.getDefaultToolkit().getImage("image/05.jpg");

////NPC

NPC01a = Toolkit.getDefaultToolkit().getImage("image/NPC01a.png");

Princess = Toolkit.getDefaultToolkit().getImage("image/Princess.png");

////怪物ID、屬性、圖片

monsters\[0\] = new Monster(49, "黃金B(yǎng)OSS", 1000, 500, 250, 22, 19, Toolkit.getDefaultToolkit().getImage("image/Yellow.png"));

.............

for (int i = 0; i < 13; i++) {

for (int j = 0; j < 13; j++) {

map\[i\]\[j\] = mapPackge.map1\[i\]\[j\];

} }}

public void DrawMap(Graphics g, JPanel i) {

for (int z = 1; z < 12; z++) {

for (int j = 1; j < 12; j++) {

if (map\[z\]\[j\] == 1) {

g.drawImage(wall, (j - 1) * 32, (z - 1) * 32, 32, 32, (ImageObserver) i);

}

...........

if (map\[z\]\[j\] >= 1000 && map\[z\]\[j\] < 2000) {

g.drawImage(road, (j - 1) * 32, (z - 1) * 32, 32, 32, (ImageObserver) i);

g.drawImage(up, (j - 1) * 32, (z - 1) * 32, 32, 32, (ImageObserver) i);

}......}} }}

2.2地圖改變的實現(xiàn)

隨著游戲的進行,地圖上的一些門被判定為已經(jīng)打開,一些怪物被判定為已經(jīng)被擊殺,因此,保存的原地圖包不能被讀取。為了原地圖進行區(qū)分,需創(chuàng)建一個新的類SaveMap用以儲存改變后的地圖包。由于SaveMap的結(jié)構(gòu)與MapPackage相同,這里就不對代碼進行詳細描述。

2.3勇士移動的實現(xiàn)

游戲的主要目的是讓勇士動起來去突破艱難險阻,擊殺怪物解救公主。由于勇士在行動中會遇到不同的事物,從而使得勇士在行動的每一步都要進行判斷。本文運用常見的動作監(jiān)聽事件,并將所有判斷的代碼打包在新的類KeyPress里。部分代碼如下:

public classKeyPress {

public void Keypress(MSprite mSprite, Map map, Fight fight, FloorJump floorJump, SaveMap saveMap, int a, int b) {

if (mSprite.m_posY >= 0 && mSprite.m_posY <= 320 && mSprite.m_posX >= 0 && mSprite.m_posX <= 320) {

if (map.map\[mSprite.m_posY / 32 + 1 + a\]\[mSprite.m_posX / 32 + 1 + b\] == 100 && mSprite.YKey > 0) {

map.map\[mSprite.m_posY / 32 + 1 + a\]\[mSprite.m_posX / 32 + 1 + b\] = 0;

mSprite.YKey--;

} } } }

上述代碼在主菜單MCanvas的動作監(jiān)聽中被調(diào)用,在按下不同按鍵的同時進行判斷操作。創(chuàng)建動作監(jiān)聽的部分代碼如下:

@Override

public void keyPressed(KeyEvent e) {

if (VK1 == "UP") {

VK1 = "";

shop.addHP.setVisible(false);

}

if (VK == "") {

if (e.getKeyCode() == KeyEvent.VK_DOWN) {

int a = 1;

int b = 0;

keyPress.Keypress(mSprite, map, fight, floorJump, saveMap, a, b);

} else if (e.getKeyCode() == KeyEvent.VK_UP) {

int a = -1;

int b = 0;

keyPress.Keypress(mSprite, map, fight, floorJump, saveMap, a, b);

if (map.map\[mSprite.m_posY / 32\]\[mSprite.m_posX / 32 + 1\] == 46) {

if (VK1 == "UP") {

VK1 = "";

shop.addHP.setVisible(false);

} else {

VK1 = "UP";

shop.addHP.setVisible(true);

}}

2.4戰(zhàn)斗過程的實現(xiàn)

勇士移動的路上布滿了怪物的防線,同時,前面提到的戰(zhàn)斗公式也需要用代碼實現(xiàn)。為此,創(chuàng)造一個動作類Fight用來進行戰(zhàn)斗部分的操作。首先,遇到怪物時調(diào)用該類并打包在KeyPress中。然后,從怪物類Monster中提取所遭遇怪物的屬性與勇士類MSprite的現(xiàn)有數(shù)據(jù)進行計算判斷,如果符合公式則扣除血量,如果不符合則無法進行操作,勇士無法繼續(xù)前進。部分代碼如下:

public voidFighting(MSprite sprite, int monID, Map map, int a, int b) {

for (int i = 0; i < 1; i++) {

if (monID <= 70 && monID >= 49) {

xmonster = map.monsters\[monID - 49\];

monster = new Monster(monID, null, xmonster.HP, xmonster.DF, xmonster.ATK, xmonster.coin, xmonster.Exp, null);

HP = sprite.HP;

MHP = monster.HP;

if (sprite.ATK > monster.DF) {

while (MHP > 0) {

if (sprite.DF < monster.ATK && MHP > 0) {

MHP -= (sprite.ATK - monster.DF);

HP -= (monster.ATK - sprite.DF);

} else if (sprite.DF >= monster.ATK && MHP > 0) {

MHP = 0;

} }}

if (sprite.ATK > monster.DF && HP > 0) {

while (monster.HP > 0) {

if (sprite.DF >= monster.ATK && sprite.ATK > monster.DF) {

monster.HP = 0;

map.map\[sprite.m_posY / 32 + 1 + a\]\[sprite.m_posX / 32 + 1 + b\] = 0;

sprite.coin += monster.coin;

}

if (sprite.DF < monster.ATK && monster.HP > 0) {

monster.HP -= (sprite.ATK - monster.DF);

sprite.HP -= (monster.ATK - sprite.DF);

}

if (monster.HP <= 0) {

map.map\[sprite.m_posY / 32 + 1 + a\]\[sprite.m_posX / 32 + 1 + b\] = 0;

sprite.coin += monster.coin;

sprite.exp += monster.Exp;

} }} } }2.5樓層跳轉(zhuǎn)的實現(xiàn)

跳轉(zhuǎn)樓層后每個樓層的出發(fā)點都不同,并且要確保跳轉(zhuǎn)的樓層已經(jīng)保存在SaveMap類中,否則會出現(xiàn)地圖重復或者不更新的問題。本文采用如下方法解決以上問題,將勇士放在要去的樓層的上一個樓層的樓梯上,根據(jù)KeyPress里打包的判斷,勇士會自動到下一層的出發(fā)點,這樣就能找到所要到達樓層的出發(fā)點。部分代碼如下:

public classFloorJump {

public void Jump(int i, Map map, SaveMap saveMap, MSprite mSprite) {

if (i >= 1000 && i < 2000) {

int z = i - 1000;

mSprite.floor = z + 1;

for (int j = 0; j < 13; j++) {

for (int h = 0; h < 13; h++) {

Group\[z\]\[j\]\[h\] = map.map\[j\]\[h\];

map.map\[j\]\[h\] = Group\[z + 1\]\[j\]\[h\];

}}

int x = 0, y = 0;

for (int j = 1; j < 13; j++) {

for (int h = 1; h < 13; h++) {

if (Group\[z + 1\]\[j\]\[h\] >= 2000 && Group\[z + 1\]\[j\]\[h\] < 3000) {

x = h;

y = j;

}} }

2.6游戲存取的實現(xiàn)

魔塔雖然是一個小游戲,但作為經(jīng)典的地牢闖關(guān)類游戲,想要闖過層層關(guān)卡,取得游戲成功也并非容易實現(xiàn),想要闖關(guān)成功需要花費大量時間,因此,游戲的存檔與讀取就顯得尤為重要。本文使用的存檔技術(shù)是JAVA比較常見的IO流技術(shù)。將游戲所有能讀取到且需要改變的屬性數(shù)值,通過IO流保存在一個外部文件中,并在需要時判斷是否存在,如果存在則讀取這些屬性,從而達到地圖和數(shù)據(jù)的保存功能。保存代碼和讀取代碼如下:

importjava.io.DataOutputStream;

import java.io.FileOutputStream;

public class Save {

private SaveMap saveMap = new SaveMap();

try {

DataOutputStream localDataOutPutStream = new DataOutputStream(new FileOutputStream("save" + a + ".dat"));

for (int i = 0; i < Group.length; i++) {

for (int j = 0; j < 13; j++) {

for (int k = 0; k < 13; k++) {

Group\[i\]\[j\]\[k\] = mCanvas.map.map\[j\]\[k\];

localDataOutPutStream.writeInt(Group\[i\]\[j\]\[k\]);

} } }

} catch (Exception e) {

e.printStackTrace();

} } }

importjavax.swing.*;

public class Read {

try {

DataInputStream localDataInputStream = new DataInputStream(new FileInputStream("save" + a + ".dat"));

for (int i = 0; i < Group.length; i++) {

for (int j = 0; j < 13; j++) {

for (int k = 0; k < 13; k++) {

Group\[i\]\[j\]\[k\] = localDataInputStream.readInt();

mCanvas.map.map\[j\]\[k\] = Group\[i\]\[j\]\[k\];

} } }

mSprite.m_posX = localDataInputStream.readInt();

localDataInputStream.close();

} catch (Exception e) {

e.printStackTrace();

JOptionPane.showMessageDialog(null, "讀取失敗!此存檔為空或損壞!", "讀取失敗", JOptionPane.WARNING_MESSAGE);

} } }

3結(jié)束語

魔塔是一個十分經(jīng)典的RPG(角色扮演)游戲,(下轉(zhuǎn)封三)本文在實現(xiàn)原魔塔游戲功能的基礎(chǔ)上創(chuàng)建了新的功能。經(jīng)過測試,該游戲能夠運行流暢,體驗良好。通過設(shè)計該款游戲,體驗到了JAVA在制作游戲方面的便捷性。

參考文獻

[1] 孫衛(wèi)琴. Java面向?qū)ο缶幊蘙M]. 電子工業(yè)出版社, 2006.

[2] 牛芳. 異構(gòu)存儲系統(tǒng)中的節(jié)點失效并行化修復研究[D]. 中國科學技術(shù)大學, 2014.

[3] 楊豐盛. Android應(yīng)用開發(fā)揭秘[M]. 機械工業(yè)出版社, 2010.

[4] 龐萍.基于java的魔塔游戲的設(shè)計與實現(xiàn)[J]. 電腦知識與技術(shù),2016,12(34):246-247.

[5] Julian Gold. 面向?qū)ο蟮挠螒蜷_發(fā)[M]. 電子工業(yè)出版社, 2005.

猜你喜歡
界面游戲
國企黨委前置研究的“四個界面”
當代陜西(2020年13期)2020-08-24 08:22:02
基于FANUC PICTURE的虛擬軸坐標顯示界面開發(fā)方法研究
空間界面
金秋(2017年4期)2017-06-07 08:22:16
游戲
電子顯微打開材料界面世界之門
人機交互界面發(fā)展趨勢研究
數(shù)獨游戲
瘋狂的游戲
飛碟探索(2016年11期)2016-11-14 19:34:47
爆笑游戲
第八章直接逃出游戲
小學科學(2015年7期)2015-07-29 22:29:00
主站蜘蛛池模板: 国产精品一区二区不卡的视频| 精品福利网| 亚洲天堂网2014| 熟妇丰满人妻| 国产精品欧美激情| 国产欧美精品一区二区| 日a本亚洲中文在线观看| 伊人福利视频| 国产视频欧美| 免费高清a毛片| 中文字幕色站| 又大又硬又爽免费视频| 日韩在线永久免费播放| 欧美a在线| 亚洲男人的天堂久久香蕉| 91成人在线观看视频| 国产成人精品综合| 极品国产在线| 婷婷综合色| 亚洲五月激情网| 亚洲av日韩av制服丝袜| 综合色区亚洲熟妇在线| 亚洲日韩在线满18点击进入| www.av男人.com| 亚洲欧美精品在线| 亚洲愉拍一区二区精品| 国内精自视频品线一二区| 黄色网页在线播放| 亚洲天堂久久| 亚洲三级色| 欧美国产成人在线| 亚洲天堂久久久| 精品无码日韩国产不卡av | 99视频国产精品| 在线精品亚洲国产| 午夜天堂视频| 日本欧美成人免费| 日韩精品成人在线| 欧美色丁香| 99无码中文字幕视频| 国产美女无遮挡免费视频| 国产欧美日韩一区二区视频在线| 精品亚洲欧美中文字幕在线看| 国产91九色在线播放| 亚洲天堂成人| 成人看片欧美一区二区| 亚洲乱码在线视频| 国产菊爆视频在线观看| 婷婷色一区二区三区| 久久精品视频一| 久久精品国产精品国产一区| 国产亚洲现在一区二区中文| 久无码久无码av无码| 亚洲欧美精品一中文字幕| 人人看人人鲁狠狠高清| 91av成人日本不卡三区| 91精品福利自产拍在线观看| 国产簧片免费在线播放| 99视频精品全国免费品| 国产欧美自拍视频| 露脸真实国语乱在线观看| 国产女同自拍视频| 色婷婷狠狠干| 成人日韩视频| 十八禁美女裸体网站| 久久亚洲日本不卡一区二区| 色婷婷在线播放| 国产超碰一区二区三区| 久久亚洲黄色视频| 青青草国产一区二区三区| 大陆精大陆国产国语精品1024| 九色视频在线免费观看| 国产精品福利尤物youwu| 欧美午夜在线视频| 久久国产黑丝袜视频| 中文字幕欧美日韩| 四虎综合网| 91精品亚洲| 在线播放91| 久久精品电影| 亚洲午夜片| 国产亚洲精品91|