当用户玩快速游戏时,如何决定谁是第一个玩家?

时间:2013-09-30 06:02:58

标签: google-play-games

我在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 个答案:

答案 0 :(得分:9)

参与者ID的集合保证与房间中的每个人相同(但不能跨越不同的匹配)。但是,无法保证列表中的订单。因此,如果您想进行简单的选举(例如,确定谁先行等),您必须依赖于参与者ID的集合,但不能依赖于顺序。您可以通过以下方式实现以下目标:

  1. 首先按字母顺序排列的参与者ID是第一个玩
  2. 的玩家
  3. 首先按字母顺序排列的参与者ID负责随机选择玩家先启动。其他客户端将等到参与者发送包含所选参与者ID的可靠实时消息。
  4. 方法(2)是首选,因为它不包含可能的偏差。

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

答案 1 :(得分: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;
    }

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

答案 2 :(得分: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;
}

答案 3 :(得分:-1)

我建议采用以下方法:

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

当设备B收到Google的回复时,会发现除此之外还有其他参与者。在这种情况下等待。

在设备A中,您将收到参与者已连接的通知,立即启动游戏并向设备B发送相应的消息。