0

我正在设计一个纸牌游戏(在本示例中考虑 Magic the Gathering)并希望获取纸牌信息并将其存储在数据库中。在这个游戏中,有些事件(例如,一张牌可能会说“当它进入游戏时,对手受到 2 点伤害”)与一张特定的牌相关联。设计决策导致在制造商工厂松散地构建卡片,但我希望将卡片取出并将它们存储在数据库中。由于大多数卡片都是基本“卡片”类的实例,因此很容易加载每张卡片共有的功能(名称、成本等),但我一直在努力寻找一种将这些事件与单个卡片联系起来的好方法卡类型。到目前为止我想到的唯一方法是将函数名称存储在数据库中,并在加载卡时使用后期绑定来注册事件。有一个更好的方法吗?

我发现的唯一类似的帖子是:Store function name in database and then execute it

使用 eval() 的答案似乎类似于后期绑定,但被否决了。但是,没有人对如何执行此功能提出了更好的建议。

4

1 回答 1

0

这听起来像是一种可用的方法,但是它是否是一个好的方法是值得怀疑的。

为什么不从数据库中的卡片表示构造propper 对象?要么使用对象数据库,要么更可能的是使用对象关系映射。通过这种方式,您可以以一种干净、易于阅读和使用的方式表示每种类型的卡片,同时还可以使用从公共基类派生的专用类的丰富实例。

因此,您使用一个公共表来存储所有卡片,如下所示:

+-------------------------------------------------+
| card type | data1 | data2 | data3 | ... | dataN |
+-------------------------------------------------+
| Card      | 123   | 456   | 789   | ... | abc   |
| CardS1    | 123   | 456   | 789   | ... | abc   |
| CardS3    | 123   | 456   | 789   | ... | abc   |
| CardS2    | 123   | 456   | 789   | ... | abc   |
...

像这样的类层次结构:

+---------------------------+
| class Card                |>-+
+---------------------------+  |
| var data1                 |  |
| var data2                 |  |
| var data3                 |  |
| ...                       |  |
| var dataN                 |  |
| baseMethod1()             |  |
| baseMethod2()             |  |
+---------------------------+  |
                               |
+---------------------------+  |
| class CardS1. public Card |<-+
+---------------------------+  |
| specialMethod_1_1()       |  |
+---------------------------+  |
                               |
+---------------------------+  |
| class CardS2. public Card |<-+
+---------------------------+  |
| specialMethod_2_1()       |  |
| specialMethod_2_2()       |  |
+---------------------------+  |
                               |
+---------------------------+  |
| class CardS3. public Card |<-+
+---------------------------+
| specialMethod_3_1()       |
+---------------------------+
于 2013-04-15T06:01:52.740 回答