2012-05-09 27 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在本地計算/決定。 –