说明

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

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”的超类。
为每个任务创建一个子类;继承“ Quest”超类。
使用多态性,我们调用“ CheckForCompletion”方法来检查是否满足任务要求。如果是这样,用户将获得奖励。



我的问题是我是否创建一个名为“ Quests”的数据库表并将上述每个任务存储在该表中?

任务表数据示例:
    名称:摧毁20艘船
    要求:{“销毁”,“ 20”}
    奖励:{“钻石”,“ 5”}
如果是这样,将每个任务加载到相应类别的最佳方法是什么?

要么

是否为每个任务创建一个类而不创建一个任务表?如果是这样,我怎么知道用户何时完成任务,以使用户不会两次获得奖励?

我知道我可以创建一个表并存储必要的需求。然后使用一类带有一堆if语句的类来执行正确的代码,但这对我来说似乎不对。我要问的是;有更好的方法吗?

谢谢

编辑1:

每个任务可以有多个要求。例如:销毁5艘船,杀死10个单位,得分为1000等。

要进一步解释我想要的是消除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都满足这种要求-可能对您的计划有些过分,但值得考虑。

09-16 07:08