我在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");
}
答案 0 :(得分:9)
参与者ID的集合保证与房间中的每个人相同(但不能跨越不同的匹配)。但是,无法保证列表中的订单。因此,如果您想进行简单的选举(例如,确定谁先行等),您必须依赖于参与者ID的集合,但不能依赖于顺序。您可以通过以下方式实现以下目标:
方法(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发送相应的消息。