3

我正在使用 Google App Engine 构建网页游戏。游戏有一个存储的用户创建的关卡列表(可能很多,并且还会动态增加),每个用户都有一个他已经玩过的关卡列表。我需要为他以前没有玩过的用户随机选择一个级别。实体建模如下:

class User(ndb.Model):
    uid = ndb.StringProperty()
    levels_played = ndb.KeyProperty(kind='Level', repeated=True)

class Level(ndb.Model):
    #some stuff here

所以基本上我需要执行一个查询,给定 a uid,选择一个不属于相应 list 的随机 Level levels_played。最有效的方法是什么?

4

1 回答 1

4

没有简单的方法,因为您无法以符合您要求的方式进行连接。

看看这里选择随机记录的策略。

在ndb中查询随机行

就我个人而言,我会从范围键中随机选择 id,然后获取下一个 n 记录选项。然后检查提取的 n 条记录中的选择是否不在播放记录列表中。如果从 n 条记录列表中选择不同的级别。

但是,一旦您拥有大量播放记录,即使这样也无法很好地扩展,除非您保留一个二进制密钥块,否则您可以快速检查一个级别是否已经播放过。

您合理地期望拥有多少级别和多少玩家。一旦关卡和玩家数量增加,您可能不得不牺牲性能来换取大量的内务数据来提高性能。

另一种方法是使用 allocids(获取顺序 id)作为关卡并构建位图。维护一个全局位图,为每个已创建的关卡 id 设置一个位,然后为每个用户设置一个位图,为所玩的关卡设置每个位。您可以在一个 1MB 的 blob 属性中存储大约 800 万个级别。一些位操作,您就有一组未玩过的游戏可供选择。选择一点,然后获取级别。

于 2013-07-05T01:03:17.763 回答