我正在开发一款回合制纸牌游戏。主循环很简单,我有这个结构(它非常简化为简短):
while (!gameEnded) {
for (Player *pl in players) {
Action *a = [pl askForAction];
self [manageAction];
}
if (some condition...) {
gameEnded = TRUE;
}
}
如果所有玩家都是电脑玩家没有问题但是如果我想拥有一个人类玩家,那么askForAction方法应该“暂停”循环并让玩家选择动作(按下按钮或触摸卡片......) 。)
我该怎么做?我一直在“谷歌搜索”它,但我找不到任何东西。我想解决方案应该是使用NSThread(或NSRunLoop可能......),但我找不到方法。任何人都可以帮助我吗?
提前谢谢
答案 0 :(得分:3)
就像亚当所说,事件驱动的模型可能是最好的。但是,我只想强调解决这个问题是多么简单,而且不需要NSThread
或NSRunLoop
之类的东西。
当你到达一个人类玩家时,你只是停止迭代,然后一旦你从他们那里得到一个动作就再次开始迭代:
- (void)nextTurn
while (!gameEnded) {
Player *pl = [self nextPlayer];
if (pl.isHuman) {
break;
} else {
Action *a = [pl getActionFromComputer];
[self manageAction:a];
}
}
if (gameEnded) {
// game over
} else {
// Set up your UI so it can get an action from the player.
// Your UI should be set up so that once it gets an action,
// it does [self manageAction:uiAction] then [self nextTurn]
}
}
答案 1 :(得分:3)
我会这样做(可能有更好的答案)是使用事件驱动的模型而不是在循环中运行。
在委托(或任何地方),跟踪当前玩家(玩家阵列的索引)。致电[[players objectAtIndex:currentPlayer] askForActionWithDelegate:self];
在代表中,有一个接收者(您可以使用manageAction
),当用户执行了该操作时,请致电manageAction
。在manageAction中,检查胜利条件并提前currentPlayer
。
答案 2 :(得分:0)
抱歉延误。我已经应用了这种方法,这就是我想要的。我的方式如下:
- (void)consumeTurn:(int)idPlayer {
if (![gameEnded]) {
Player *p = [getPlayer:idPlayer];
if (![p isHuman]) {
/** Do some stuff **/
consumeTurn:[getNextPlayer];
} else {
/** Show UIView with buttons for human player interaction **/
}
} else {
/** Game is ended... **/
}
}
然后在每个按钮中,与每个按钮关联的操作是:
- (IBAction)playerAction {
/** Do some stuff **/
consumeTurn:[getNextPlayer];
}
我在我的主要ViewController(viewDidLoad)中调用“consumeTurn”方法。
感谢大家的帮助