• 
    

    
    

      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.

      郎溪县| 卢氏县| 汉阴县| 长垣县| 进贤县| 龙泉市| 公主岭市| 汪清县| 万源市| 盘锦市| 灯塔市| 连州市| 吕梁市| 通江县| 聊城市| 同德县| 尖扎县| 甘孜县| 灵台县| 诸暨市| 洪泽县| 新蔡县| 布尔津县| 墨脱县| 丽水市| 大同市| 林周县| 扶风县| 辛集市| 磐石市| 夏邑县| 伊川县| 林州市| 沂南县| 游戏| 永寿县| 长泰县| 丰城市| 利辛县| 陇川县| 胶南市|