你将如何实现一个类似于SO的徽章系统?


How would you implement a badge system similar to SO?

我需要在zend框架中做一个类似的徽章系统

我不知道如何实现,我想关于一个事件/观察者和一些动作来触发一个动作来检查,或者一个cron,每10分钟运行一次,例如,等等。

任何想法?

作为一个为客户端编写游戏化插件的Django开发人员,我使用Stack Overflow和BigDoor作为我的灵感。事实证明,游戏化非常简单,同时也非常困难。

假设您的数据库中已经有一个User表,那么游戏化应用程序的核心恰好需要两个表:"Currency"answers"UserCurrency"。Currency表有一个必填字段"name",但我建议也添加一个"description"。如果你为你的游戏化层编写一个管理界面,那么描述会有很大帮助。

CurrencyUser表有三样东西:用户的ID、货币的ID和用户挣得的货币数量。

"货币"是一个游戏化的流行词;不是指钱,而是指你追踪的东西。例如,SO跟踪你发布了多少奖励,有多少票,你给别人的答案点赞了多少次,以及你的一个答案的点赞次数超过了10次(注意最后一个:是其他人做的,不是你!)。对于这些事件中的每一个,SO运行一个标准列表,获取相关的货币,并为满足的条件增加或创建一个新的UserCurrency。

当增量发生时,这也是一个事件,并且触发第二层函数,如果通过阈值,则授予徽章。

在SO中也有"秘密"徽章。你知道吗?您不会为这些内容获得徽章,但是会在另一个表中设置一个标志——编辑权限、评论权限、管理wiki的权限等等。

我提到秘密徽章是为了说明这一点:用于跟踪奖励货币的用户事件的代码是一个与应用程序松耦合的独立插件,用于跟踪导致徽章的货币事件的代码是第二个独立的松耦合代码,用于跟踪导致权限的货币事件的代码是第三个独立的松耦合代码。只要每个接口之间的api是清晰的,每个接口的内部都可以在不影响其他接口的情况下进行一定程度的改变。

所以游戏化很容易写。

这也很难。SO是一种灵感,因为他们真的认真思考过他们想让用户做什么。渐进式权限系统防止了过分的trolling,徽章系统从一开始就教育用户关于徽章系统("第一个张贴徽章!"),但它也教育用户关于用户还可以做什么。徽章的名称和描述令人愉快,富有洞察力,并引导用户了解更多。"游戏化"不只是关于用户粘性,它还是一种告诉用户"既然你已经想出了X,你就可以去争取奖励Y了!"如果你达不到这个目标,那就不要尝试游戏化了。

我会使用触发器(伪代码:)来实现

On update votes_table create new row in users_points (how_many, for_what, when, ...);
on update users_points call check_if_enough_for_some_badge();

我是这样处理的:首先,几乎所有的用户活动都被记录为一个事件,从一开始,因为新的徽章和条件将在未来添加,其中一些是长期的。

我正在工作的应用程序是一个电子学习游戏/平台,所以事件类型将包括类似的东西:测验,用户,社区和他们内部的事件可能是这样的:(对于测验)正确回答问题,错误回答问题,完成测验,(对于用户)登录,注销,完成配置文件,(对于社区)张贴问题到论坛,张贴答案到论坛,答案评级+1等…

每个事件都有一个时间戳。

完成徽章/关卡等的标准存储在函数中,函数的名称与徽章一起存储在表中。这使我能够保持表的简单性,并利用更多创造性的代码使用。

cron以较短的间隔运行,以查看事件表中的所有内容的徽章/级别等队列,并与用户活动日志交叉引用。换句话说,只有当用户登录时,他才会被添加到队列中。

任何与此相关的建议,特别是关于可伸缩性的建议,将不胜感激!

我想这样做:

  • 为用户创建大量参数(如回答的问题,收到的投票等)
  • 在此参数上创建具有先决条件的徽章(回答5个问题,收到10票等)
  • 每次更新用户时,检查新徽章并将其包含在用户徽章上

我想它应该能奏效(:


如果你不需要在用户获得新徽章时警告他,你甚至不需要每次都寻找徽章。只需运行一个查询,显示符合先决条件的徽章。