我将取得成就,例如
获得1000分
登录 20 次
在 24 小时内完成 2 项任务
ETC
对此进行编程的最佳方法是什么?(例如,它背后的逻辑。在每次页面加载时检查每个可能的成就将是浪费资源)
我将取得成就,例如
获得1000分
登录 20 次
在 24 小时内完成 2 项任务
ETC
对此进行编程的最佳方法是什么?(例如,它背后的逻辑。在每次页面加载时检查每个可能的成就将是浪费资源)
这是一个相当开放的问题。一种方法是将用户已经取得的进度存储在数据库表中(每个成就一列),每次取得进展时,都会增加进度值。当达到目标时,可以为每个成就设置一个魔法值(null、100 万等),然后您只需检查每个用户条目中的哪些列具有魔法值。
您可以只存储进度并计算每次访问的成就状态,但我认为这对于您提到的限时任务之类的事情会有问题,如果您出于任何原因更改目标并且他们失去成就,人们可能会感到厌烦之前已经获得。
可以说更正确的方法是有一个静态的“成就”表,其中每一行都详细说明了一项成就以及目标。然后,您将拥有一个单独的“进度”表,其中每个用户将针对他们正在努力实现的每项不同成就都有一行。这需要更多的工作来实现,但与将目标硬编码到进度表中的列名相比,您可以在以后更轻松地添加/删除/更改目标。我认为你不应该低估这将在以后给你带来的价值。这样,每个用户/成就组合的进度表可以有多个列,这使您可以存储达到的时间等内容,并且您可以非常简单地获得这样的成就列表:
SELECT achievement_id
FROM progress
WHERE user_id = $user
AND achievment_time IS NOT NULL
如果您想在每个页面上显示成就,您必须检查每个页面加载的内容,但是如果您以其中一种方式记录进度,您就不会回到第一原则并计算已经进行了多少登录,每次完成了多少任务等等 - 只是从您的数据库中选择一个,我认为这就是您的意思。
对于诸如登录次数之类的事情,记录进度很简单(每次执行操作时只需增加一个计数器),但您显然必须更仔细地考虑在时间限制的成就上密切关注进度的逻辑。在这里,您需要跟踪在单独的表中执行操作的时间戳(当然,您可能已经这样做了),并且每次创建新时间戳时,计算前一个时间段内的时间戳,看看是否成就已经达到。