在一个NSObject中添加@property作为指向另一个NSObject中的@property的指针



我有一个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)。

如果每个玩家都为每个对手保留一个"策略"对象,并且该策略将具有对玩家的引用,这可能是最好的。这样,每个玩家可能有不同的策略来对付其他玩家。

相关内容

最新更新