2009-07-24 88 views
0

我的问题涉及2-4人可以玩的简单游戏。这是一款在iPhone/iPod touch上播放的游戏,因此不需要网络连接。当游戏开始时,用户将选择将玩的玩家人数。即时创建多个类实例

对于我需要创建的每个玩家和Player类的实例。我的问题是我如何编写代码,以便只有所需数量的类被创建,并且它们都被命名为不同。我想到了以下内容,但我知道这是行不通的。

假设我有一个名为“playerNames”的数组,存储玩家在游戏中的名字。

for (int i = 0; i < [playerNames count]; i++) { 

    Player *playeri = [[Player alloc] init]; 

    //other code 

} 

我不能只是把“我”在那里作为计数器的循环,并得到四个实例进行命名PLAYER1,player2等我该怎么办呢?

在此先感谢您的帮助。

回答

2

您无法即时创建变量实例 - 您需要一个集合来存储结果播放器。一个C数组或NSMutableArray可以很好地工作。您可以将此集合添加到您的控制器或视图中,让玩家可以通过游戏进行访问。

此外,您可能需要使用autorelease自动释放球员或可替换地释放集合中的项目在dealloc方法以避免内存泄漏。

下面是使用一个NSMutableArray,我已经假设你会添加到您的类接口(和初始化的地方,通常在viewDidLoad)一些代码

-(void) CreatePlayers:(int)playerCount 
{ 
    for(int i = 0; i < [playerNames count]; i++) 
    { 
     [playersArray insertObject:[[[Player alloc] init] autorelease] 
         atIndex:i]; 
    } 
} 
0

你叫不出名的变量编程这样。

然而,您可以创建这些对象并将它们添加到NSMutableArray,然后再调用它们。

如果您确实想将“PlayerN”名称与每个对象关联,请使用NSMutableDictionary。将播放器对象存储为键值@“PlayerN”(一个NSString)。

创建密钥可以做这样的:

NSString *key = [NSString stringWithFormat:@"Player%d", i]; 
0

这个最基本的解决办法是将玩家存储数组或字典(键控的玩家名称)。以数组方式:

// assume we have an NSArray property, players 
NSMutableArray *tempPlayers = [NSMutableArray arrayWithCapacity:[playerNames count]]; 
for (NSString *name in playerNames) { 
    Player *player = [[Player alloc] init]; 
    [tempPlayers addObject:player]; 
    [player release]; 
} 
self.players = tempPlayers; 

你可以通过调用objectAtIndex:现在访问来自players属性中的每个球员。

关于设计的一句话 - 首先,您是否考虑过将name属性添加到您的Player类中?这似乎是一个自然的地方来存储这些信息后,你已经捕获它。例如:

for (NSString *name in playerNames) { 
    // you might also have a designated initializer 
    // e.g. [[Player alloc] initWithName:name] 

    Player *player = [[Player alloc] init]; 
    player.name = name; 
    [tempPlayers addObject:player]; 
    [player release]; 
} 

总的来说,这是最简单的工作,是我现在要做的。但是,在未来...

在某些时候,你可能会发现自己引入某种Game类的代表您的用户创建的每个新游戏。这将是一个自然的地方来存储您的播放器阵列和将允许你建立一个更具凝聚力的接口,例如:

Game *newGame = [[Game alloc] init]; 
for(NSString *name) in playerNames) { 
    [newGame addPlayerNamed:name]; 
} 

Game类将封装的球员阵列和addPlayerNamed方法将封装过程创建一个新的Player并将其存储在该数组中,从而使您的控制器代码在过程中变得更简单(并且意图显示)。

的这另一个好处是它给你能够在你的应用程序访问这些数据,而不是它在这个特定的控制器捆绑的方式。你可以实现某种类似单身的访问“currentGame”。所以,现在

Game *newGame = [[Game alloc init]; 
.. // configure game as above 
[Game setCurrentGame:newGame]; 

,每当你需要访问当前游戏(或播放器)的信息:当然不是一个真正的单身人士,但像这样将工作做好

// in some other controller 
Game *currentGame = [Game currentGame]; 
for(Player *player in currentGame.players) { 
    // etc... 
}