helloPe的android項目實戰之連連看 – Android移動開發技術文章_手機開發 Android移動開發教學課程

此篇為第一篇,本系列文章隻為記下android小項目的是設計,實現過程。本文將首先介紹連連看項目的設計,以及涉及到的相關的內容與項目中所需算法研究算法。

 

本系列文章記錄隻是為瞭增加android項目實戰經驗,將所學的知識用於相應的項目開發當中。首先介紹一下android中連連看項目的架構及所用到的技術進行簡要分析,框架基本如下圖所示:

 

本程序主要包含兩大模塊:即(1)表示層模塊;(2)後臺邏輯模塊;

其中表示層模塊可以理解為遊戲的UI及一些遊戲輔助效果,表示層模塊中,重要的是實現遊戲的佈局地圖,項目中實現中,遊戲的佈局將使用自定義View的方式,在屏幕上貼圖實現。而菜單模塊及選關的dialog,隻是為用戶提供一些常見的選擇,如重玩,過關繼續,音效開關等等,為瞭有一個更好的用戶交互環境,dialog的實現將通過自定義dialog的方式。而遊戲音效是MediaPlayer在不同的狀態場景下播放不同的遊戲音效。

而後臺邏輯模塊中,即時對於程序計算的實現與程序各種狀態的監聽,將是整個程序運行的基礎。此模塊中將實現對於遊戲剩餘時間限制和遊戲狀態的監聽與處理。對於遊戲剩餘時間的監聽,將開啟單獨的線程進行處理,從而不至於影響主程序邏輯的運行;遊戲的狀態的監控處理中,將會實現對於連通的兩個圖標的消除(即遊戲界面的更新),遊戲輸贏的監聽判斷,遊戲暫停與否等(暫停狀態需要同時將剩餘時間暫停,而時間監聽線程需要知道所處狀態,此二者緊密聯系)。對於本程序中最重要的還是程序中核心算法模塊的實現,在遊戲中,最主要的算法是判斷兩個選中的圖標是否能夠連通,其餘兩個算法也依賴於此算法而進行。下面著重介紹一下連接算法:

  在介紹連接算法之前,先簡單介紹一下連連看的佈局算法,為瞭簡單起見,我們使用4*4的棋盤,假設棋子有四種:

首先在程序初始化時,我們先將要加載的圖片在棋盤上按序繪制出來,註意每一種圖標我們繪制的時候需要一次性繪制兩次,這樣,才能保重繪制出來的每種圖標的個數都是偶數個。假設最初如下圖(1):

                                            

                          圖(1)最初繪制                                      圖(2)調換後棋盤

這樣繪制後,我們進行一次遍歷,隨機的調換棋盤中的圖標(是現有棋盤中的圖標之間的調換,並不是更改成為其他的圖標)。經過調換的棋盤可能如圖(2)所示這樣就完成瞭棋盤的初始化,當然我們的棋盤在最外面一層中是不添加圖標的,為的是我們連線時候能夠使用最外層畫線,而不會出現穿過圖標畫線的情況,棋盤如下圖:

                                               

 

  現在看看連接算法的原理:

首先兩個圖標能夠連接的充分條件是:(1)兩個圖標是相同的;(2)兩個圖標之間有一條路相連,其中這條“路上”沒有其他的圖標“阻礙”;(3)這一條路不能有兩個以上的拐角;滿足這三個條件即可認為兩個圖標是相連通的;對於連通的判斷中,圖標連通時有三種情況,分為以下:

(1)直線型:這就是橫向或者是縱向方向判斷即可,這種情況最容易判斷,隻要兩者之間沒有其他圖標即可,就不多說;

(2)一折型:其實在兩個選中圖標確定的兩個對角頂點畫一個矩形,若是其餘兩個頂點中有能夠滿足與兩個選中圖標都能夠“直線型”相連的,即可認為此兩個選中圖標可以相連,實例如下,判斷兩個紅色的圖標相連的情況:

                                                   
 

                                                     一折型的示例

 

(3)二折型:對於二折型的判斷是重點。判斷二折型主要是做兩個方向的掃描,即橫向掃描與縱向掃描:

首先說橫向掃描:

                     
 

                需要判斷的兩個紅色圖標           進行橫向擴展                            擴展中兩點能夠滿足直線型相連

 

橫向掃描中:首先將兩個需要判斷的比圖標進行橫向的擴展,擴張規則是在沒有遇到其他圖標時一直擴展,知道遇到此行的其他圖標或者到達棋盤的邊緣,擴展後的點如圖中X表示,如果擴展後的點種能夠存在兩點滿足直線型相連通的情況,即可判斷兩個圖標是可以相連通的,連通的畫線也是根據這兩個輔助點相連而成的;

類似的,對於縱向掃描中:

                     

              需要判斷的兩個紅色圖標               進行縱向擴展                         擴展中存在兩點能夠滿足”直線型“

 

連連看連接算法到此也算完成瞭,至於hint的幫助算法,判斷當前棋盤是否還有解的算法都是依賴於次算法。

    此項目文章下一步將是進行每一個功能模塊及算法的一步步實現。之所以寫本系列的文章,為瞭記錄android小項目的經歷,增加實戰的能力,做個總結。並不是為瞭做出多麼新穎的項目,當然也向不少的網友學習瞭!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。