Google Play服务实时多人游戏的共享种子?

3
我正在开发一个使用Google Play服务实时多人游戏,在游戏开始前希望所有客户端都有一个共享的种子(用于初始化“随机”的游戏状态,以保证确定性)。
我原本计划使用Room.getCreationTimestamp,但测试后并不是所有玩家都收到相同的值。同样Room.getCreatorId也不能保证自动匹配对等方拥有相同的值。
有一个视频Google Play Games: Choosing a specific user建议同伴可以选择一个同伴(例如从排序列表中的第一个)来选举做出决策。如果在最大玩家数量加入之前游戏开始,则可能会导致此方法失效,并且新玩家加入活动游戏时可能会对谁是老板产生分歧。我已经草拟了一些临时解决方案,并查看了一些共识和领导者选举算法,但不用说这很棘手。

你是否知道一种更简单/更安全的生成共享种子的方法?

编辑:这里是两个不同连接设备中与房间相关的值:

Room.getRoomId():    
1. ChoKCQj-99-X_xEQAhABGAAg____________ARDhp87Gh-73-Uk
2. ChoKCQj-99-X_xEQAhABGAAg____________ARC7oOT7-oKouRI

Room.getCreationTimestamp():
1. 1431018058986
2. 1431018047097

Room.getCreatorId():
1. p_COGnzsaH7vf5SRAB
2. p_CLug5Pv6gqi5EhAB

Room.getDescription() 在两种情况下都返回 null

关于 RoomId 的建议有一些前途,但是如果不知道如何生成 id,我对采用前缀的安全性持怀疑态度。

编辑:我尝试使用 "creator" 作为权限,每个节点都可以向创建者请求种子。不幸的是,在我的两个节点测试中,每个节点都认为自己是创建者。


我对这个主题完全不熟悉,但阅读文档让我想知道房间“variant”是否有任何用处;http://developer.android.com/reference/com/google/android/gms/games/multiplayer/realtime/RoomConfig.Builder.html#setVariant(int)。 - harism
有点像——我可以将变量设置为种子,但那样只有具有相同变量的其他玩家才能加入该游戏。理想情况下,我希望启动一个有N个可用玩家的游戏,而不限制谁可以加入。不过还是感谢您的建议! - Darrell
房间ID怎么样 - 我相信对于所有玩家来说都是一样的。你可以获取它的哈希码吗? - Clayton Wilkinson
@ClaytonWilkinson 房间 id 具有共同的前缀但不相同。我想我可以在第 N 个字符后截断它,然后祈祷好运。 (: - Darrell
1个回答

3

我也遇到了同样的问题。按照那个视频所说的去做给了我正确的指示。视频中描述的解决方案是对参与者数组进行排序, 假设最低的参与者ID可以选择随机种子。这里是我如何解决这个问题的方法:

private boolean amItheKing() {

    int numberOfParticipants = participants.size();
    String[] participantIds = new String[numberOfParticipants];

    for (int i = 0; i < numberOfParticipants; i++) {
        participantIds[i] = participants.get(i).getParticipantId();
    }

    Arrays.sort(participantIds);

    return (participantIds[0].equals(myId));//the first in the list decide and broadcast the seed
}

然后在正确的位置使用它:

public void onActivityResult(int requestCode, int responseCode, Intent intent) {



    switch (requestCode) {

    case RC_WAITING_ROOM:
        // we got the result from the "waiting room" UI.
        if (responseCode == Activity.RESULT_OK) {
            // ready to start playing
            Gdx.app.debug(TAG, "Ready to start the game (waiting room returned OK).");
            if (amItheKing()) {
                int seed = generateSeed();
                broadcastSeed(seed);
                prepareForStart(seed);
            }
        } else if (responseCode == GamesActivityResultCodes.RESULT_LEFT_ROOM) {
            // player indicated that they want to leave the room
            leaveRoom();
        } else if (responseCode == Activity.RESULT_CANCELED) {
            // Dialog was cancelled (user pressed back key, for instance). In our game,
            // this means leaving the room too. In more elaborate games, this could mean
            // something else (like minimizing the waiting room UI).
            leaveRoom();
        }


        break;
    }

}

谢谢,我正在看类似的东西。我的担忧是如果我让一个4人游戏提前开始(只有2个人加入),那么就会出现一种情况,即第三个(和/或)第四个玩家加入,以至于一个节点认为游戏是从2个人开始的,而另一个节点则认为游戏是从3或4个人开始的,因此可能对谁是王有不同的想法。 - Darrell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接