孔祥龍
摘要:該文介紹了連連看游戲的控制邏輯設(shè)計(jì),以及在Android平臺(tái)的實(shí)現(xiàn)過程。提供一個(gè)設(shè)計(jì)Android手機(jī)游戲的參考案列,該游戲可運(yùn)行于以 Android作為操作系統(tǒng)的手機(jī)。
關(guān)鍵詞 :可通;控制邏輯;偽代碼
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2017)03-0206-03
1 背景
Android手機(jī)開發(fā)平臺(tái)被稱為“第一個(gè)真正開放的手機(jī)開發(fā)平臺(tái)”,學(xué)會(huì)Android平臺(tái)的應(yīng)用對(duì)于手機(jī)應(yīng)用程序的開發(fā)有非常重要的意義。
連連看游戲規(guī)則簡(jiǎn)單,容易上手,是一款適合大眾的經(jīng)典休閑小游戲,所以將它移植到廣泛使用的Android手機(jī)開發(fā)平臺(tái)上就很有意義。
連連看游戲的規(guī)則是只要將相同的兩個(gè)圖標(biāo)用三條以內(nèi)的直線連在一起就可以消除這兩個(gè)圖標(biāo),這三條以內(nèi)的直線都不能經(jīng)過非空閑區(qū)(有圖標(biāo)的方塊)。所有的圖標(biāo)在規(guī)定的時(shí)間內(nèi)全部消除完畢則取勝,如果在規(guī)定的時(shí)間內(nèi)沒有消完則失敗。
控制邏輯可分為三種情況,分別是在一條直線上可通的判斷,兩條直線上可通的判斷(轉(zhuǎn)一個(gè)彎)和三條直線上可通的判斷(轉(zhuǎn)兩個(gè)彎)。
2 控制邏輯設(shè)計(jì)
2.1 同一條直線上的算法實(shí)現(xiàn)
同一條直線上分為水平(如圖1,從點(diǎn)1到點(diǎn)2)和垂直(如圖2,從點(diǎn)1到點(diǎn)2)兩種情況,這兩種情況相似。
如果兩個(gè)選中的圖標(biāo)在一條直線上有可通的路徑,則它們只需要一條直線就可以連接。
這時(shí)我們可以用一個(gè)循環(huán)從一個(gè)點(diǎn)掃描到另一個(gè)點(diǎn),查看它們之間的路徑上是否有障礙。如果沒有障礙則這兩個(gè)點(diǎn)可消,否則不可消。
此算法實(shí)現(xiàn)的偽代碼如下:
public boolean Vertical(Point a , Point b)//垂直方向可通的算法
{
int start,end; //start,end分別為所選圖標(biāo)起點(diǎn)和終點(diǎn)的一個(gè)坐標(biāo)
if(a.x==b.x&&a.y==b.y) //如果兩次所選是同一點(diǎn)則退出
return false; //返回不可通標(biāo)記
start=Math.min(a.y,b.y); //取兩點(diǎn)中縱坐標(biāo)小的點(diǎn)為起始點(diǎn)的縱坐標(biāo)
end=Math.max(a.y,b.y); //取兩點(diǎn)中縱坐標(biāo)大的點(diǎn)為終點(diǎn)的縱坐標(biāo)
for(int i=start+1; i if(Grid[a.x][i]!=0) //此點(diǎn)不通 return false; //有任意一點(diǎn)不通則所選的兩點(diǎn)之間便垂直方向不通 p = new Point [] {a,b}; //此兩點(diǎn)可通,記錄下這兩點(diǎn)的坐標(biāo) LineType=V_LINE; //標(biāo)記可通類型為“垂直可通” return true; //返回可通標(biāo)記 } public boolean Horizontal(Point a , Point b) //水平方向可通的算法 { int start,end; //start,end分別為所選圖標(biāo)起點(diǎn)和終點(diǎn)的一個(gè)坐標(biāo) if(a.x==b.x&&a.y==b.y) //如果兩次所選是同一點(diǎn)則退出 return false; //返回不可通標(biāo)記 start=Math.min(a.x,b.x); //取兩點(diǎn)中橫坐標(biāo)小的點(diǎn)為起始點(diǎn)的橫坐標(biāo) end=Math.max(a.x,b.x); //取兩點(diǎn)中橫坐標(biāo)大的點(diǎn)為終點(diǎn)的橫坐標(biāo) for(int i=start+1;i if(Grid[i][a.y]!=0) //此點(diǎn)不通 return false; //有任意一點(diǎn)不通則所選的兩點(diǎn)之間便水平方向不通 p = new Point[]{a,b};//此兩點(diǎn)可通,記錄下這兩點(diǎn)的坐標(biāo) LineType=H_LINE; //標(biāo)記可通類型為“水平可通” return true; //返回可通標(biāo)記 } 2.2 轉(zhuǎn)一個(gè)彎算法實(shí)現(xiàn) 如圖3所示,轉(zhuǎn)一個(gè)彎,可以先看它們的對(duì)角點(diǎn)3,如果3這個(gè)點(diǎn)沒有圖標(biāo),再測(cè)試3和1是否是垂直可通并且3和2是否是水平可通。如果條件都成立則1和2是轉(zhuǎn)一個(gè)彎可通的。 如圖4所示,同樣的道理。如果對(duì)角點(diǎn)3處沒有圖標(biāo),并且3和1水平可通,3和2垂直可通,則1和2是轉(zhuǎn)一個(gè)彎可通的。 當(dāng)然上面兩種情況都是轉(zhuǎn)一個(gè)彎可通,它們都需要2條直線相連。 此算法實(shí)現(xiàn)的偽代碼如下: public boolean oneCorner(Point a , Point b) //轉(zhuǎn)一個(gè)彎可通的算法 { Point c = new Point(a.x,b.y); //定義第一個(gè)點(diǎn)為所選兩點(diǎn)的對(duì)角點(diǎn) Point d = new Point(b.x,a.y); //定義第二個(gè)點(diǎn)為所選兩點(diǎn)的另一個(gè)對(duì)角點(diǎn) if(Grid[c.x][c.y]==0) //判斷第一個(gè)對(duì)角點(diǎn)是否可通 { //判斷對(duì)角點(diǎn)和所選兩點(diǎn)是否分別垂直可通和水平可通
boolean x1 = Vertical(c,a) && Horizontal(c,b);
//可通則保存對(duì)角點(diǎn)和所選兩點(diǎn)的坐標(biāo)
p = new Point [] {a, new Point (c.x,c.y),b};
LineType=ONE_CORNER;//
return x1;
}
if(Grid[d.x][d.y]==0)
{
boolean x2 = Vertical(d,b) && Horizontal(d,a);
p = new Point [] {a , new Point (d.x,d.y) , b};
LineType=ONE_CORNER; //標(biāo)記可通類型為“轉(zhuǎn)一個(gè)彎可通”
return x2; //返回是否可通標(biāo)記
}
return false; //返回不通標(biāo)記
}
圖3 二直線可通(1) 圖4 二直線可通(2)
2.3 轉(zhuǎn)二個(gè)彎算法實(shí)現(xiàn)
如圖5、6、7、8、9所示,我們通過觀察這5張圖可以發(fā)現(xiàn)轉(zhuǎn)二個(gè)彎可通的這5種類型的圖形都過3和4這兩點(diǎn)。這樣我們可以用4個(gè)循環(huán)分別從1和2兩點(diǎn)的上、下、左、右四個(gè)方向掃描,找出像3和4這類的一對(duì)點(diǎn),將它們依次放入一個(gè)隊(duì)列中。然后每取出一對(duì)點(diǎn)(例如取出的是圖5中的3和4點(diǎn)),就測(cè)試1和3是否垂直相通,并且4和2是否也垂直相通。如果這兩個(gè)條件都滿足,則1和2這兩個(gè)點(diǎn)是轉(zhuǎn)兩個(gè)彎相通的。其它圖的類似。
此算法實(shí)現(xiàn)的偽代碼如下:
public boolean twoCorner(Point a , Point b) //轉(zhuǎn)二個(gè)彎可通的算法
{
QList=find(a,b);//找出所有如圖5、6、7、8、9中的3和4方塊對(duì)
if(QList.isEmpty())//如果沒有3和4這樣的方塊對(duì)
return false;//返回不通標(biāo)記
//掃描所有的3和4這樣的塊
for(int index=0;index < QList.size();index++)
{
Line line = (Line)QList.get(index);//獲得當(dāng)前方塊對(duì)
if(line.direct==0)//如果3和4是水平方向
{
//判斷所選的兩點(diǎn)分別和3、4是否垂直可通
if(Vertical(a,line.a)&&Vertical(line.b,b))
{
p = new Point [] {a,line.a,line.b,b};//保存可通路徑
LineType=TWO_CORNER; //標(biāo)記可通類型為“轉(zhuǎn)二個(gè)彎可通” return true; //返回可通標(biāo)記
}
}
//如果3和4是垂直方向,判斷所選的兩點(diǎn)分別和3、4是否水平可通
else if (Horizontal(a,line.a)&&Horizontal(line.b,b))
{
p = new Point [] {a,line.a,line.b,b};//保存可通路徑
LineType=TWO_CORNER; //標(biāo)記可通類型為“轉(zhuǎn)二個(gè)彎可通”
return true; //返回可通標(biāo)記
}
}
return false; //返回不可通標(biāo)記
}
3 結(jié)束語
文章詳細(xì)介紹了Android平臺(tái)連連看游戲控制邏輯的設(shè)計(jì)與實(shí)現(xiàn)過程,希望能為有志從事Android游戲開發(fā)的朋友提供些許幫助。
參考文獻(xiàn):
[1] 任玉剛. Android開發(fā)藝術(shù)探索[M]. 北京: 電子工業(yè)出版社, 2015.
[2] 何紅輝. Android 源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)[M]. 北京: 人民郵電出版社, 2015.