【问题标题】:How would you implement a badge system similar to SO?您将如何实现类似于 SO 的徽章系统?
【发布时间】:2011-04-26 17:58:33
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

    标签: php zend-framework badge


    【解决方案1】:

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

    假设您的数据库中已经有一个 User 表,那么游戏化应用程序的核心恰好需要两个表:“Currency”和“UserCurrency”。货币表有一个必填字段“名称”,但我也推荐一个“描述”。如果您为游戏化层编写管理界面,那么描述会很有帮助。

    CurrencyUser 表包含三项内容:用户 ID、货币 ID 和用户赚取的货币数量。

    “货币”是一个游戏化的流行语;它不是指金钱,而是指您正在追踪的任何东西。例如,SO 会跟踪您发放了多少赏金、多少票、您对除您自己的答案之外的答案投了多少次,以及您的答案中有多少次通过了 10(请注意最后一个: 其他人这样做,而不是你!)。对于这些事件中的每一个,SO 都会遍历一个标准列表,获取相关的货币,并为已满足的那些增加或创建新的 UserCurrency。

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

    SO 中也有“秘密”徽章。你知道吗?您不会获得这些徽章,但会在不同的表格中设置一个标志 - 编辑权限、评论权限、管理 wiki 的权限等等。

    我提到秘密徽章是为了说明这一点:用于跟踪奖励货币的用户事件的代码是一个松散耦合到您的应用程序的独立插件,用于跟踪导致徽章的货币事件的代码是第二个独立插件,松散耦合的代码段,而用于跟踪导致权限的货币事件的代码是第三个独立的松散耦合代码段。只要它们之间的 API 清晰,它们的内部结构可以在一定程度上改变而不会影响其他的。

    所以游戏化很容易编写。

    这也很难。 SO 是一种灵感,因为他们真的认真考虑了他们希望用户做什么。渐进式权限系统可防止恶意拖钓,徽章系统从一开始就向用户介绍徽章系统(“首次发布徽章!”),但它也向用户介绍更多用户可以做。徽章的名称和描述令人愉悦,富有洞察力,并引导用户了解更多信息。 “游戏化”不仅仅是关于参与,而是一种告诉用户的文档,“现在你已经弄清楚了 X,你可以去争取奖励 Y!”如果你达不到那个标记,就不要费心去玩游戏了。

    【讨论】:

      【解决方案2】:

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

      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();
      

      【讨论】:

        【解决方案3】:

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

        我正在开发的应用程序是一个电子学习游戏/平台,因此事件类型将包括以下内容:测验、用户、社区,其中的事件可能类似于:(对于测验)答案问题正确、错误回答问题、完成测验、(对于用户)登录、注销、完成个人资料、(对于社区)向论坛发布问题、向论坛发布答案、回答评分 +1 等...

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

        完成徽章/级别/等的标准存储在函数中,函数的名称在带有徽章的表中。这使我能够保持表格的简单性,并利用更有创意的代码使用。

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

        对此有任何建议,尤其是。关于可扩展性将不胜感激!

        【讨论】:

          【解决方案4】:

          我愿意这样做:

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

          我认为它应该可以解决问题(:


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

          【讨论】:

            猜你喜欢
            • 2010-12-04
            • 2011-08-02
            • 2015-08-01
            • 1970-01-01
            • 2010-12-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多