将事件卡添加到模拟游戏Objective-C中



我正在为iOS开发一款游戏,你可以在每个回合的地图上放置建筑物,然后在回合结束时,它根据放置的建筑物类型和地形类型来处理经济。

我想在游戏中添加一副活动卡片。每回合从一副牌中抽取一张事件牌,这可能会影响瓷砖本身、建筑或玩家迄今为止积累的资源总值。

就类层次结构而言,我在顶部有一个Game对象,它包含一个Tilemap字典对象,该对象包含Tile对象。每个Tile对象都有一个Building对象,它可以是从常规Building对象继承的几个不同类之一。

我很快就遇到了一个问题,我不能像最初计划的那样在Building对象中执行Building的操作,因为它无法直接操作Tilemap(比如放置某个建筑会向地图添加比正常情况更多的瓷砖,或者显示它们是否有某个资源)。所以我不得不在Tilemap中放置一个switch语句和Building操作的方法。

现在我在玩添加一副活动卡片的游戏。我想在Game类中有一个CardDeck类,然后CardDeck将在里面有一组卡片对象。游戏会告诉CardDeck抽一张新卡并执行该卡的动作。

当然,问题是如何让牌的动作影响Tilemap或Game对象?由于封装,他们对彼此一无所知。现在,第一个想法是有一个switch语句,并将方法放入Game类中。。但这似乎只会让他们影响Game对象的变量,或者向Tilemap发送消息来操纵它。如果我这样做,那么为每种类型的卡设置不同的Card对象有什么意义?

我知道这是一个基本的编程问题,但我无法计算出我大脑中的逻辑。我真的很感谢在这方面的帮助!非常感谢。

我可以想出很多方法来做到这一点,哪种方法最好完全取决于您的具体问题。我建议两个:

第一个是完全跳出OOP。面向对象编程就是将数据与功能相耦合,但在这种情况下,实际上没有任何数据可言:Card只是应用于游戏状态的函数。您可以将blocks制作为NSArray,并随机选择一个要执行的函数。

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中逻辑的触发器。您可以(也应该)从打开并用于创建Card实例的plist文件或JSON文本中读取这些字典。所以你的Card.h看起来像这个

@interface Card : NSObject
@property (strong) NSDictionary* attributesToAffect;
@property (strong) NSArray* targetFilters;

如果您的建筑类具有currHp属性,那么地震示例的targetFilters可能为@[@"all_buildings"],attributesToEffect则为@{currHp: @-100}。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];
}

这种方法的优点是添加新卡非常容易,而且不需要任何代码。然而,你的牌可能会受到严重的限制。如果你的很多卡需要某种自定义逻辑,那么可能无法避免出现可怕的切换语句。

最新更新