2012-05-09 26 views
1

我正在做一个基于回合的游戏...传输的唯一信息是玩家的分数以及是否已发送回合。游戏中心成果发布

当下一个玩家收到回合。数据被存储到“scoreToBeat”并且turnSent = 1。玩家然后轮到他们。之后游戏结束被称为turnSent = 1。我使用了Ray Wenderlich的基于回合的教程http://www.raywenderlich.com/5480/beginning-turn-based-gaming-with-ios-5-part-1

在他的情况下,游戏结束,并且是一条领带。像这样...我似乎无法让它显示失去的人。

for (GKTurnBasedParticipant *part in currentMatch.participants) {   
      part.matchOutcome = GKTurnBasedMatchOutcomeTied; 
      } 

我似乎无法让它显示失去它的人总是表现出胜利。这是我许多人的最新尝试......在比赛btw中恰好有2名球员......任何想法都将不胜感激。

for (GKTurnBasedParticipant *part in currentMatch.participants) {   
      if(part==currentMatch.currentParticipant) 
      { 
       if(points>scoreToBeat) 
       { 
        part.matchOutcome=GKTurnBasedMatchOutcomeWon; 
       } 
       else { 
        part.matchOutcome=GKTurnBasedMatchOutcomeLost; 
       } 
      } 
      else { 
       if(points>scoreToBeat) 
       { 
        part.matchOutcome=GKTurnBasedMatchOutcomeLost; 
       } 
       else { 
        part.matchOutcome=GKTurnBasedMatchOutcomeWon; 
       } 

      } 

回答

2

这是我最新的项目的摘录,适合2人游戏。它在sendTurn过程中被调用,当游戏决定结束时。在我看来,这比前一个答案(第一个代码块)更正确,因为在结束游戏之前,您必须为所有参与者设置matchOutcome。

如果您有超过2名选手,那么您必须遍历所有参与者并相应地设置matchOutcome。

GKTurnBasedParticipant *curr = currentMatch.currentParticipant; 
    NSUInteger currentIndex = [currentMatch.participants indexOfObject:currentMatch.currentParticipant]; 
    NSUInteger nextIndex = (currentIndex + 1) % [currentMatch.participants count]; 
    GKTurnBasedParticipant *next = [currentMatch.participants objectAtIndex:nextIndex]; 

    if (currScore < otherScore) 
    { 
     // Curr player lost 
     curr.matchOutcome = GKTurnBasedMatchOutcomeLost; 
     next.matchOutcome = GKTurnBasedMatchOutcomeWon; 
    } 
    else if (currScore == otherScore) 
    { 
     // Tied 
     curr.matchOutcome = GKTurnBasedMatchOutcomeTied; 
     next.matchOutcome = GKTurnBasedMatchOutcomeTied; 
    } 
    else 
    { 
     // Won 
     curr.matchOutcome = GKTurnBasedMatchOutcomeWon; 
     next.matchOutcome = GKTurnBasedMatchOutcomeLost; 
    } 

请注意,您将在两个设备上看到“Won”设计。

一个会在下面说“我”与“Won”,另一个会在下面说“(赢家名字)”和“Won”。

2

积分是设备上得分的本地积分吗?如果是这样,我会做以下事情:

if([part.playerID isEqualToString [GKLocalPlayer localPlayer].playerID]]) { 

if(points>scoreToBeat) { 

part.matchOutcome = GKTurnBasedMatchOutComeWon; 

} else { 

part.matchOutcome = GKTurnBasedMatchOutComeLost; 

} 

} else { 
    if(points>scoreToBeat) { 
       part.matchOutcome=GKTurnBasedMatchOutcomeLost; 
      } else { 
       part.matchOutcome=GKTurnBasedMatchOutcomeWon; 
      } 

     } 
} 

此外,请记住使用NSLog查看是否实际转移打分。继续使用currentTurnBasedMatch.matchData可能会导致一个错误,您应该将currentTurnBasedMatch设置为在委托方法中返回的GKTurnBasedMatch。

编辑:一个代码剪断我使用看起来像这样

if([participant.playerID isEqualToString:[GKLocalPlayer localPlayer].playerID]){ 
     NSLog(@"we are the last player in the game -end the game"); 
     for (GKTurnBasedParticipant *part in match.participants) { 

      part.matchOutcome = GKTurnBasedMatchOutcomeTied; 
     } 
     [match endMatchInTurnWithMatchData:match.matchData completionHandler:^(NSError *error) { 
      if ([AppDelegate mainMenuController].multiGameMenu.turnBasedMenu !=nil) { 

       [[AppDelegate mainMenuController].multiGameMenu.turnBasedMenu reloadTableView]; 
      } 

     } ]; 
} 
+0

我已经把NSLog的无处不在...它通过逻辑正确,例如说玩家应该输。在这部分之后,我不会对匹配数据做任何事情...只需使用[currentMatch endMatchInTurnWithMatchData:data completionHandler:^(NSError * error){ 如果(error){ NSLog(@“%@”,error) ; } }];也许这就是问题所在。 –

+0

+0

所以,为了确保在结束比赛之前调用给定的方法?因为每位球员在比赛结束前都应该有比赛结果。你也许可以尝试为每个玩家设置matchOutcome为GKTurnBasedMatchOutcomeLost,然后看看它是否有效(如果它不是真的很奇怪)。至于我的应用程序,我将结果设置为GKTurnBasedMatchOutcomeTied,因为我使用用于显示游戏的自定义表格视图,所以游戏结果只是使用matchData在本地计算/决定。 –