【发布时间】:2015-07-17 04:22:30
【问题描述】:
我正在做一个 Google Play Services 实时多人游戏,我希望所有客户端在游戏开始前都有一个共享种子(用于初始化“随机”游戏状态时的确定性)。
我计划使用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 是如何生成的情况下,我怀疑使用前缀是否安全。
编辑:我尝试使用“创建者”作为权限,每个节点都可以向创建者请求种子。不幸的是,在我的两个节点测试用例中,每个节点都认为它是创建者。
【问题讨论】:
-
我完全不熟悉这个话题,但阅读文档让我想知道房间“变体”是否有用; developer.android.com/reference/com/google/android/gms/games/….
-
有点——我可以将变体设置为种子,但只有具有相同变体的其他玩家才能加入该游戏。理想情况下,我会在不限制谁可以加入的情况下开始有 N 个可用玩家的游戏。不过感谢您的建议!
-
Room.Id 怎么样 - 我相信所有玩家都一样。你能得到它的hashcode吗?
-
@ClaytonWilkinson 房间 ID 有一个共同的前缀,但并不相同。我想我可以在 N 个字符之后将其切碎并交叉手指。 (: