對遊戲玩家而言在遊戲界面上看到的“元素”千差萬别、變化多端但對遊戲開發者而言遊戲界面上的元素在底層都是一些資料不同的資料所繪制的圖檔有所不同。是以建立遊戲的狀态資料模型是實作遊戲邏輯的重要步驟。
《瘋狂連連看》的遊戲界面是一個n×m的“網格”每個網格上顯示一張圖檔對遊戲開發者來說這個網格隻需要用一個二維資料來定義而每個網格上所顯示的圖檔對底層的資料模型來說不同的圖檔對應于不同的數值即可。圖13.6顯示了資料模型的示意。

圖13.6《瘋狂連連看》的資料模型
對于圖13.6所示的資料模型隻要讓數值為0的網格上不繪制圖檔其他數值的網格則繪制相應的圖檔就可顯示出《瘋狂連連看》的遊戲界面。
本程式實際上并不是直接使用int[][]數組來儲存遊戲的狀态資料而是采用NSArray來儲存遊戲的狀态模型而NSArray的元素又是NSArray相當于建立二維數組數組元素是FKPiece。因為FKPiece對象封裝的資訊更多不僅包含了該方塊左上角的X、Y坐标還包含了該FKPiece所顯示的圖檔、圖檔ID這個圖檔ID可作為該FKPiece的資料。
為了初始化遊戲狀态程式需要建立一個NSArray數組為此程式定義一個FKBaseBoard基類該基類的代碼如下。
程式清單codes/13/Link/Link/sources/board/FKBaseBoard.h
<a href="http://s3.51cto.com/wyfs02/M00/12/2B/wKiom1L8I7mDfMGVAAB0wo944LI255.jpg" target="_blank"></a>
程式清單codes/13/Link/Link/sources/board/FKBaseBoard.m
<a href="http://s3.51cto.com/wyfs02/M00/12/2B/wKioL1L8I66S3h_YAAU-9S6Y2aQ817.jpg" target="_blank"></a>
上面的粗體字代碼塊用于初始化NSArray代表的二維數組為有方塊的FKPiece元素的beginX、beginY、image屬性指派beginX、beginY根據該方塊在二維數組中的位置動态計算得到。
提示
上面程式中用到了xSize、ySize等常量這兩個常量用于代表該遊戲在橫向和縱向上各包含多少個方塊。程式專門定義了一個Constants.h檔案來記錄這些常量的值後面有些類也用到了該頭檔案中的常量請讀者參考本書配套CD光牒中的Constants.h檔案。
程式中的①号代碼調用了createPieces:方法來建立一個NSArray集合該方法将會交給其子類去實作這裡是典型的“模闆模式”的應用。FKBaseBoard基類完全可以根據FKPiece對象在二維數組中的位置動态地計算它的beginX、beginY但FKBaseBoard不确定NSArray代表二維數組的哪些元素是有方塊的。
由于《瘋狂連連看》遊戲的初始狀态可能有很多種比如橫向分布的方塊、豎向分布的方塊、矩陣排列的方塊、随機分布的方塊等該程式為了考慮以後的擴充性此處隻采用了模闆模式FKBaseBoard基類負責完成通用的代碼對于暫時無法确定的需要子類實作的部分可定義成createPieces:方法。
提示
由于Objective-C沒有提供抽象類和抽象方法的概念是以此處将createPieces:方法定義成傳回nil的空方法。
上面的程式中還用到了一個ImageUtil工具類它的作用是自動搜尋項目包的圖檔并根據需要随機讀取該目錄下的圖檔。後面會詳細介紹該工具類的用法。
下面為該FKBaseBoard實作三個子類。
矩陣排列的方塊會填滿二維數組的每個數組元素隻是把四周留白即可該子類的代碼實作如下接口部分幾乎沒有代碼是以此處不再給出。
程式清單/Users/yeeku/publish/codes/13/Link/Link/sources/board/FKFullBoard.m
<a href="http://s3.51cto.com/wyfs02/M01/12/2B/wKiom1L8JBnw2ZNwAAKNkjkLCcc079.jpg" target="_blank"></a>
該子類初始化的遊戲界面如圖13.7所示。
圖13.7矩陣排列的方塊
豎向排列的方塊以垂直的空列分隔開該子類的代碼實作如下接口部分幾乎沒有代碼是以此處不再給出。
程式清單codes/13/Link/Link/sources/board/FKVerticalBoard.m
<a href="http://s3.51cto.com/wyfs02/M02/12/2B/wKiom1L8JDqRorNqAAKPjZZ1-JY014.jpg" target="_blank"></a>
程式中的粗體字代碼控制了隻設定i % 2 == 0的列也就是隻設定索引為偶數的列該子類初始化的遊戲界面如圖13.8所示。
圖13.8豎向排列的方塊
橫向排列的方塊以水準的空行分隔開該子類的代碼如下。
程式清單codes/13/Link/Link/sources/board/FKHorizontalBoard.m
<a href="http://s3.51cto.com/wyfs02/M02/12/2C/wKioL1L8JCigzoqhAAK1x1mbx1g900.jpg" target="_blank"></a>
程式中的粗體字代碼控制了隻設定j % 2 == 0的行也就是隻設定索引為偶數的行該子類初始化的遊戲界面如圖13.9所示。
圖13.9 橫向排列的方塊
——————本文節選自《瘋狂ios講義上》