如何检测游戏成就?


10

我错误地将其发布到stackoverflow上,现在根据该站点上的建议在此处发布...

这是一个非常高级的概念性问题。在软件应用程序中说,我有4种不同的操作,例如:上传,共享,评论等

我想给成就徽章给像这样的用户:

  • 新秀-上传您的前5个文件
  • Upload Junkie-在1天内上传20个文件
  • Night Crawler-午夜后上传文件
  • 共享一个-共享10个不同的文件
  • 点赞全部-点赞20个不同的文件

你明白了。在无需将实现逻辑编译到我的代码中的情况下,检查并查看用户是否已实现特定成就的最佳方法是什么?并且..-保留在编译后添加新成就的能力(xml或db)-成就必须跟踪特定的操作,次数和其他条件(例如一天中的时间)-检测应接近实时,以便用户通知成就完成后几乎立即

我最大的问题是,我如何发现这些成就?我要:

1)在执行每个操作后检查是否...(最实时)2)是否有另一个程序始终根据一组规则检查数据库?(最简单的)

我还缺少另一个范式吗?我觉得肯定是因为在很多游戏中(例如iOS的jetpack),当我解锁它的那一刻,我都收到了我获得的成就的通知,这给我留下了深刻的印象。

谢谢


您是否已经设计或制作了成就系统,并且只想知道如何在游戏中使用它?
Harrison Brock 2013年

Answers:


6

通常,您要做的是拥有一个“成就”系统。任何发生的动作都称为成就系统,并说“嘿,这件事刚刚发生”。

因此,成就系统通常是一组规则,通常由简单的组合逻辑和各种“事件”的计数器组成。然后是成就系统在规则和计数器的帮助下制定工作的责任,发生的磨擦以及要给出的成就。

您这样做的原因是双重的。

  • 您不想在整个代码库中散布状态逻辑。

  • 有时,成就将需要“材料”的组合,而这些“材料”可能发生在完全不同的系统/时间/等中,并且为此在代码库中散布逻辑将导致大量不必要的复杂性。

我过去做的方法是使用可脚本化的规则系统(其中“可脚本化”是一个非常宽松的术语,通常只是某种数据驱动的比较器)。因此,您可以说类似以下内容:

  • 当“用户按下某物”发生时,“按下”变量“增加”。

那你可能有另一个规则是

  • 当“按下”变量比“某个值”更大时,发放成就“等等”

也许

  • 当“用户杀死老板”时发生“发放”成就“等等”。

成就系统还将负责维护已发放成就的状态,因此您不会重复。


0

一种规范的处理方式可能是规范模式。您将有一个成就经理,该经理会定期向您的用户查询与一组规范中的任何一个相匹配的用户。因此,您的成就级别将正常包含名称,徽标,得分等,以及描述获得该成就的用户的规范。例如,在C#中,“共享一个整体”成就可能看起来像这样:

AchievementType ShareAHolic = new AchievementType
{
    Name = "Share-a-holic",
    Description = "Shared 10 files",
    Score = 25,
    Specification = (user => user.SharedFiles.Distinct().Count() > 10)
};

AchievementManager.AddAchievementType(ShareAHolic);

然后在适当的时候,您的成就经理可以执行以下操作:

foreach (AchievementType achievement in AchievementTypes)
{
    var users = DB.Users.Where(achievement.Specification && !(user.Achievements.Contains(achievement)));
    foreach (User u in shareaholics)
    {
        AchievementManager.Award(u, achievement);
    }
}

.Award()如果可以立即检测到成就,也可以在适当的位置直接调用成就经理的方法。您可能还想添加一种方法,以对特定用户运行这些检查,以便您可以在重要事件之后触发检查,以使用户立即获得成就。


分区成就变得越来越重要,AchType需要一个“ sope”属性,该属性可以帮助DB.Users.Where()尽可能避免无关的成就。因此,如果只能在PvP中授予文件共享成就,则仅搜索PvP。虽然诸如抢劫之类的通用事物可能在全球范围内都是可行的,但却没有这种范围。
hpavc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.