第一個AIR Android程式:翻轉黑白棋
之前介紹了開發環境的搭建,按照電腦應用開發慣例,應該是“HelloWorld”出場的時間了。考慮到並不是講述程式設計語言的基礎教程,而是側重於實踐,所以,我們跳過簡單的“HelloWorld”,來看一個更複雜的執行個體。
本文將編寫一個完整的移動小遊戲,並把它部署在手機上。因此,我們將親曆一個移動程式完整的誕生過程,從程式設計、代碼編寫,到最後的安裝。在這個過程中會涉及很多Android開發的技術細節,讀者也可以近距離感受AIR帶來的開發樂趣。
遊戲的設計思路
在當前的Flash程式中,休閑類遊戲佔了很大的比重。這類遊戲一般體積小,玩法簡單,但有創意,容易吸引使用者。從技術角度看,休閒遊戲的特點非常適合移動平台,事實也證明了這一點。不管是在Google電子市場上,還是在蘋果的App Store上,休閑類遊戲都佔據了很大的比例。可以預見,在未來一段時間內,眾多網路上的Flash遊戲將被移植到行動裝置上。
翻轉黑白棋是一個經典的智力遊戲,筆者最早見到的版本是由國外的Terry Paton出品的,原名FlipIt。該遊戲推出後便風靡一時,在Google電子市場、蘋果的App Store上都有相應版本發布。
遊戲規則非常簡單:在棋盤上整齊地排列著若干個棋子,分為黑白兩色。玩家單擊任意一個棋子,該棋子會翻轉為相反的顏色;同時相鄰的棋子也跟著翻轉,2-1所示。當棋子全部變為白色時,則勝利過關。當然,所用的單擊次數越少成績越好。
雖然初看很簡單,但真正玩起來卻很有難度,特別是在大尺寸的棋盤上,如果不掌握一些技巧,可能玩一天也過不了關。
從技術角度分析,該遊戲唯一痛點可能在於如何動態產生棋盤地圖,並控制地圖的難易度。在網路上已經有不少相關的討論,比如有人使用線性方程組來求解。遊戲演算法的討論不在本書範圍內,筆者這裡直接借鑒了原遊戲中的一個關卡,使用的棋盤為4×4大小,類比的效果2-2所示。
地圖問題解決了,接下來開始設計遊戲的結構。在程式運行期間,只有一種使用者互動動作,即單擊事件。因此整個遊戲的邏輯很清楚,運行流程可以分以下兩步。
步驟1 按照已有的地圖資料繪製棋盤,進入待機狀態。
地圖資料可以用一個4×4的二維矩陣來表示,每個值分別代表了初始狀態下對應位置的棋子的顏色,2-3所示。由於只有黑白兩色,棋子的狀態可以簡單地用布爾值來表示,即false代表黑色,true代表白色。每次單擊棋子時對要翻轉的棋子做邏輯非處理。
在繪製地圖時,根據每個值在矩陣中的索引位置,可以很方便地對棋子進行布局。
步驟2 處理使用者單擊事件。
每次單擊任一棋子時,將它翻轉,同時翻轉四周的棋子。在處理四周的棋子時,要注意判斷周圍的哪些棋子是有效,比如,如果單擊的棋子已經在最左側了,那麼其左邊是沒有相鄰棋子的。使用者單擊後棋盤上的棋子狀態發生了變化,因此,需要判斷所有棋子是否已是白色。如果是,則過關了,遊戲結束。
到這裡,相信讀者對遊戲的製作思路已經瞭然於胸了,剩下的工作就是編寫代碼,把整個過程呈現出來。