趙宏
摘要:近幾年,隨著Android手機(jī)及其相關(guān)設(shè)備的迅速普及,針對(duì)Android平臺(tái)游戲的開發(fā)需求日益增多?!?048游戲”是一款益智類游戲,老少皆宜。該文設(shè)計(jì)并實(shí)現(xiàn)了基于Android平臺(tái)的2048游戲,最后在手機(jī)上測(cè)試運(yùn)行,結(jié)果十分流暢。
關(guān)鍵詞:Android平臺(tái);益智類游戲;2048游戲
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)34-0102-02
隨著移動(dòng)通信技術(shù)的迅速發(fā)展,人們對(duì)移動(dòng)設(shè)備需求的不斷變化,移動(dòng)設(shè)備的智能化程度也在不斷提高。Android平臺(tái)作為三大移動(dòng)平臺(tái)之一,用戶數(shù)量也在不斷增長(zhǎng)。同時(shí),人們不再滿足于傳統(tǒng)的桌面游戲,移動(dòng)游戲具有隨時(shí)、隨地和隨身等特點(diǎn),不斷受到用戶的青睞。因此,移動(dòng)游戲相對(duì)于傳統(tǒng)游戲所占的市場(chǎng)份額也在日益擴(kuò)大。本文設(shè)計(jì)和實(shí)現(xiàn)了一種基于Android平臺(tái)的2048益智游戲。
1 研究?jī)?nèi)容
數(shù)字游戲2048,初始數(shù)字則是由2+2組成的基數(shù)4。在操作方面,與其他一些數(shù)字游戲相比有所不同,表現(xiàn)為由一步一格的移動(dòng),變成更為爽快的一次到底。相同數(shù)字的卡片在靠攏、相撞時(shí)會(huì)相加。系統(tǒng)給予的數(shù)字方塊不是2就是4,用戶要想辦法在這16格范圍中湊出“2048”這個(gè)數(shù)字方塊就算成功。
本游戲是在Android應(yīng)用平臺(tái)上開發(fā)的,使用的開發(fā)語(yǔ)言為:Java語(yǔ)言,開發(fā)工具為Eclipse,并包含ADT等插件。
2 系統(tǒng)設(shè)計(jì)
在對(duì)游戲進(jìn)行詳細(xì)需求分析的基礎(chǔ)上,確定了系統(tǒng)的功能和性能要求,對(duì)游戲的主界面、屏幕繪制、布局設(shè)計(jì)、合并算法、游戲分?jǐn)?shù)及最高分的統(tǒng)計(jì)進(jìn)行了詳細(xì)設(shè)計(jì)。游戲單項(xiàng)功能的實(shí)現(xiàn):開始游戲、屏幕繪制、滑動(dòng)合并、重新開始游戲、統(tǒng)計(jì)得分和最高分等功能。然后自定義游戲視圖,且能夠根據(jù)控制器提供的布局?jǐn)?shù)據(jù)來(lái)顯示數(shù)字卡片方格,并提供選中合并、疊加和統(tǒng)計(jì)分?jǐn)?shù)等功能。
當(dāng)用戶點(diǎn)擊開始游戲后,用戶可以上下左右滑動(dòng)卡片,與此同時(shí)游戲也開始統(tǒng)計(jì)得分,隨著游戲得分越來(lái)越高,界面中空格卡片的剩余量也越來(lái)越少,用戶也可以退出游戲或重新開始游戲。系統(tǒng)流程圖如圖1。
在游戲的過(guò)程中,當(dāng)用戶滑動(dòng)卡片2,與卡片2相碰疊加,就會(huì)成為卡片4,與此類推,當(dāng)卡片1024與卡片1024疊加成卡片2048,則證明游戲闖關(guān)成功。
3 算法設(shè)計(jì)
當(dāng)用戶進(jìn)入游戲界面,開始游戲時(shí),首先系統(tǒng)會(huì)默認(rèn)自動(dòng)生成兩張數(shù)字卡片,可以任意滑動(dòng)。整個(gè)游戲涉及到核心算法主要有:手勢(shì)判斷,移動(dòng)卡片,判斷游戲結(jié)束。
3.1 手勢(shì)判斷
手勢(shì)的判斷與識(shí)別,是手機(jī)游戲的關(guān)鍵所在,也是手機(jī)游戲體驗(yàn)好壞的重要因素之一。在本游戲中,手勢(shì)判斷方法,記錄手勢(shì)在x軸上的距離,與y軸的距離大小,并做出相應(yīng)的判斷。比如手勢(shì)在x軸距離大于+5單位,則向表示右移;小于-5單位,則向左移。以此類推,判斷手勢(shì)在y軸的移動(dòng)。
private float startX, startY, offsetX, offsetY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = event.getX();
startY = event.getY();
break;
case MotionEvent.ACTION_UP:
offsetX = event.getX() - startX;
offsetY = event.getY() - startY;
//記錄手勢(shì)在x軸與y軸的距離大小
if (Math.abs(offsetX) > Math.abs(offsetY)) {
if (offsetX < -5) {
//手勢(shì)在x軸距離小于-5則向左移swipeLeft();
} else if (offsetX > 5) { //手勢(shì)在x軸距離大于+5則向右移 swipeRight(); }
} else {
if (offsetY < -5) {
//手勢(shì)在y軸距離小于-5則向上移swipeUp();
} else if (offsetY > 5) {
//手勢(shì)在y軸距離大于+5則向下移swipeDown(); } }
break; }
return true; }
3.2 移動(dòng)卡片
關(guān)于卡片移動(dòng)的方法,分成兩種情況來(lái)處理,一種是沒有能合并但有能夠移動(dòng)的,就移動(dòng)到相應(yīng)的位置。第二種,能夠合并的,合并到相應(yīng)的位置再移動(dòng)。
private void swipeLeft() {
boolean merge = false;
for (int y = 0; y < LINES; y++) {
for (int x = 0; x < LINES; x++) {
for (int x1 = x + 1; x1 < LINES; x1++) {
// 移動(dòng)不能合并的卡片位置
if (cardsMap[x1][y].getNum() > 0) {
if (cardsMap[x][y].getNum() <= 0) { cardsMap[x][y].setNum(cardsMap[x1][y].getNum()); cardsMap[x1][y].setNum(0);
x--;
merge = true; }
// 判斷是否還有能夠合并的卡片
else if (cardsMap[x][y].equals(cardsMap[x1][y])) {
cardsMap[x][y].setNum(cardsMap[x][y].getNum() *2);
cardsMap[x1][y].setNum(0);
score.addScore(cardsMap[x][y].getNum());
merge = true; }
break; } } }
}
if (merge) {
addRandomNum();
checkComplete();
}
3.3 判斷游戲結(jié)束
怎么判斷游戲是否結(jié)束呢?我們要看是否所有磚塊填滿,還要看相鄰卡片的數(shù)字是否相同,是否還有能夠合并的了。
4 功能實(shí)現(xiàn)
為了實(shí)現(xiàn)游戲的具體功能,思路如下:用戶進(jìn)入歡迎界面后,提示點(diǎn)擊屏幕,進(jìn)入游戲頁(yè)面,然后實(shí)現(xiàn)游戲的全部功能,如圖2和圖3。具體描述如下:
1)游戲的基本功能。首先,要游戲能夠正常啟動(dòng)運(yùn)行。在游戲開始階段,用戶應(yīng)該對(duì)卡片的方向有一個(gè)基本判斷(如上、下、左、右),因?yàn)橛脩暨x擇不同的方向,最后得分是不同的。另外,在游戲過(guò)程中可以使用道具,也可以選擇重新開始游戲。
2)游戲模式選擇。所謂游戲模式選擇,也就是當(dāng)用戶在游戲過(guò)程中遇到困難,不能再進(jìn)行下一步的時(shí)候,可以選擇使用道具,使其可以繼續(xù)進(jìn)行游戲。模式有兩種,間隔行和間隔列:所謂間隔行和間隔列,也就是在游戲的主畫面中,可以將間隔的行和列中的數(shù)字卡片合并且數(shù)字疊加,組成新的數(shù)字卡片。
3)游戲得分統(tǒng)計(jì)。當(dāng)用戶進(jìn)入游戲界面,開始游戲的時(shí)候,系統(tǒng)便開始進(jìn)行得分的統(tǒng)計(jì),用戶也可以通過(guò)得分,以此來(lái)激發(fā)用戶的玩游戲的欲望,使其自己的得分變得更高。最后還有一個(gè)最高分統(tǒng)計(jì),這個(gè)將會(huì)存儲(chǔ)在用戶的手機(jī)文件里,用作歷史記錄最高得分,增加用戶的挑戰(zhàn)性,同時(shí)也增加了游戲本身的趣味性。
5 結(jié)束與展望
本游戲的設(shè)計(jì)經(jīng)過(guò)Android平臺(tái)的模擬器測(cè)試,成功運(yùn)行。同時(shí),也經(jīng)過(guò)幾臺(tái)手機(jī)的測(cè)試,運(yùn)行十分流暢。今后,將繼續(xù)優(yōu)化游戲界面,增加功能,使游戲的趣味性和可玩性進(jìn)一步得到提高。
參考文獻(xiàn):
[1] 代亮, 林峰. 基于Android移動(dòng)平臺(tái)數(shù)獨(dú)游戲的設(shè)計(jì)與實(shí)現(xiàn)[J]. 電腦知識(shí)與技術(shù), 2013(5).
[2] 俞琳琳. 基于Starling的捕魚游戲的設(shè)計(jì)與開發(fā)[J]. 軟件工程師, 2014(12).
[3] 李剛. 瘋狂Android講義[M]. 北京:電子工業(yè)出版社, 2013.
[4] 郭少豪. Android 3D游戲開發(fā)與應(yīng)用案例詳解[M]. 北京: 中國(guó)鐵道出版社, 2012.
[5] 楊長(zhǎng)剛. 深入剖析Android系統(tǒng)[M]. 北京: 電子工業(yè)出版社, 2013.