2016-03-01 99 views
0

我最近开始着手制作一个用C#制作“Magic:The Gathering”风格的纸牌游戏的侧边项目,只是为了我作为程序员的个人发展。如何在数据库中保存不同的方法参数?

一张卡片既可以是“怪物”也可以是“咒语”,并且我想在特定场景发生时触发某些事件(例如,怪物在受到打击时会恢复其他友方怪物;或者法术当一个敌人怪物被放在板上时造成伤害)。

目前我正在将所有卡片存储在RDBMS中,其中我有像“Monster”和“MonsterTrigger”这样的表格。后者拥有一个MonsterId,TriggerType和MethodName。当怪物被加载时,我检查它是否有任何触发器效果,并将相应的EventHandler关联到它,然后通过Reflection调用MethodName列中指定的方法。

我的问题是,我应该如何将方法参数保存在数据库中? (例如DestroyAllMonsters() vs DrawCards(numOfCards) vs Heal(monsterId,hp))。方法可以具有不同数量的参数,不同的数据类型等。我最初的想法是将参数保存为以逗号分隔的或沿着这些线的东西,但这似乎不是好的做法。 我的另一个想法是切换到NoSQL DB,但如果我可以帮助的话,我真的很想把这个项目的所有内容都放在RDBMS上。

我非常想听听你的建议。 在此先感谢!

回答

0

我会从这个假设开始,假设你不管使用什么原因都不使用对象和对象继承(因为我的第一个想法是建议对象和类似工厂或生成器设计模式来构建这些卡),你已经为自己辩护,而不是走上这条道路。

对于RDBMS,您希望将需要进一步定义的任何内容拆分为其他表并与外键链接。由于方法有所不同,可能有也可能没有参数我将它们分开,有一个参数表,并使用联结表来连接方法与它们的参数,并将方法ID与卡片一起存储。这使得MethodName列与关系数据库结构的匹配程度高于您构建它的方式。

+0

你好,查尔斯,谢谢你对DB结构的回答。这非常有帮助!至于代码,我使用的是对象继承 - 我有一个Monster类和一个Spell类,它们都实现了Card接口。你建议我应该采用不同的方式吗?我愿意接受创意,这主要是对我自己的练习 – user104

+0

它真的取决于对象如何获得其功能。这听起来像你有通用对象,并且你正在使用数据库来定义功能。我猜你希望能够创建卡片而无需添加代码(除非需要新的方法),这意味着使用泛型,因此接口可以为此工作。这也意味着一个非常复杂的数据模型来支持该功能。 –