汪 季,熊 輝,虞飛揚(yáng),葉蒼竹,官守軍
(1湖北理工學(xué)院 數(shù)理學(xué)院,湖北 黃石 435003;2黃石晨信光電股份有限公司,湖北 大冶 435100;3中軟國(guó)際有限公司,北京 100044)
基于面向?qū)ο蟮陌沧坑螒颉?048”設(shè)計(jì)與實(shí)現(xiàn)
汪 季1,3,熊 輝1,2*,虞飛揚(yáng)1,葉蒼竹2,官守軍2
(1湖北理工學(xué)院 數(shù)理學(xué)院,湖北 黃石 435003;2黃石晨信光電股份有限公司,湖北 大冶 435100;3中軟國(guó)際有限公司,北京 100044)
安卓(Android)益智類小游戲因具有較強(qiáng)的趣味性以及低廉的開發(fā)成本備受廣大玩家和游戲開發(fā)商的青睞。“2048”是一款典型的卡片類游戲,游戲采用Java語(yǔ)言開發(fā),利用各種界面布局的正確嵌套使用,提高用戶體驗(yàn)的直觀感受。同時(shí),在設(shè)計(jì)中注重玩家觸發(fā)各種事件的后臺(tái)處理,自動(dòng)調(diào)整系統(tǒng)對(duì)應(yīng)邏輯關(guān)系,實(shí)現(xiàn)游戲主要功能。該游戲以面向?qū)ο蟮莫?dú)特方式進(jìn)行具體設(shè)計(jì),實(shí)現(xiàn)了基于Android的游戲開發(fā)。
面向?qū)ο螅话沧肯到y(tǒng);游戲開發(fā)
安卓(Android)系統(tǒng)基于Linux系統(tǒng),內(nèi)核和驅(qū)動(dòng)使用C/C++語(yǔ)言開發(fā),設(shè)計(jì)了一個(gè)Dalvik JVM作為中間層,然后在SDK層面選擇Java作為開發(fā)語(yǔ)言[1-5],因此,開發(fā)一款安卓游戲的應(yīng)用程序需要較復(fù)雜的開發(fā)流程。安卓益智類小游戲是日常生活中最耐玩的一種游戲,深受玩家喜愛,男女老少皆宜[6-8]。與此同時(shí),益智類小游戲相對(duì)于一些大型的手機(jī)網(wǎng)絡(luò)游戲以及大型的手機(jī)單機(jī)游戲而言,具有便捷性、易開發(fā)性以及較高的創(chuàng)新性。
本文介紹一種新型安卓手機(jī)游戲的開發(fā)。益智類游戲“2048”開發(fā)過程中有幾個(gè)重難點(diǎn):①各種界面布局的正確嵌套使用,這關(guān)乎用戶體驗(yàn)最直觀感受;②游戲中玩家執(zhí)行各種事件后,系統(tǒng)需要做出的對(duì)應(yīng)邏輯設(shè)計(jì);③游戲主要邏輯的實(shí)現(xiàn)。
游戲開始時(shí),棋盤內(nèi)部Gridlayout布局中隨機(jī)出現(xiàn)2個(gè)數(shù)字,出現(xiàn)的數(shù)字僅可能為“4”和“2”中的一個(gè),且“4”和“2”出現(xiàn)的概率分別為0.8和0.2。游戲玩家可以選擇上、下、左、右4個(gè)方向移動(dòng)手指從而觸發(fā)卡片的移動(dòng),如果Gridlayout布局內(nèi)的數(shù)字卡片出現(xiàn)位置移動(dòng)或者位置合并,則是為有效正常移動(dòng)步驟。玩家手指選擇移動(dòng)的方向上如果有一樣的數(shù)則合并之,每次有效移動(dòng)可以同時(shí)合并所有的2個(gè)數(shù),但不能連續(xù)合并2個(gè)數(shù),而且合并的所有數(shù)相加即為當(dāng)前所得分?jǐn)?shù)。玩家移動(dòng)方向行或列前方有任何空白卡片則會(huì)發(fā)生位置移動(dòng)。每一個(gè)有效移動(dòng)步驟的進(jìn)行都意味著棋盤的空位,即在無(wú)數(shù)字處隨機(jī)出現(xiàn)一個(gè)數(shù)字(依然可能為“2”或“4”,其概率仍然為0.8和0.2)。棋盤被數(shù)字填滿則無(wú)法進(jìn)行有效移動(dòng),系統(tǒng)自動(dòng)判定游戲失敗即游戲結(jié)束。如若棋盤上出現(xiàn)“2048”這樣的一個(gè)卡片,則為游戲取得勝利,此時(shí)游戲仍然繼續(xù)運(yùn)行。游戲程序啟動(dòng)后手機(jī)界面如圖1所示。
2.1 布局設(shè)計(jì)
首先設(shè)計(jì)一個(gè)線性布局控件,以此控件為基礎(chǔ),設(shè)計(jì)一個(gè)技術(shù)支持的顯示文本。與此同時(shí),設(shè)計(jì)一個(gè)計(jì)分的文本,并設(shè)計(jì)好以上2個(gè)組件對(duì)應(yīng)的寬和高。鑒于游戲主體部分是一個(gè)4×4的方格,所以我們采取了一個(gè)GridLayout布局來(lái)實(shí)現(xiàn)游戲的主要界面。
2.2 游戲主要設(shè)計(jì)
2.2.1 游戲主類GameView設(shè)計(jì)
游戲主類GameView繼承自GridLayout布局。此布局嵌套進(jìn)入主布局當(dāng)中,承擔(dān)著游戲運(yùn)行的空間,并確保不與其他文本控件的顯示發(fā)生沖突。
2.2.2 觸控交互設(shè)計(jì)
相比于其他開發(fā)系統(tǒng)版本的“2048”鍵盤式的觸控交互設(shè)計(jì)而言,安卓平臺(tái)的觸控交互設(shè)計(jì)是根據(jù)手勢(shì)動(dòng)作來(lái)判斷進(jìn)行的。所以這里采用一個(gè)觸屏監(jiān)聽器,記錄下用戶手指按下的位置跟手指松開的位置,并比較偏移值的大小來(lái)激活上、下、左、右操作所對(duì)應(yīng)的事件。
2.2.3 游戲卡片Card的添加設(shè)計(jì)
卡片是游戲的核心,要將卡片添加到GameView中。游戲中必須保證卡片的正常工作邏輯不產(chǎn)生任何異常。這里卡片大小的設(shè)計(jì)要注意卡片的大小與主界面的大小關(guān)系;其次要注意卡片類的位置存放方式以及卡片類出現(xiàn)的隨機(jī)性。
2.2.4 邏輯以及檢查結(jié)束的設(shè)計(jì)
在游戲的具體實(shí)現(xiàn)中,需要判斷玩家操作是否合法、界面是否有事件觸發(fā)、是否需要添加新數(shù)字;同時(shí)從左往右依次遍歷,根據(jù)獲取值的情況來(lái)判斷是否需要合并卡片,以及是否需要清除合并過的卡片類。游戲結(jié)束與否的判斷還要考慮以下2種情況:①當(dāng)前所有卡片值為0時(shí);②卡片4個(gè)方向上有重復(fù)的數(shù)字時(shí),這2種情況下游戲都是不能結(jié)束的。
3.1 算法設(shè)計(jì)
1)卡片類的設(shè)計(jì)。
對(duì)于手機(jī)中的卡片類大小,一般可以設(shè)計(jì)成為Absolute屬性,開發(fā)的產(chǎn)品比較直觀且能高效運(yùn)行。但考慮到該游戲能適配各種機(jī)型,不能出現(xiàn)卡片內(nèi)數(shù)字溢出等情況,需要將卡片設(shè)計(jì)成自發(fā)適應(yīng)屏幕大小的類型。
在卡片類的設(shè)計(jì)中應(yīng)注意以下幾種情況:
①為了避免界面的繁瑣,當(dāng)卡片中的值為0時(shí)不顯示。
②為了增加卡片的區(qū)分度,位子圖片顏色適當(dāng)進(jìn)行調(diào)節(jié)。
主要程序如下:
public class Card extends FrameLayout {// FrameLayout是分層布局
public Card(Context c) {//卡片類添加的屬性大小顏色
super(c);
label=new TextView(getContext()); label.setBackgroundColor(0x33fffdff);
label.setTextSize(22); //設(shè)置文字在方格的正中間
label.setGravity(Gravity.CENTER);
LayoutParams lp = new LayoutParams(-2,-2); //設(shè)置大方框距離邊緣距離為10px
lp.setMargins(8,8,0,0);//添加畫板
addView(label,lp);//為其添加數(shù)據(jù),其值為0 setNum(0);}
private int Num = 0; //取回當(dāng)前值public int getNum( )
{return Num;} //設(shè)置當(dāng)前值
public void setNum(int Num)
{
this.Num =Num; //當(dāng)卡片中值為0時(shí)則不顯示當(dāng)前卡片的值
if(Num<=0){
label.setText(" ");
}else{
label.setText(Num+"");
}
/* //改變文字所在的卡片顏色
switch (Num) {
case 0:
label.setBackgroundColor(0xffeee4fa);
break;
case 2:
label.setBackgroundColor(0x00000010);
break;
case 4:
label.setBackgroundColor(0xffede0d8);
break;
(此處省略8,16,32,64,128,256,512,1024,2048的語(yǔ)法)
default:
label.setBackgroundColor(0xff3c3a22);
break;
}
*/
} //定義一個(gè)equals方法用于比較卡片中的值的對(duì)比
public boolean equals(Card c) {
return getNum()==c.getNum();
}
private TextView label;
}
2)觸控交互式設(shè)計(jì)。
游戲的設(shè)計(jì)中有4種事件,分別是上、下、左、右移動(dòng)。而玩家的手勢(shì)卻是各異,如畫圈、畫斜線等。如何處理好這些事件,并將其分門別類歸納好,這是基于B/S架構(gòu)的安卓版本需要考慮的問題。根據(jù)現(xiàn)有的安卓版本,本游戲采取的策略是:監(jiān)聽用戶的按下屏幕位置坐標(biāo)以及用戶離開屏幕的位置坐標(biāo),取兩者橫縱坐標(biāo)的絕對(duì)值相比較再判斷大小,從而實(shí)現(xiàn)用戶手勢(shì)的監(jiān)聽以及對(duì)應(yīng)事件的觸發(fā)。
3)分?jǐn)?shù)的統(tǒng)計(jì)。
分?jǐn)?shù)的統(tǒng)計(jì)是一個(gè)繁瑣而復(fù)雜的過程。有移動(dòng)事件發(fā)生以后,卡片的位置會(huì)發(fā)生改變,卡片內(nèi)的值也會(huì)發(fā)生改變,有些卡片還會(huì)被釋放。因此應(yīng)該設(shè)計(jì)一個(gè)全局變量來(lái)保存數(shù)據(jù);其次,每個(gè)卡片類的設(shè)計(jì)中必須包含這個(gè)要發(fā)生交互的值。
4)隨機(jī)卡片的設(shè)計(jì)。
任何一款游戲的設(shè)計(jì)都應(yīng)該包含隨機(jī)性。移動(dòng)卡片后新卡片的產(chǎn)生需要通過隨機(jī)種子來(lái)產(chǎn)生,卡片隨機(jī)性的實(shí)現(xiàn)是一個(gè)難點(diǎn),可以通過Math.random( )>0.1<2∶4函數(shù)來(lái)實(shí)現(xiàn)隨機(jī)性的控制。
3.2 游戲程序具體實(shí)現(xiàn)
用一個(gè)GridLayout來(lái)放置所有卡片,卡片類中都有設(shè)置值及數(shù)值大小。通過addRandomNum()添加初始卡片,添加隨機(jī)數(shù)之前需要清空得分。通過cardsMap[p.x][p.y].setNum(Math.random( )>0.1<2∶4)確定游戲開始時(shí)2與4的出現(xiàn)比例。在添加數(shù)字過程中,分別根據(jù)獲取值是否為“0”來(lái)確定將右邊的值放到當(dāng)前位置還是合并這2個(gè)值。當(dāng)屏幕捕捉到有動(dòng)作時(shí),要添加新的隨機(jī)數(shù),然后檢測(cè)游戲是否結(jié)束。觸屏事件中,需要遍歷X、Y軸上值的情況來(lái)判斷添加值操作和合并操作。
各函數(shù)屬性設(shè)置如下:
point:分?jǐn)?shù)統(tǒng)計(jì),記錄本次游戲的分?jǐn)?shù);
cardsMap[x][y]:大布局下的小卡片位置;
onTouch(View v,MotionEvent e):觸屏事件;
addRandomNum():添加一個(gè)隨機(jī)數(shù)值的初始卡片;
onClickListener():事件監(jiān)聽器;
setNum(cardsMap[x][y].getNum()*2):設(shè)置卡片值;
addScore(cardsMap[x][y].getNum()):添加分?jǐn)?shù);
swipeLeft():向左觸屏移動(dòng);swipeRight()等方法依次類推;
checkComplete():檢查游戲是否完全結(jié)束,是,則激活游戲結(jié)束事件;
對(duì)象:
GameView:游戲主類,繼承自GridLayout。游戲的運(yùn)行載體;
Card:卡片對(duì)象,存放卡片相關(guān)的屬性和方法以及相關(guān)的屬性存取值方法。
3.3 測(cè)試結(jié)果
本設(shè)計(jì)各部分代碼完成后,在Android4.0模擬器和真機(jī)上進(jìn)行檢查調(diào)試,各模塊功能正常運(yùn)行。程序運(yùn)行前手機(jī)界面如圖2所示。
游戲結(jié)束前,需要檢查游戲是否結(jié)束。當(dāng)程序檢測(cè)到滿足結(jié)束條件時(shí),手機(jī)界面如圖3所示。
此時(shí),為了增強(qiáng)游戲趣味性,設(shè)計(jì)了最后的彈出頁(yè)面,鼓勵(lì)使用者繼續(xù)運(yùn)行游戲。程序結(jié)束后彈出界面如圖4所示。
本文從Java出發(fā),以Android為載體,采用面向?qū)ο蟮姆椒?,設(shè)計(jì)實(shí)現(xiàn)了游戲“2048”。通過安卓益智類小游戲“2048”的開發(fā),對(duì)游戲的界面以及邏輯的優(yōu)化實(shí)現(xiàn)上進(jìn)行了詳細(xì)分析,其面向?qū)ο蟮倪壿嬎季S方式,預(yù)計(jì)在未來(lái)很長(zhǎng)的一段時(shí)間內(nèi)都會(huì)是安卓游戲編程的主流思想。
[1] 李剛.瘋狂Java講義[M].北京:電子工業(yè)出版社,2008:201-205.
[2] 郝煥.Java輕松入門[M].北京:人民郵電出版社,2009:22-23.
[3] 墨菲.Android開發(fā)入門教程[M].李雪飛,吳明暉,譯.北京:人民郵電出版社,2010:18-19.
[4] 黃宇健,劉宏韜.Android項(xiàng)目開發(fā)范例大全[M].北京:中國(guó)鐵道出版社,2012:69-74.
[5] Bruce Eckel.Thinking in Java[M].New York:Prentice Hall,2006:128-129.
[6] Zhang Y,Huang G,Liu X,et al.Refactoring android Java code for on-demand computation offloading[J].Acm Sigplan Notices,2016,47(10):233-248.
[7] Wei L.Design and Implementation of Chinese chess network game based on Java[J].Journal of Xiangyang Vocational & Technical College,2016(3):22-28.
[8] Wang H,Jia YU.The Analysis and Review on Development Tools of Java(Ⅱ)[J].Journal of Jilin Institute of Chemical Technology,2016(3):39-46.
(責(zé)任編輯 吳鴻霞)
Design and Realization of Object-oriented Android Game "2048"
WangJi1,3,XiongHui1,2*,YuFeiyang1,YeCangzhu2,GuanShoujun2
(1School of Mathematics and Physics,Hubei Polytechnic University,Huangshi Hubei 435003;2Huangshi Sunshine Optoelectronic Co.Ltd.,Daye Hubei 435100;3China soft International Co.Ltd.,Beijing 100044)
Android Intelligence games are very popular with the majority of game players and game developers because of its great interest and low development cost."2048" is a classic card game that adopts the JAVA language development and uses correct nested call of various interface layout,which improves the subjective sensation of users' experience.At the same time,importance is attached to background processing of different events triggered by players,system corresponding logical relationship is automatically adjusted and game main function is realized.The game is designed in the object-oriented way and implements game development based on Android.
object-oriented;Android systems;game development
2016-07-24
湖北省大學(xué)生創(chuàng)新創(chuàng)業(yè)訓(xùn)練計(jì)劃項(xiàng)目(項(xiàng)目編號(hào):201510920023);湖北理工學(xué)院校級(jí)科研引進(jìn)人才項(xiàng)目(項(xiàng)目編號(hào):14xjz03R);湖北省知識(shí)創(chuàng)新專項(xiàng)(自然科學(xué)基金)(項(xiàng)目編號(hào):2016CFC742)。
汪季,本科生。
10.3969/j.issn.2095-4565.2017.02.006
TP319
A
2095-4565(2017)02-0024-04
*通訊作者:熊輝,講師,博士,研究方向:光電子信息技術(shù)。