FKGameService類是整個遊戲邏輯實作的核心它是一個可以複用的業務邏輯類它與遊戲實作平台無關其實作原理與《瘋狂Android講義》書中Android版《瘋狂連連看》遊戲中GameService的實作原理相同。
根據前面程式對FKGameService對象的依賴程式需要FKGameService對象包含如下方法。
start初始化遊戲狀态開始遊戲的方法。
hasPieces判斷FKPiece二維數組中是否還剩下FKPiece對象如果所有的FKPiece都被消除了遊戲就算勝利。
(FKPiece*) findPieceAtTouchX:(CGFloat) touchX touchY:(CGFloat)touchY根據觸碰點的X、Y坐标來擷取FKPiece。
(FKLinkInfo*) linkWithBeginPiece:(FKPiece*)p1 endPiece: (FKPiece*)p2判斷p1、p2兩個方塊是否可以相連。
為FKGameService類定義的接口部分代碼如下。
程式清單codes/13/Link/Link/sources/board/FKGameService.h
<a href="http://s3.51cto.com/wyfs02/M01/12/55/wKiom1MEB87Rnm-rAANz6s29T5A547.jpg" target="_blank"></a>
13.6.2 實作FKGameService
FKGameService元件的前兩個方法實作起來都比較簡單。
程式清單codes/13/Link/Link/sources/board/FKGameService.m
<a href="http://s3.51cto.com/wyfs02/M00/12/56/wKioL1MEB8Og96kVAANKG1EQxEA375.jpg" target="_blank"></a>
面三個方法的實作都很簡單相信讀者很容易了解。下面詳細介紹剩下的兩個方法的實作。
當使用者觸碰遊戲界面時事件監聽器擷取的是該觸碰點在遊戲界面上的X、Y坐标但程式需要擷取使用者觸碰的到底是哪個方塊。是以程式必須把界面上的X、Y坐标換算成在FKPiece二維數組中的兩個索引值。
考慮到遊戲界面上每個方塊的寬度、高度都是相同的是以想将界面上的X、Y坐标換算成FKPiece二維數組中的索引也比較簡單隻要用X、Y坐标值除以圖檔的寬、高即可。下面的方法是根據觸碰點X、Y坐标擷取對應方塊的代碼。
<a href="http://s3.51cto.com/wyfs02/M02/12/55/wKiom1MEB_7Az6PTAAQNSEwos4k173.jpg" target="_blank"></a>
上面的方法中兩行粗體字代碼用于根據觸碰點X、Y坐标來計算它在FKPiece二維數組中的索引值。該方法調用了getIndexWithRelateive:size:進行計算。
getIndexWithRelateive:size:方法的實作就是用relative除以size隻是程式需要判斷可以整除和不能整除兩種情況如果可以整除說明還在前一個方塊内如果不能整除則對應于下一個方塊。下面是getIndexWithRelateive:size:方法的代碼。
<a href="http://s3.51cto.com/wyfs02/M01/12/56/wKioL1MEB-nhUO2OAAJN6VOARJc572.jpg" target="_blank"></a>
13.6.4 判斷兩個方塊是否可以相連
判斷兩個方塊是否可以相連是本程式需要處理的最煩瑣的地方因為兩個方塊可以相連的情形比較多大緻可分為如下情況。
兩個方塊位于同一條水準線可以直接相連。
兩個方塊位于同一條豎直線可以直接相連。
兩個方塊以兩條線段相連也就是有1個拐角。
兩個方塊以三條線段相連也就是有2個拐角。
- (FKLinkInfo*)linkWithBeginPiece:(FKPiece*)p1 endPiece:(FKPiece*)p2方法把這4種情況分開進行處理代碼如下。
<a href="http://s3.51cto.com/wyfs02/M00/12/55/wKiom1MECCmAuAebAAL7f25PgsU219.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M01/12/55/wKiom1MECDHwe1l8AAO316Ilo9I405.jpg" target="_blank"></a>
程式中的4處粗體字代碼分别代表兩個方塊位于同一條水準線可直接相連、兩個方塊位于同一條豎直線可直接相連、兩個方塊需要兩條線相連、兩個方塊需要3條線相連。上面的方法分别考慮了這4種情況但程式還需要為這4個方法提供實作。
為了實作上面4個方法可以對兩個Piece的位置關系進行歸納。
p1與p2在同一行indexY值相同。
p1與p2在同一列indexX值相同。
p2在p1的右上角p2的indexX >p1的indexXp2的indexY < p1的indexY。
p2在p1的右下角p2的indexX >p1的indexXp2的indexY > p1的indexY。
至于p2在p1的左上角以及p2在p1的左下角這兩種情況程式可以重新執行linkWithBeginPiece: endPiece:方法将p1和p2兩個參數的位置互換即可。
——————本文節選自《瘋狂ios講義上》

本文轉自
fkJava李剛 51CTO部落格,原文連結: http://blog.51cto.com/javaligang/1360318,如需轉載請自行聯系原作者