通过 Google Play 游戏服务决定回合制游戏中的玩家一和玩家二。

8

我有一个基于轮次的Android多人游戏,之前一直使用XMPP协议运行,现在我想转换到Google Play游戏服务。在旧版本中,有一个XMPP机器人来决定哪个玩家将成为玩家1或2。这很重要,以确定哪个玩家应该先走。

通过Google Play游戏服务,我找到了一个几乎可用的解决方案:

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

当邀请另一个玩家时,这种方式运行良好。然而,当两个玩家选择自动匹配时,它经常失败。在这种情况下,两个玩家在参与者ArrayList中处于相同的位置。因此,在他们当前使用的设备上,他们将都出现为同一玩家。

没有中央实例来决定选手1和2的正确方法是什么?在参与者列表中是否有任何有用的数据我没有通过调试器找到?

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

啊,我没意识到参与者ID是随机的。这解决了我的问题 :) - Ulrich Scheller
1
参与者ID并非完全随机:https://www.youtube.com/watch?v=yIY1zsZ2yCU - janst

1
这是从一堆无组织的节点中选择领导者的标准问题。我相信有一些相当先进的方法可以解决它。如果您想了解,请查看:在节点集群中自动选择领导者和 Paxos 算法。
现在...话虽如此,由于您只有4个人的限制,有更简单的方法可以做到。您可以将他们的 ID 视为数字,谁拥有最高的 ID 就是玩家1,按顺序递减。那可能是最简单的方法。
您还可以让所有玩家提交一个随机掷骰子并广播它。在极少数情况下出现重复,您可以进行重新投掷。一旦每个人都做出了他们的投掷,并且每个人都有相同的数据,每个单独的客户端都可以根据投掷的值确定玩家顺序。
但是我不会做与数组顺序相关的任何事情。我不认为这在任何情况下都是有保障的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接