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 的正确方法是什么,没有中央实例来决定这一点。参与者列表中是否有我在调试器中找不到的有用数据?

4

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 );
于 2013-06-17T13:49:00.040 回答
1

这是从一堆无组织的节点中选择领导者的标准问题。我敢肯定,有一些相当先进的方法可以做到这一点。如果您想查看:自动选择节点集群中的领导者和 hte Paxos 算法。

现在...话虽这么说,因为你有 4 人的限制,所以有更简单的方法来做到这一点。您可以将他们的 ID 视为一个数字,拥有最高 ID 的人是玩家 1,并按降序排列。这可能是最简单的方法。

您还可以让所有玩家提交随机掷骰并进行广播。在极其罕见的重复情况下,您可以重新掷骰。一旦每个人都完成了他们的掷骰,并且每个人都拥有相同的数据,每个单独的客户都可以根据掷骰的价值来确定玩家顺序。

但是,我不会做任何与数组中的顺序相关的事情。我不相信在任何情况下都可以保证。

于 2013-06-19T06:08:47.263 回答