【问题标题】:Dynamic Achievement System algorithm / design动态成就系统算法/设计
【发布时间】:2019-05-20 09:01:10
【问题描述】:
我正在开发这个成就系统,它必须有一个 CRUD,管理员可以访问以创建新的成就和它的规则。我需要一些有关此设计和算法的帮助,以便它可以根据管理员的要求轻松地根据新规则进行演变。
规则示例
奖牌一:必须完成 5 门任何课程且得分至少为 90
奖牌二:必须完成两门特定课程且得分至少为 85
奖牌三:必须至少有一次总排名前 5
奖牌四:必须有超过 5000 分
我基本上会将其作为元数据存储在关系数据库中,可能包含以下这些列:
- 动作
- 动作数量
- 课程数量
- 得分
- id 课程
- 排名
位置
- 点
我想知道这类问题是否有任何已知的算法/设计?或者也许我应该以不同的方式存储它们以使其更容易?不知道,我想要建议。
【问题讨论】:
标签:
algorithm
design-patterns
data-structures
【解决方案1】:
你的怀疑可能是对的。在我看来,数据库是组织这些数据的错误方式。您想要创建的每一种新成就都会向您的数据库添加额外的列,并且大多数成就不会使用大多数列。一个更灵活的数据结构,一个不期望每个条目默认同时使用所有可能的成就标准的数据结构,可能会更有用。大多数语言都支持JSON,所以我建议你使用它。结构可能是这样的:
[
{
"name": "Medal One",
"requirements": {
"coursesCompleted": 5,
"scoreMin": 90
}
},
{
"name": "Medal Two",
"requirements": {
"specificCoursesCompleted": [
"Course 1",
"Course 2"
],
"scoreMin": 85
}
},
{
"name": "Medal Three",
"requirements": {
"generalRankingMin": 5
}
},
{
"name": "Medal Four",
"requirements": {
"scoreMin": 5000
}
}
]
您可以在此处看到标准类型有时是如何重复使用的,但在不需要时可以将其省略,并且可以将新的标准类型添加到一些成就中,而不会增加数据集的其余部分。
PS:出于演示目的,我使标准名称非常冗长;在实际使用中是否缩短它们取决于偏好。