2013-06-16 4 views
8

Mam opartą na rundach grę wieloosobową dla systemu Android, która wcześniej pracowała nad XMPP i chcę przejść na Usługi gier Google Play. W starej wersji był bot XMPP, decydujący o tym, który gracz będzie graczem 1 lub 2. Ważne jest, aby wiedzieć, który gracz powinien wykonać pierwszy ruch.Decydowanie o tym, kto jest graczem pierwszym i drugim w rozgrywce opartej na rundzie z usługami gier Google Play.

Z Google Play Game Services, znalazłem rozwiązanie, które prawie działa:

@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(); 
} 

ten sposób działa dobrze, kiedy zaprosić innego gracza. Jednak często kończy się niepowodzeniem, gdy obaj gracze wybierają autodopasowanie. W tym przypadku obaj gracze są na tej samej pozycji w uczestnikach ArrayList. W związku z tym oba będą wyglądać jak ten sam odtwarzacz na aktualnie używanym urządzeniu.

Jaki jest właściwy sposób wybierania gracza 1 i 2, bez centralnej instancji decydującej o tym. Czy na liście uczestników znajdują się przydatne dane, których nie znalazłem w debugerze?

Odpowiedz

5

Mam rozwiązać ten problem przez porównanie identyfikatorów Player (które są losowo dla każdej gry):

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

Ah, nie rozpoznałem, że dane uczestników są losowe. To rozwiązuje mój problem :) –

+1

Identyfikatory uczestników nie są całkowicie losowe: https://www.youtube.com/watch?v=yIY1zsZ2yCU – janst

+1

co to jest klient? –

1

Jest to standardowy problem wyboru lidera z bandą niezorganizowanych węzłów. Sądzę, że jest dość zaawansowany sposób, aby to zrobić. Jeśli chcesz sprawdzić: Automatic selection of a leader in a cluster of nodes i algorytm Paxos.

Teraz ... to jest powiedziane, ponieważ masz limit 4 osób, są łatwiejsze sposoby na to. Możesz po prostu traktować swoje identyfikatory jako liczbę, a kto kiedykolwiek ma najwyższy identyfikator, to gracz 1 i malejący w kolejności. To prawdopodobnie byłby najprostszy sposób.

Możesz również poprosić wszystkich graczy o przesłanie losowej rolki i rzucenie jej na szeroką skalę. W bardzo rzadkim przypadku duplikatu możesz mieć reroll. Po wykonaniu wszystkich rzutów, a każdy ma te same dane, każdy klient może określić kolejność graczy na podstawie wartości rzutów.

Nie zrobiłbym jednak niczego związanego z zamówieniem w tablicy. Nie wierzę, że jest to gwarantowane w każdych okolicznościach.