• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    Android 平臺(tái)連連看游戲控制邏輯設(shè)計(jì)與實(shí)現(xiàn)

    2017-03-27 14:18:04孔祥龍
    電腦知識(shí)與技術(shù) 2017年3期

    孔祥龍

    摘要:該文介紹了連連看游戲的控制邏輯設(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.

    晴隆县| 三亚市| 巴青县| 张家港市| 柯坪县| 龙岩市| 科技| 汶上县| 镶黄旗| 肇源县| 松潘县| 儋州市| 博兴县| 瑞安市| 天等县| 宁河县| 清远市| 公主岭市| 霍邱县| 镇平县| 大石桥市| 闽清县| 乳山市| 七台河市| 东乡| 靖边县| 莱芜市| 闸北区| 静安区| 公安县| 高阳县| 大方县| 淄博市| 陵水| 利津县| 新巴尔虎右旗| 石河子市| 浦城县| 满洲里市| 忻州市| 太仆寺旗|