2

私はターンベースのゲームをしています...転送される情報は、プレーヤーのスコアとターンが送信されたかどうかだけです。

次のプレイヤーがターンを受け取ったとき。データは「scoreToBeat」とturnSent=1に保存されます。その後、プレイヤーは順番を取ります。その後、turnSent = 1であるため、ゲーム終了が呼び出されます。http://www.raywenderlich.com/5480/beginning-turn-based-gaming-with-ios-5-part-1でRayWenderlichによるターンベースのチュートリアルを使用しました。

彼の場合、ゲームは終了し、引き分けになります。このように…負けた人を見せることができないようです。

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

それを失った人が常に勝利を示していることを示すことができないようです。これは私の最近の多くの試みです...試合でちょうど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;
               }

           }
4

2 に答える 2

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;
    }

設計上、両方のデバイスで「勝ち」と表示されることに注意してください。

1つは下に「Won」が付いた「Me」と言い、もう1つは下に「Won」が付いた「(WinnersName)」と言います。

于 2012-05-22T22:18:46.193 に答える
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を使い続けるためにできる1つの間違いは、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];
           }

       } ];
}
于 2012-05-09T20:17:10.823 に答える