7

我正在使用以下代码onRoomConnected(int statusCode, Room room)来决定谁是第一个玩家。但有时我在两名球员中都获得第一/第二名。如何解决此错误。

        if (quickGame) {
            myTurn = room.getParticipants().get(0).getParticipantId().equals(myId);
        } else {
            myTurn = room.getCreatorId().equals(myId);
        }
        if (myTurn) {
            Log.e(TAG, "First Player");
            status.setText("Click a button to start");
        } else {
            Log.e(TAG, "Second Player");
            status.setText("Wait for opponent to start");
        }
4

4 回答 4

9

参与者 ID 的集合保证对房间里的每个人都是相同的(但不是在不同的比赛中)。但是,不能保证它们在列表中的顺序。因此,如果您想进行简单的选举(例如确定谁先走等),您必须依赖于参与者 ID 的集合,而不是按顺序。您可以做到这一点的一些方法是:

  1. 按字母顺序排列的参与者 ID 是第一个玩的玩家
  2. 按字母顺序排在第一位的参与者 ID 负责随机选择一名玩家首先开始。其他客户端将等待,直到参与者发送包含所选参与者 ID 的可靠实时消息。

方法 (2) 是首选,因为它不包含可能的偏差。

为什么?虽然我们没有指定参与者 ID 的结构(它只是一个字符串),但事实是它确实对信息进行了编码,所以如果您使用参与者 ID 作为规则,您最终可能会得到一个奇怪的谁分布先走。例如,您可能会发现某个特定玩家总是先走,但这是因为巧合的是,他们的参与者 ID 的生成方式总是会发生这种情况。因此,使用参与者 ID 来选举谁是随机决定谁先走的权威绝对是一个更好的主意,而不是谁实际上先走。

于 2013-09-30T19:14:26.427 回答
1

一种方法是跟踪参与者ID,因为它们是基于每个房间生成的。这就是我在我的 Android 代码中的做法

@Override
    public ArrayList<String> getActiveRoomPlayerIDs() {
        if(mRoomCurrent != null) {
            ArrayList<String> newList = new ArrayList<String>();

            for (Participant p : mRoomCurrent.getParticipants()) {

                dLog(listIgnoreTheseIDs.toString() + " is the list to ignore");
                if(mRoomCurrent.getParticipantStatus(p.getParticipantId())  == Participant.STATUS_LEFT) {
                    dLog(p.getParticipantId() + " left the room");
                } else {
                    newList.add(p.getParticipantId());
                }
            }
            return newList;
        }
        return null;
    }

我这样做的原因是,如果房间参与者在游戏过程中发生变化,我可以使用相同的方法来处理他们离开房间的问题。

onRoomConnected 为所有具有相同参与者数量的对手调用,该调用中的数量没有变化

在此处添加以进行编辑..在我的 libGDX 端,然后我执行此操作

private ArrayList<String> SortThisList(ArrayList<String> currentRoomIds) {
        Collections.sort(currentRoomIds);
        return currentRoomIds;
    }

然后我使用排序列表来确定玩家顺序......

于 2013-09-30T08:48:29.870 回答
1

如果没有其他重要的标准,您可以使用我的技术。房间形成完成后,只需选择按字母顺序最小的参与者 ID 作为服务器。

/**checks is this user is the alphabetically smallest participant id.
 * if so then the user is server.
 * @return if this user should be the server.
 */
private boolean isServer()
{
    for(Participant p : mParticipants )
    {
        if(p.getParticipantId().compareTo(mMyId)<0)
            return false;
    }
    return true;
}
于 2013-09-30T18:10:54.320 回答
-1

我会建议以下方法:

当设备 A 从 Google 收到关于房间已连接的响应时,请检查是否有其他参与者在场。如果不存在,则将设备 A 分配为播放器 1。

当设备 B 得到 Google 的响应时,它会发现除了自己之外还有另一个参与者。在这种情况下等待。

在设备 A 中,您将收到参与者已连接的通知,立即开始游戏并向设备 B 发送适当的消息。

于 2013-09-30T06:34:43.363 回答