2010-09-28 54 views
0

我正在创建一个简单的应用程序,其中有一个角色列表和一个(4)玩家列表,玩家仅仅是对可玩角色的引用。用目标C轮到处理玩家

我卡在如何做到以下几点:

  1. 做一个参考当前的播放器上转
  2. 找出谁在转弯未来的球员是
  3. 处理的最后一个球员,所以它会在回合中返回到第一位玩家。

理想情况下,我想能够做之后,首先,前年上的NSMutableArray命令,这些我能做到lastObject,但没有firstObject,afterObject等

我相信你可以使用objectAtIndex伪造BEFORE,AFTER,FIRST命令;但理想情况下,我不想依赖数字引用,因为它可能是不正确的 - 也如果它是可变的,大小会一直改变。

通常,我将能够在伪代码中执行以下操作。

Global player_on_turn.player = Null //player_on_turn is a pointer to the player object 

; Handle next player on turn 
If (player_on_turn.player = Null) Then Error("No player on turn assigned") 
If (sizeOf[playerList]==0) Then Error("There are no players in the game") 
If After player_on_turn = null Then 
    ; We reset it 
    player_on_turn.player = First player 
Else 
    ; Move to the next player on turn 
    player_on_turn.player = After player_on_turn.player 
End If 

考虑到这一点,在上面1-2-3的例子中描述的帮助处理转身球员的最佳策略是什么。

感谢

回答

1

它可能不会不管你使用的是什么数据结构 - 在一定程度上,你将不得不依赖数字索引(除非使用链接列表)。这是没问题的。如果你不想在主游戏实现中使用它,那也可以。只需创建一个封装这些东西的类。首先想想你需要它支持的操作。在这里,我的猜测是那些:

- (PlayerObject *) currentPlayer; 
- (void) startNextTurn; 

如果你有这个,你可以使用这些原语写你的游戏而发愁如何最好地实现以后。您可以随时更改这些内容而不会破坏您的实际游戏。

我的建议是这样的:

- (PlayerObject *) currentPlayer; { 
    return [players objectAtIndex: currentPlayerIndex]; 
} 

- (void) startNextTurn; { 
    ++currentPlayerIndex; 
    if (currentPlayerIndex >= [players count]) { 
     currentPlayerIndex = 0; 
    } 
} 

使用指标有OK,即使数组是可变的。如果您有更改player阵列的方法,则他们也可以对currentPlayerIndex进行必要的更改。

有了这个对象可以很容易地编写单元测试。您在伪代码中建议的全局变量使得不可能编写有意义的单元测试。

+0

是的,我认为这将是一个更好的方法 - 我真的不想走上学习状态模式或更复杂的东西,看起来很直观的东西。 – zardon 2010-09-29 07:38:58