gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 22:04:10 25 4
gpt4 key购买 nike

我正在做一个Google Play 服务实时多人游戏,我希望所有客户端在游戏开始前都有一个共享种子(用于初始化“随机”游戏状态时的确定性)。

我正计划使用 Room.getCreationTimestamp然而,经过测试,并非所有玩家都获得相同的值(value)。同样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 是如何生成的情况下,我怀疑采用前缀是否安全。

编辑:我尝试使用“创建者”作为权限,每个节点都可以向创建者询问种子。不幸的是,在我的双节点测试用例中,每个节点都认为自己是创建者。

最佳答案

我有同样的问题要解决。跟随那个视频给了我正确的指示。如视频中所述,解决方案是对参与者数组进行排序,我们假设最低的 participantId 有权选择随机种子。这是我解决问题的方法:

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;
}

}

关于android - Google Play 服务实时多人游戏的共享种子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30086773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com