2013-06-16 8 views
8

Android用のラウンドベースのマルチプレイヤーゲームが以前XMPPで動作していましたが、Google Playゲームサービスに切り替える必要があります。古いバージョンでは、XMPPボットがあり、どのプレイヤーがプレイヤー1または2になるかを決定しました。これは、どのプレイヤーが最初に動くべきかを知るために重要です。他のプレイヤーを招待するときGoogle Playゲームサービスのラウンドベースのゲームでプレイヤー1と2を決定する

@Override 
public void onRoomConnected(int statusCode, Room room) { 
    ArrayList<Participant> participants = room.getParticipants(); 
    Participant first = participants.get(0); 
    if (first.getPlayer() == null || !first.getPlayer().getPlayerId().equals(myPlayerId)) { 
     LaskaField.HUMAN_PLAYER = 2; 
     LaskaField.OTHER_PLAYER = 1; 
     opponent = first.getDisplayName(); 
    } else { 
     LaskaField.HUMAN_PLAYER = 1; 
     LaskaField.OTHER_PLAYER = 2; 
     opponent = participants.get(1).getDisplayName(); 
    } 
    setPlayerNames(); 
} 

この方法では正常に動作します:Google Playのゲームサービスで

は、私はほとんど機能するソリューションを見つけました。ただし、両方のプレーヤーが自動マッチングを選択すると、しばしば失敗します。この場合、両方のプレイヤーは参加者のArrayListの同じ位置にいます。したがって、両方とも現在使用されている端末に同じプレーヤーとして表示されます。

プレイヤー1とプレイヤー2を選択する正しい方法は、これを決定するためのセントラルインスタンスがないことです。参加者リストにデバッガで見つけられなかった有用なデータはありますか?

答えて

5

私は(各ゲームのためにランダムである)プレイヤーIDを比較することによって、問題を解決しています

String myid = mActiveRoom.getParticipantId(client.getCurrentPlayerId()); 
String remoteId = null; 

ArrayList<String> ids = mActiveRoom.getParticipantIds(); 
for(int i=0; i<ids.size(); i++) 
{ 
    String test = ids.get(i); 
    if(!test.equals(myid)) 
    { 
     remoteId = test; 
     break; 
    } 
} 

boolean iMakeTheFirstMove = (myid.compareTo(remoteId) > 0); 
+0

ああ、私はparticipantIdsがランダムであることを認識しませんでした。それは私の問題を解決します:) –

+1

参加者IDは完全にランダムではありません:https://www.youtube.com/watch?v=yIY1zsZ2yCU – janst

+1

クライアントは何ですか? –

1

これは組織化されていないノードの束からリーダーを選ぶの標準問題です。かなり先進的な方法がありますが、私は確信しています。あなたがチェックアウトしたい場合:Automatic selection of a leader in a cluster of nodesとhte Paxosアルゴリズム。

今、あなたには4人の制限があるので、それは簡単なやり方です。あなたは自分のIDを数字として扱うことができ、最も高いIDを持つ人はプレーヤー1であり、降順で順番に扱うことができます。それはおそらく最も簡単な方法でしょう。

また、すべてのプレイヤーにランダムロールを提出させ、ブロードキャストすることもできます。ごくまれに重複している場合は、リロールすることができます。誰もが自分のロールを作って、誰もが同じデータを持っていると、それぞれのクライアントはロールの値に基づいてプレイヤーの順序を決定できます。

しかし、私は配列の順序に関連する何もしません。私はそれがどんな状況でも保証されているとは思わない。

関連する問題