1

我有一个 1v1 游戏,我正在更新为 3 名玩家(最终是 4 名玩家),当用户与 2 名电脑玩家对战时,我遇到了玩家跟踪问题。

我有一个 Game NSObject,它处理游戏的所有主要代码,还控制计算机玩家的动作。过去,我对 Game.h 中的 2 个属性(用户和对手)很好,现在我有 3 个(用户、对手、对手2)。声明如下:

@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)。我的问题是,如果我为每个 Player 设置属性,如下所示:

_opponent.opponent = _user;
_opponent.opponent2 = _opponent2;

我可以在这两种情况下引用它们和/或设置它们的单独属性吗?鉴于上述情况,这些陈述是否等效:

_opponent.opponent.didBid = YES;
_user.didBid = YES;

另外,我可以像这个新版本的出价代码片段一样访问 Player 对象属性吗?

- (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.
}

我是否偏离了基地/偏离轨道?有没有更简单的方法来做到这一点?

4

1 回答 1

1

这确实是等价的。

但 ...

didBid也将由其他玩家设置(因为他们持有对该玩家的相同引用,覆盖每个玩家设置的内容。

您正在创建一个可能需要手动中断的保留循环(或将对手属性设置为weak)。

最好每个玩家都为每个对手保留一个“策略”对象,并且该策略将引用玩家。这样,每个玩家可能对任何其他玩家有不同的策略。

于 2013-04-24T03:22:31.923 回答