解释
假设我们有多个任务,玩家在完成某些任务后会获得奖励。以下示例显示了用户任务:
Name: Get a high score of 100
Requirement: Score of 100
Reward: 10 Coins
Name: Get a high score of 5000
Requirement: Score of 5000
Reward: 10 Diamonds
Name: Destroy 20 ships
Requirement: Destroy 20 ships
Reward: 5 Diamonds
Name: Reach level 5
Requirement: Level 5
Reward: 20 Coins, 10 Diamonds
然后我创建以下逻辑:
创建一个名为“Quest”的父类(super class)。 为每个任务创建一个子类;继承“Quest”父类(super class)。 使用多态性,我们调用“CheckForCompletion”方法来检查是否满足了任务要求。如果是这样,用户将获得奖励。
问题
我的问题是我是否创建一个名为“Quests”的数据库表并将上述每个任务存储在表中?
任务表数据示例: 名称:摧毁20艘船 要求:{“销毁”,“20”} 奖励:{“钻石”,“5”} 如果是这样,将每个任务加载到相应类中的最佳方法是什么?
或
是否可以在不创建任务表的情况下为每个任务创建一个类?如果是这样,我如何知道用户何时完成任务,以免用户获得两次奖励?
我知道我可以创建一个表并存储必要的要求。然后有一个带有一堆 if 语句的类来执行正确的代码,但这对我来说似乎不正确。我要问的是;有更好的方法吗?
谢谢
编辑 1:
每个任务可以有多个要求。例如:摧毁 5 艘船,杀死 10 个单位,得分 1000 等。
为了进一步解释,我想要消除 if 语句。我不想做这样的 if 语句;
if (score == 100)
//process
else if (ships_destroyed == 5)
//process
else if (level == 5)
//process
else if (ships_destroyed == 5 && units_killed == 10 && score == 1000)
//process
我希望消除这个过程,因为我可能有数百个任务,而且我认为它扩展起来不够容易。那么有没有更好的方法呢?
最佳答案
你的问题有几个相关的方面 - 和往常一样,答案是“视情况而定”。
首先,我建议不要子类化您的“Quest”类 - 当然,这不是黑白分明的,但总的来说,我赞成 composition over inheritance
如果您确信游戏机制不会改变,我不会费心使用数据库表 - 我会使用您的编程语言(Java 或 PHP)中的常量。从开发和性能的角度来看,在数据库中查找静态数据的成本很高。
如果您认为在调整游戏时可能需要更改此数据,那可能太局限了 - 每次您想要调整任务的奖励时都进行完整构建会使您很难获得正确的平衡.在这种情况下,我会使用配置文件 - 数据确实会发生变化,但只有在您开始游戏时才会发生变化,而不是在游戏运行时发生变化。
如果您的游戏机制要求奖励在游戏过程中发生变化,并且是多人游戏,那么您可能需要使用数据库。
最后,大多数游戏引擎include a scripting language对于这种要求 - 对于您的计划来说可能有点矫枉过正,但值得考虑。
关于java - 如何设计易于扩展的游戏任务系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33344350/