瘋狂ios講義之實現遊戲邏輯(1)

FKGameService類是整個遊戲邏輯實現的核心它是一個可以複用的業務邏輯類它與遊戲實現平臺無關其實現原理與《瘋狂Android講義》書中Android版《瘋狂連連看》遊戲中GameService的實現原理相同。

13.6.1 定義FKGameService的接口代碼


根據前面程序對FKGameService對象的依賴程序需要FKGameService對象包含如下方法。

start初始化遊戲狀態開始遊戲的方法。

hasPieces判斷FKPiece二維數組中是否還剩下FKPiece對象如果所有的FKPiece都被消除了遊戲就算勝利。

(FKPiece*) findPieceAtTouchX:(CGFloat) touchX touchY:(CGFloat)touchY根據觸碰點的XY座標來獲取FKPiece

(FKLinkInfo*) linkWithBeginPiece:(FKPiece*)p1 endPiece: (FKPiece*)p2判斷p1p2兩個方塊是否可以相連。

FKGameService類定義的接口部分代碼如下。

程序清單codes/13/Link/Link/sources/board/FKGameService.h

wKiom1MEB87Rnm-rAANz6s29T5A547.jpg


13.6.2 實現FKGameService


FKGameService組件的前兩個方法實現起來都比較簡單。

程序清單codes/13/Link/Link/sources/board/FKGameService.m

wKioL1MEB8Og96kVAANKG1EQxEA375.jpg

面三個方法的實現都很簡單相信讀者很容易理解。下面詳細介紹剩下的兩個方法的實現。


13.6.3 獲取觸碰點的方塊


當用戶觸碰遊戲界面時事件監聽器獲取的是該觸碰點在遊戲界面上的XY座標但程序需要獲取用戶觸碰的到底是哪個方塊。因此程序必須把界面上的XY座標換算成在FKPiece二維數組中的兩個索引值。

考慮到遊戲界面上每個方塊的寬度、高度都是相同的因此想將界面上的XY座標換算成FKPiece二維數組中的索引也比較簡單隻要用XY座標值除以圖片的寬、高即可。下面的方法是根據觸碰點XY座標獲取對應方塊的代碼。

程序清單codes/13/Link/Link/sources/board/FKGameService.m

wKiom1MEB_7Az6PTAAQNSEwos4k173.jpg

上面的方法中兩行粗體字代碼用於根據觸碰點XY座標來計算它在FKPiece二維數組中的索引值。該方法調用了getIndexWithRelateive:size:進行計算。

getIndexWithRelateive:size:方法的實現就是用relative除以size只是程序需要判斷可以整除和不能整除兩種情況如果可以整除說明還在前一個方塊內如果不能整除則對應於下一個方塊。下面是getIndexWithRelateive:size:方法的代碼。

程序清單codes/13/Link/Link/sources/board/FKGameService.m

wKioL1MEB-nhUO2OAAJN6VOARJc572.jpg


13.6.4 判斷兩個方塊是否可以相連


判斷兩個方塊是否可以相連是本程序需要處理的最煩瑣的地方因爲兩個方塊可以相連的情形比較多大致可分爲如下情況。

兩個方塊位於同一條水平線可以直接相連。

兩個方塊位於同一條豎直線可以直接相連。

兩個方塊以兩條線段相連也就是有1個拐角。

兩個方塊以三條線段相連也就是有2個拐角。

- (FKLinkInfo*)linkWithBeginPiece:(FKPiece*)p1 endPiece:(FKPiece*)p2方法把這4種情況分開進行處理代碼如下。

程序清單codes/13/Link/Link/sources/board/FKGameService.m

wKiom1MECCmAuAebAAL7f25PgsU219.jpg

wKiom1MECDHwe1l8AAO316Ilo9I405.jpg

程序中的4處粗體字代碼分別代表兩個方塊位於同一條水平線可直接相連、兩個方塊位於同一條豎直線可直接相連、兩個方塊需要兩條線相連、兩個方塊需要3條線相連。上面的方法分別考慮了這4種情況但程序還需要爲這4個方法提供實現。

爲了實現上面4個方法可以對兩個Piece的位置關係進行歸納。

p1p2在同一行indexY值相同。

p1p2在同一列indexX值相同。

p2p1的右上角p2indexX >p1indexXp2indexY < p1indexY

p2p1的右下角p2indexX >p1indexXp2indexY > p1indexY

至於p2p1的左上角以及p2p1的左下角這兩種情況程序可以重新執行linkWithBeginPiece: endPiece:方法將p1p2兩個參數的位置互換即可。


——————本文節選自《瘋狂ios講義上》
090911_mzHb_262659.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章