劉子澍++王語(yǔ)杰++楊永輝++邱呂揚(yáng)++楊金馨
【摘 要】本款游戲?qū)儆谝嬷穷?lèi)游戲,玩家需要在一共20層的地圖中進(jìn)行冒險(xiǎn)。玩家在每層都會(huì)遇到強(qiáng)度各異的怪物和用于強(qiáng)化玩家屬性的道具、商店。游戲中,玩家需要謹(jǐn)慎考慮對(duì)戰(zhàn)的怪物和屬性加點(diǎn)路線,稍有錯(cuò)誤玩家可能要付出較大的代價(jià)繼續(xù)游戲甚至卡關(guān)。本游戲流程條理清晰,界面制作獨(dú)具一格,可以滿(mǎn)足絕大多數(shù)喜愛(ài)該類(lèi)型游戲的玩家的需求。
【關(guān)鍵詞】魔塔 策略 安卓
1 背景
隨著智能移動(dòng)終端的普及,作為移動(dòng)應(yīng)用重要分支的手游產(chǎn)業(yè)全面進(jìn)入井噴期。中國(guó)已經(jīng)成為亞洲乃至全球移動(dòng)游戲市場(chǎng)規(guī)模最大、增速最快的市場(chǎng)。在這樣的市場(chǎng)環(huán)境下我們的游戲有這很好的發(fā)展前景[1]。
《魔塔》作為一款受到廣大玩家喜愛(ài)的flash小游戲,至今仍有大量同人作品出現(xiàn)。然而,絕大多數(shù)作品都是在電腦上用flash運(yùn)行的,手機(jī)平臺(tái)上的作品并不多見(jiàn)。為了滿(mǎn)足玩家能夠利用碎片化的時(shí)間進(jìn)行游戲,同時(shí)不必使用相對(duì)笨重的臺(tái)式機(jī)或筆記本,我們開(kāi)發(fā)了這款魔塔風(fēng)格的游戲。
2 實(shí)現(xiàn)方法
2.1 總體設(shè)計(jì)思路
魔塔作為一個(gè)策略性極其優(yōu)秀的游戲,如今被人所遺忘讓我們覺(jué)得十分惋惜,于是我們決定以此為藍(lán)本,制作一款風(fēng)格接近魔塔的游戲,并功能和玩法以及劇情上進(jìn)行自己的創(chuàng)新,去引更多的用戶(hù)參與到這類(lèi)游戲中來(lái)。
2.2 處理流程
游戲流程如下圖1所示,后面的解說(shuō)按圖中的內(nèi)容進(jìn)行。
開(kāi)始:進(jìn)入游戲開(kāi)始界面,點(diǎn)擊開(kāi)始游戲播放游戲背景故事,播放完畢或者手動(dòng)跳過(guò)之后進(jìn)入下一環(huán)節(jié)。
玩家、地圖初始化:進(jìn)入游戲主程序,初始化玩家屬性值、道具數(shù)量、金錢(qián)數(shù),設(shè)定地圖信息為第一層地圖。顯示游戲界面,游戲開(kāi)始。
游戲循環(huán):玩家進(jìn)行游戲的部分,游戲只有當(dāng)玩家救出公主后才算結(jié)束。程序會(huì)判斷玩家移動(dòng)方向上下一格的地圖信息。當(dāng)玩家遭遇敵人時(shí),系統(tǒng)會(huì)計(jì)算玩家受到的傷害,如果高于玩家現(xiàn)有生命值,怪物將留在原地,玩家不會(huì)死亡,但無(wú)法通過(guò)怪物所占的格子;反之,怪物會(huì)從地圖上消失,玩家可以通過(guò)剛才怪物所占的格子,玩家的生命值會(huì)減少同時(shí)獲得金錢(qián)獎(jiǎng)勵(lì)。當(dāng)玩家遇到道具(包括商店)或門(mén)時(shí),玩家會(huì)與之互動(dòng)購(gòu)買(mǎi)或者拾取道具,打開(kāi)門(mén)。
2.3 開(kāi)發(fā)環(huán)境
由于我們的程序以Android開(kāi)發(fā)為主,所以經(jīng)過(guò)討論我們決定在使用比較廣泛的Windows系統(tǒng)下配置Android開(kāi)發(fā)環(huán)境,其中使用了JDK(Java SE Development Kit)、Android SDK(Android Software Development Kit)和IntelliJ IDEA集成開(kāi)發(fā)環(huán)境,編程語(yǔ)言為JAVA[2]。同時(shí),為簡(jiǎn)化游戲數(shù)據(jù)平衡計(jì)算和使游戲數(shù)據(jù)更為科學(xué),我們使用Microsoft Visual Studio 2015集成開(kāi)發(fā)環(huán)境開(kāi)發(fā)了一個(gè)C++程序[3]。
2.4 程序結(jié)構(gòu)
我們的程序主要由一系列類(lèi)、布局文件和資源文件構(gòu)成。其中類(lèi)又分為游戲邏輯類(lèi)、人物類(lèi)、背景音樂(lè)類(lèi)、自定義控件類(lèi)等等,其中,每一個(gè)類(lèi)Activity類(lèi)都有與之對(duì)應(yīng)的布局文件[4]。如圖2所示。
首先,MenuActivity作為游戲入口進(jìn)入游戲。在現(xiàn)狀版本中,這個(gè)類(lèi)雖然只實(shí)現(xiàn)了簡(jiǎn)單的開(kāi)始游戲Button和第二段背景音樂(lè)的播放與停止,但是這個(gè)類(lèi)又是不可或缺的,因?yàn)樵诮酉聛?lái)的開(kāi)發(fā)中我們還會(huì)增加登錄注冊(cè)、游戲設(shè)置等功能,需要在這個(gè)類(lèi)中實(shí)現(xiàn)跳轉(zhuǎn)。
其次,CartoonActivity進(jìn)行劇情文字逐字播放,通過(guò)一個(gè)定時(shí)器不斷調(diào)用TextView的setText達(dá)到逐字顯示的效果[5],并且在文字顯示完全后自動(dòng)跳轉(zhuǎn)至下一個(gè)界面,玩家也可以點(diǎn)擊skip按鈕跳過(guò)劇情介紹。
再者,GameActivity實(shí)現(xiàn)游戲的主要邏輯,(從人物怪物地圖的初始化,到游戲控制,的大概思路)在這個(gè)Activity中初始化了全部道具和敵人的屬性,以及商店和NPC的觸發(fā)事件,調(diào)用了mapview和player類(lèi)來(lái)初始化地圖和角色,定義了角色上下左右的各個(gè)事件來(lái)實(shí)現(xiàn)人物控制邏輯,初始化了搖桿,在子線程run中監(jiān)聽(tīng)了搖桿的動(dòng)作,以此判斷人物執(zhí)行的動(dòng)作,戰(zhàn)斗部分則是調(diào)用了combat類(lèi)來(lái)進(jìn)行計(jì)算。
最后,以EndActivity作為游戲的結(jié)束,EndActivity基本與CartoonActivity相同,主要區(qū)別在文字顯示上。
3 關(guān)鍵技術(shù)
3.1 文字逐字顯示
為了實(shí)現(xiàn)文字逐字顯示的效果,通過(guò)一個(gè)定時(shí)器不斷調(diào)用TextView的setText,每次setText將會(huì)多一個(gè)文字,一次來(lái)達(dá)到逐字顯示的效果,并且在背景介紹部分用計(jì)時(shí)器實(shí)現(xiàn)了文字顯示完全之后自動(dòng)跳轉(zhuǎn)至游戲地圖的功能。
3.2 搖桿
為增加游戲體驗(yàn),使玩家操作更多元化,所以我們將一開(kāi)始使用的按鈕式操作升級(jí)為現(xiàn)在較為流行的搖桿操作。為此,我們引入了自定義的XML屬性,通過(guò)繼承View類(lèi),自定義了測(cè)量和繪制兩個(gè)部分,除此之外我們還需要重寫(xiě)onTouchEvent()方法進(jìn)行View事件處理,最后,在主線中開(kāi)啟一個(gè)子線程對(duì)自定義的搖桿類(lèi)進(jìn)行監(jiān)聽(tīng),從而實(shí)現(xiàn)對(duì)史萊姆的控制。
3.3 數(shù)據(jù)平衡
數(shù)據(jù)設(shè)計(jì)具體方案:
無(wú)疑,直接設(shè)置一些倍數(shù)或者具體數(shù)值都十分困難——因?yàn)槿鄙僖粋€(gè)標(biāo)準(zhǔn)來(lái)衡量這些數(shù)值是否合適。所以考慮引入一個(gè)怪物強(qiáng)度(G)當(dāng)做一個(gè)衡量標(biāo)準(zhǔn),即在怪物的攻擊力(A)、防御力(D)、生命值(H)與怪物強(qiáng)度之間建立一種函數(shù)關(guān)系:G=f(A,D,H)。
然而怪物的三個(gè)屬性不能直接用來(lái)計(jì)算怪物的強(qiáng)度:一個(gè)怪物可能有非常高的血量,但無(wú)法對(duì)玩家造成任何傷害,這個(gè)怪物不能算強(qiáng);同樣有的怪物的血量并不高,但由于其具有較高的攻擊力和防御力,足以對(duì)玩家造成巨大的威脅。這么看來(lái),攻擊力、防御力、生命值在對(duì)怪物強(qiáng)度的定義中應(yīng)占有不同的權(quán)重,而且生命值所占權(quán)重要相對(duì)偏低。出于這方面的考慮,重新定義怪物強(qiáng)度的表達(dá)式:G=g(f(A,D,H)),其中f(A,D,H)=0.7A+0.6D+0.3H。這個(gè)公式只是一個(gè)嘗試,并沒(méi)能找到數(shù)學(xué)方法證明該公式是最佳的。
在確定了f(A,D,H)后,就需要確定g。由于數(shù)學(xué)知識(shí)有限,g便在初等函數(shù)的范圍內(nèi)尋找。首先確定怪物強(qiáng)度一定是一個(gè)單調(diào)不減的函數(shù),但是怪物強(qiáng)度不應(yīng)增長(zhǎng)過(guò)快,以免強(qiáng)度相差不多而屬性值卻天差地別的情況出現(xiàn);同時(shí)也不應(yīng)該增長(zhǎng)過(guò)緩,導(dǎo)致屬性值已經(jīng)差距很多而強(qiáng)度值卻十分接近,這樣強(qiáng)度值就失去了衡量的意義。在幾類(lèi)基本初等函數(shù)中,對(duì)數(shù)函數(shù)可能出現(xiàn)負(fù)值,指數(shù)函數(shù)增長(zhǎng)速度過(guò)快,三角函數(shù)又呈現(xiàn)出周期性,都不太適合作為g。剩下的冪函數(shù)中,冪指數(shù)大于1時(shí)增長(zhǎng)速度過(guò)快,所以選擇冪指數(shù)小于1的冪函數(shù)作為g。看過(guò)一些函數(shù)圖像之后,選擇y=x^(2/3)這個(gè)函數(shù),增長(zhǎng)速度合適。根據(jù)這些函數(shù),怪物強(qiáng)度的表達(dá)式最后被定義為:G=[(0.7A+0.6D+0.3H)]^(2/3)。這樣就可以根據(jù)給定的怪物強(qiáng)度計(jì)算出怪物的攻擊力、防御力、生命值。
接下來(lái)的問(wèn)題就是如何解出這個(gè)三元一次方程。先將方程變形:
(1)不難看出等式的左邊是一個(gè)常數(shù)。但由于方程只有一個(gè),也就是說(shuō)接下來(lái)的工作是解出這個(gè)不定方程。
容易看出該方程有無(wú)窮多個(gè)解,但必須求出某個(gè)特定的解,所以根據(jù)線性代數(shù)的相關(guān)知識(shí),把上面的方程寫(xiě)成兩個(gè)矩陣相乘的形式。
(2)其中,由于矩陣[0.7 0.6 0.3]的逆矩陣不存在或者沒(méi)意義,無(wú)法通過(guò)線性代數(shù)中求逆矩陣的方法對(duì)該方程進(jìn)行求解,所以通過(guò)求廣義逆矩陣的方法求解該方程。
將上述方程寫(xiě)成Ax=b的形式,其中A=[0.7 0.6 0.3],x=[A D H]T,b=[a]那么方程的通解可以表示為(I為三維單位矩陣,y為任意三維列向量)。
(3)由于矩陣A是行滿(mǎn)秩矩陣,A的廣義逆矩陣A^-就可以通過(guò)下式求得。
(4)最后只要給定一個(gè)向量y就可以得出矩陣x,即所求的A、D、H倍數(shù)。
只要確定了攻擊力、防御力、生命值各自的初始值,就可以乘上計(jì)算好的倍數(shù)得出具體的數(shù)值。
4 現(xiàn)版本中的問(wèn)題
由于游戲測(cè)試人員不夠多,數(shù)據(jù)平衡性上可能還需要進(jìn)行微調(diào),目前來(lái)看難度偏高。
遙感靈敏性和范圍判定不太完善,在玩家操作過(guò)快時(shí)可能出現(xiàn)重復(fù)操作。
5 結(jié)語(yǔ)
本文首先介紹了在智能終端普及且安卓操作系統(tǒng)為主流系統(tǒng)的大背景下,手游產(chǎn)業(yè)全面進(jìn)入井噴期。而魔塔類(lèi)游戲在該平臺(tái)上數(shù)量極少,但是卻擁有廣大的玩家基數(shù)以及良好的策略性,受到廣大90后玩家的喜愛(ài)。本游戲是基于安卓平臺(tái)開(kāi)發(fā)的軟件,能夠滿(mǎn)足玩家隨時(shí)隨地進(jìn)行該類(lèi)型游戲的需求。本游戲流程條例清晰,界面制作獨(dú)具一格,可以滿(mǎn)足絕大多數(shù)喜愛(ài)該類(lèi)型游戲的玩家的需求。
參考文獻(xiàn):
[1]吳亞峰,蘇亞光,于復(fù)興.Android應(yīng)用案例開(kāi)發(fā)大全第3版[M].人民郵電出版社,2015:45-50.
[2]任玉剛.Android開(kāi)發(fā)藝術(shù)探索 第1版[M].電子工業(yè)出版社,2015:32-40.
[3][美]James S Cho著;李強(qiáng).譯. Android游戲開(kāi)發(fā)詳解 第1版[M].人民郵電出版社,2015:60-70.
[4][美]策希納(Mario Zechner),[美]格林(Robert Green) 著;趙凱,佘建偉.譯. Android 4游戲入門(mén)經(jīng)典 第3版[M].清華大學(xué)出版社 ,2013:60-80.