抱歉,这篇文章太冗长了。我正在创建我的第一个真正的游戏化的网络应用程序,并可能需要一些帮助来思考如何构建数据。
用户需要完成几个类别中的每一个任务,然后才能提升级别。我有我的Users
表、Tasks
表和Categories
表,还有一个UserTasks
表,它加入了这三个表。(“用户3在类别8中添加了Task 42,现在他们已经完成了。”)一切都很好,工作也很出色。
挑战
我不确定有什么最好的方法来跟踪每个级别在各个类别中的进展。“商业”规则是:
因此,挑战在于跟踪每个用户在每个类别中向下一个级别的进展情况。我想出了几种可能的方法:
UserProgress
表,为每个用户设置一个行,为每个用户提供一个行,以及每个用户拥有的点数。(基本上是1号的多到多版本。)userLevel
表中添加一个UserTasks
列,并使用该列通过某种SUM语句导出它们的进度。它们的当前级别将是用户表中的一个简单int。
(1)看起来是最直截了当的,但也是最不灵活的。也许我可以使用基于类别ids的命名约定来帮助克服其中的一些问题。(代码为"select cats; for each cat, get the value from Users.progress_{cat.id}
.")这也是我丢失的数据最多的地方--我不知道哪几点意味着水平上升。我对此没有必要,所以也许我不在乎。
(2)似乎很复杂:每次我添加或减去一个用户或一个类别时,我都必须维护另一个表。我预见到同步挑战。
(3)介于
SELECT categoryId, SUM(points) from UserTasks WHERE userId={user.id} & countsTowardLevel={user.level} groupBy categoryId
嗯..。看上去没那么糟。我想我在这里说的是第三条,但我很喜欢任何意见、建议或其他想法。
抱歉,交叉柱。我在上面写了这篇文章,然后记得有一个游戏是以开发为中心的。我很想知道一个地方和另一个地方是否有不同的答案.
发布于 2011-02-01 02:49:33
因此,挑战在于跟踪每个用户在每个类别中向下一个级别的进展情况。
我不知道为什么这是个挑战?根据我的理解,您可以从UserTasks的内容中快速而琐碎地计算这5个值中的每一个:
由于您有少量的类别,我建议只执行5个单独的查询,每个类别一个,将每个值与这个级别上的最大点数进行绑定。把它们加起来,与总数进行比较。
如果一项任务可以计算到任何给定的级别(例如。您可以在任何时候执行Task 10,并将相关的点收集到您的下一个级别),然后您可能需要某种类型的标志来显示该任务的点数已被赎回,以便上升一个级别。该标志允许您将它们排除在将来的查询之外。
您可能会做一些鬼鬼祟祟的事情,比如将usertasks中的points列设置为零,以将其标记为可赎回的,但是这类事情会导致无法维护的代码,所以我不会推荐它。
所以,就像:select sum(points) from usertasks where redeemed=0 and category=1
--这就是你所建立的第1类点数。
还有:select min(sum(points), 20) from usertasks where redeemed=0 and category=1
--如果你只需要20分的话,你就能得到多少个1类点数。
如果您有一个单独的“category_level”表,其中有一个当前级别的字段,以及该级别上该类别中所需点数的字段,那么我认为您可以使用一个查询来完成所有这些工作:将用户任务连接到分类级别(如果需要的话通过类别),按类别分组,汇总点数,并从分类级别表中获取点数上限。但是,当5个简单的查询就足够时,这是非常复杂的。
https://gamedev.stackexchange.com/questions/7861
复制相似问题