【问题标题】:How to decide who is the first player when user plays quick game?当用户玩快游戏时,如何决定谁是第一个玩家?
【发布时间】:2013-10-05 21:54:52
【问题描述】:

我在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");
        }

【问题讨论】:

    标签: google-play-games


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 关于参与者ID 生成的非常好的信息,应该放在文档的某个地方。
    【解决方案2】:

    一种方法是跟踪参与者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;
        }
    

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

    【讨论】:

      【解决方案3】:

      如果没有其他重要的标准,您可以使用我的技术。房间形成完成后,只需选择按字母顺序最小的参与者 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;
      }
      

      【讨论】:

        【解决方案4】:

        我建议以下方法:

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

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

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

        【讨论】:

        • 我在决定谁是 A 谁是 B 时遇到了麻烦。
        • onRoomConnected() 是房间准备就绪的所有玩家的最终调用...相同的信息传递给所有玩家,所以这不是一个可行的方法
        猜你喜欢
        • 2015-01-24
        • 1970-01-01
        • 1970-01-01
        • 2014-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-14
        • 1970-01-01
        相关资源
        最近更新 更多