首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用于游戏/用户级别/进度的数据库设计帮助

用于游戏/用户级别/进度的数据库设计帮助
EN

Game Development用户
提问于 2011-01-29 19:57:36
回答 1查看 2.1K关注 0票数 3

抱歉,这篇文章太冗长了。我正在创建我的第一个真正的游戏化的网络应用程序,并可能需要一些帮助来思考如何构建数据。

设置

用户需要完成几个类别中的每一个任务,然后才能提升级别。我有我的Users表、Tasks表和Categories表,还有一个UserTasks表,它加入了这三个表。(“用户3在类别8中添加了Task 42,现在他们已经完成了。”)一切都很好,工作也很出色。

挑战

我不确定有什么最好的方法来跟踪每个级别在各个类别中的进展。“商业”规则是:

  1. 你必须在每个类别中达到一定数量的分数才能向上移动。
  2. 如果你得到了Cat 8所需的点数,但仍有其他工作要完成,那么任何新的Cat 8分都会对你的总分产生影响,但不要“翻滚”到下一个级别。
  3. 类别的数量很小(目前有五个),不太可能经常改变,但绝不是绝对固定的。
  4. 每个级别所需的点数都会有所不同,可能是通过公式,或者是查找表。

因此,挑战在于跟踪每个用户在每个类别中向下一个级别的进展情况。我想出了几种可能的方法:

可能的解决方案

  1. 在每个类别的user表中添加一列,并在每次用户级别上升时将它们全部重置为零。
  2. 有一个单独的UserProgress表,为每个用户设置一个行,为每个用户提供一个行,以及每个用户拥有的点数。(基本上是1号的多到多版本。)
  3. userLevel表中添加一个UserTasks列,并使用该列通过某种SUM语句导出它们的进度。

它们的当前级别将是用户表中的一个简单int。

Pros & Cons

(1)看起来是最直截了当的,但也是最不灵活的。也许我可以使用基于类别ids的命名约定来帮助克服其中的一些问题。(代码为"select cats; for each cat, get the value from Users.progress_{cat.id}.")这也是我丢失的数据最多的地方--我不知道哪几点意味着水平上升。我对此没有必要,所以也许我不在乎。

(2)似乎很复杂:每次我添加或减去一个用户或一个类别时,我都必须维护另一个表。我预见到同步挑战。

(3)介于

代码语言:javascript
代码运行次数:0
运行
复制
SELECT categoryId, SUM(points) from UserTasks WHERE userId={user.id} & countsTowardLevel={user.level} groupBy categoryId

嗯..。看上去没那么糟。我想我在这里说的是第三条,但我很喜欢任何意见、建议或其他想法。

抱歉,交叉柱。我在上面写了这篇文章,然后记得有一个游戏是以开发为中心的。我很想知道一个地方和另一个地方是否有不同的答案.

EN

回答 1

Game Development用户

回答已采纳

发布于 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个简单的查询就足够时,这是非常复杂的。

票数 0
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/7861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档