如何在 Google App Engine 中实现互联网高分

Posted

技术标签:

【中文标题】如何在 Google App Engine 中实现互联网高分【英文标题】:How to implement internet high scores in Google App Engine 【发布时间】:2010-10-11 05:14:16 【问题描述】:

我想为我的游戏实现互联网高分。并给玩家反馈他们的位置(不仅仅是top100或类似的东西)。 在普通 SQL 中,它看起来像这样:

SELECT COUNT(*) FROM Scores WHERE points > :newUsersPoints

和 GQL 有类似的东西

db.GqlQuery("SELECT * FROM Score WHERE points > :1", newUsersPoints).count()

但由于 count() 仅限于 1000,因此在我的情况下它不会很有用。 您对如何实现这一点有任何想法吗?

我有两个

第一:

    使用分片计数器的想法 (http://code.google.com/intl/pl/appengine/articles/sharding_counters.html) 创建新的“表”,存储某个范围内的分数(from_points,to_points)

    总结上表中 range.to_points

    找出比新分数所在范围内的分数大的分数 db.GqlQuery("SELECT * FROM Score WHERE points > :1 AND points >= :2 AND points

    查找新分数所在的范围并增加其计数器

    拆分计数器大于 1000(或 999)的范围,以便 3. 不会达到限制

    向分数表添加新分数

这非常复杂且容易出错。在添加分数之前,我们可能会增加一些范围和超时。 (非事务性)

第二个想法:

不时(每天一次?)按分数对所有分数进行排序并赋予它们新的位置(脚本可能会超时,因此我们必须分块执行)

要找出新分数在哪个位置,我们只需这样做

db.GqlQuery("SELECT * FROM Score WHERE points > :1 LIMIT 1", newUsersPoints).get().precalculated_position + 1

还有其他想法吗?

【问题讨论】:

【参考方案1】:

我已经在多个 GAE 应用中实现了 Ranker。它们是 Facebook 应用程序,有成千上万的人在玩。它运作良好,但就我而言,它有一个很大的缺点:您需要提前声明参与者分数的最终范围。所以这很糟糕,原因有两个:

    如果你有一场没有结束的比赛,人们的分数可以无上限地继续攀升,那么你就上当了。

    在比赛开始时,当所有人都聚集在接近于零的位置时,ranker.py 使用的树形结构效率不高。这棵树很深,几乎没有使用它的任何宽度。

换句话说,ranker.py 非常适合您的参赛者的分数以均匀方式随机分布在已知值范围内的情况。对于其他用途,它不是最佳的。

我希望尽快开发出更通用的排名引擎。发生这种情况时肯定会更新此线程!

【讨论】:

【参考方案2】:

这个thread on the google-appengine group 可能会引起人们的兴趣。看起来还有一个库,ranklist,专门用于此。

基本上,听起来他们做了类似于分片计数器的事情。

【讨论】:

以上是关于如何在 Google App Engine 中实现互联网高分的主要内容,如果未能解决你的问题,请参考以下文章

在 Google App Engine/Java 中实现通配符搜索

是否可以在 Google App Engine 应用程序中实现 iPhone 推送通知?

如何在 Google App Engine 中包含 Stripe 库

如何导入发件人类 - Java App Engine

在 Flask + Google App Engine 上启用 SSL

努力在Android App中实现google方向api