2014-02-13 34 views
1

我正在製作一個iOS遊戲,每次將地圖上的建築物放置在一張地圖上,然後在轉彎結束時根據建築物類型處理經濟放置以及它們所放置的地形的類型。將事件卡添加到模擬遊戲Objective-C

我想添加一套活動卡片到遊戲中。每回合將從一副牌中抽出一張事件牌,這可能會影響牌本身,建築物或玩家迄今積累的資源總價值。

就類層次結構而言,我在頂部有一個包含Tilemap字典對象的Game對象,其中包含Tile對象。每個Tile對象都有一個Building對象,它可以是從一般Building對象繼承的幾個不同的類之一。

我很快就遇到了一個問題,我不能有建築物的建築物體內部的行動,我原計劃,因爲沒有辦法爲它直接操縱tilemap的(比如將某個建築物增加了更多的瓷磚比地圖正常,或者顯示它們是否具有某種資源)。所以我必須在Tilemap中放置一個switch語句和Building操作的方法。

現在我正在玩添加事件卡組。我想在Game類中有一個CardDeck類,然後CardDeck類將擁有一系列卡對象。遊戲會告訴CardDeck繪製一張新牌並執行該牌的動作。

問題當然是我如何獲得卡的動作來影響Tilemap或Game對象?由於封裝,他們彼此不知道任何事情。現在第一個想法是有一個switch語句,並將這些方法放入Game類中,但似乎這隻會讓它們影響Game對象的變量,或者發送消息到Tilemap來操縱它。如果我這樣做,反正每種類型的卡有不同的卡對象有什麼意義?

我知道這是一個基本的編程問題,但我無法弄清楚我腦中的邏輯。我真的很感謝這個幫助!謝謝!

回答

1

我有很多方法可以做到這一點,哪一個最好完全取決於你的具體問題。我會建議兩個:

第一個是完全跳出OOP。面向對象的編程完全是關於數據與功能的耦合,但在這種情況下,實際上沒有任何數據可言:一個Card只是一個應用於你的遊戲狀態的函數。您可以製作blocksNSArray,然後選擇一個隨機執行的函數。

typedef void (^EventCard)(NSArray* buildings, Map* map); 

EventCard earthQuake = [^ void { 
    //show an alertview saying its an earthquake so the user knows what is going on 

    //apply earthquake to the buildings and map 

} copy]; 

這樣做的缺點是,你可能最終會寫很多重複的代碼,並且不能輕鬆地添加新的事件卡片。

下一個解決方案與您現在擁有的類似,但更具可擴展性。您的Card類將成爲一組詞典,其鍵與您的建築物和地圖對象的屬性相對應,或者是applyEventCardMethod中邏輯的觸發器。您可以(也應該)從plist文件或JSON文本中讀取這些字典,這些文本被打開並用於製作Card的實例。所以你Card.h看起來像這樣

@interface Card : NSObject 

@property (strong) NSDictionary* attributesToAffect; 
@property (strong) NSArray* targetFilters; 

和地震的例子可能有@[@"all_buildings"] targetFilters和attributesToAffect將@{currHp: @-100},如果你的建築類有一個currHp屬性。 ApplyEventCard現在看起來是這樣

-(void) applyEventCard 
{ 
    //pick a random Event card 

    //get all targets based on the "targets" key 

    //loop through targets 
      //loop through the rest of the keys 

      NSInteger previousValue = [[currBuilding valueForKey: currKey] integerValue]; 
      NSInteger valueToApply = eventCardToApply.attributeDict[currAttribute]; 
       [currBuilding setValue: previousValue - valueToApply forKey: currKey]; 
} 

這種方法的優點是,它是非常容易增加新的卡,並沒有所需的代碼。然而,你可能會嚴重限制你的牌的效果。如果你的很多卡需要某種類型的定製邏輯,那麼可能沒有辦法避免一個怪異的開關語句。

+0

這非常有幫助。我很感激你爲我輸入了代碼示例。它幫助了很多東西去點擊!另一個想法是嘗試Visitor模式,其中Map對象接受EventCards作爲訪問者。我想知道這是否可能? – bazola