java - 如何设计易于扩展的游戏任务系统?

标签 java php oop database-design

解释

假设我们有多个任务,玩家在完成某些任务后会获得奖励。以下示例显示了用户任务:

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/

相关文章:

java - 如何找到生成 DocumentEvent 的源组件

java - 在 Java 中自动处理电子邮件

java - 是否可以在 Java 中定义变量并在 JSP 代码中使用它?

php - 在 PHP 中读取包含一些荷兰语或法语字符的 CSV/Excel 文件

c# - 传递一个对象,继承它或使用直接方法

c++ - 如何在项目的各个部分之间创建松散耦合?

java - 将数据从 servlet 发送到客户端的最佳方式?

php - 当用户在 PHP 中输​​入重复键时自动显示文本

php - 如何更新 Laravel hasMany 关系模型?

java - 根据总值对对象数组列表进行排序