我有一个1v1游戏,我正在更新到3名玩家(最终4名),当用户与2名电脑玩家玩游戏时,我遇到了玩家跟踪的问题。
我有一个游戏NSObject,处理所有主要的游戏代码,也控制电脑玩家的动作。在过去,我在Game.h(用户和对手)中有2个属性,现在我有3个(用户,对手,对手)。声明如下:
@property (retain) Player *user;
当我需要使用控制电脑玩家动作的方法时,问题就出现了。举个例子,当电脑玩家需要叫牌时,它必须知道对方的叫牌和其他一些信息。旧代码的一个片段是:
- (void)computerBiddingObjects {
// ... other stuff
if (_opponentPoints == 110 && _userPoints >= 90 && _userDidBid != YES) {
bid = bidTwenty;
} else if (_opponentPoints == 115 && _userPoints >= 90 && _userDidBid != YES) {
bid = bidTwentyFive;
}
// ... other stuff
}
为了获取对手玩家的信息,我想到在player .h中添加2个新属性,以便追踪每个玩家的对手(对手1和对手2)。我的问题是,如果我设置每个播放器的属性如下:
_opponent.opponent = _user;
_opponent.opponent2 = _opponent2;
我可以在两个上下文中引用它们和/或设置它们的单独属性吗?如果给定上面的条件,这些语句是否相等?
_opponent.opponent.didBid = YES;
_user.didBid = YES;
另外,我可以像这个新版本的投标代码片段一样访问播放器对象属性吗?
- (void)computerBiddingObjectsForOpponent:(Player *)opponent {
// ... other stuff
if (opponent.points == 110 && self.currentBid < bidTwenty && ((opponent.opponent1.points >= 90 && opponent.opponent1.didBid != YES) || (opponent.opponent2.points >= 90 && opponent.opponent2.didBid != YES))) {
bid = bidTwenty;
} else if (opponent.points == 115 && self.currentBid < bidTwentyFive && ((opponent.opponent1.points >= 90 && opponent.opponent1.didBid != YES) || (opponent.opponent2.points >= 90 && opponent.opponent2.didBid != YES))) {
bid = bidTwentyFive;
}
// ... other stuff
opponent.bid = bid.
}
我是不是离题太远了?有更简单的方法吗?
这确实是等价的。
但是…
didBid
也将被其他玩家设置(因为它们持有相同的引用,覆盖每个玩家设置的内容)。您正在创建一个保留循环,您可能需要手动打破(或将对手属性设置为
weak
)。如果每个玩家都为每个对手保留一个"策略"对象,并且该策略将具有对玩家的引用,这可能是最好的。这样,每个玩家可能有不同的策略来对付其他玩家。