我需要一些价值矩阵,类似于口袋妖怪:
pokemon http://firechao.com/Images/PokemonGuide/PokemonTypeChart.PNG
我有一个每个类型的类对象,有一个模式或一个很好的方法来实现它,作为中间层或在类中?
答案 0 :(得分:7)
为什么要这么复杂 - 为了维护起见,让它看起来像它。 二维数组会很好,因为它是静态的,可以提供最佳的查找性能 - 然后你需要一种方法从Name / Type转到数组索引。
答案 1 :(得分:5)
是的,尝试Decorator设计模式。
提示:只需创建一个Normal
类,其中包含您需要的所有统计信息。然后为每个创建一个Decorator
类
矩阵的一行:FireDecorator
,SteelDecorator
,用于攻击/防御的乘数。
奖金#1 :您可以非常轻松地构建“Fire Steel Character”,动态(模式的意图)
奖励#2 :当你添加另一个角色时,说“巨人”,你只需添加一个类, 没有接触任何其他东西
答案 2 :(得分:3)
这是一个基本的多调度问题。不幸的是,大多数语言都不支持多次发送。
所以我可能会使用地图地图。外部地图将攻击映射到防御地图,防御地图反过来将防御映射到分数/效果/任何内容。
你可以使用访客模式,但这很快就会很麻烦。
在Python中,假设您没有使用太多的子类(例如,没有Ice的子类),您可以使用将(attack,defense)
元组映射到分数的字典。这将是一个相当干净的解决方案,并且将受到各种语言的支持(你需要的只是一个Pair类,能够通过类对象或枚举等方式将攻击类型表示为对象。)
答案 3 :(得分:1)
字典使用攻击者的名称(Fire,Ice等)作为包含字典的键,该字典使用防御者的名称作为键,将倍数用作值。
答案 4 :(得分:0)
您可以使用2个地图(在java中使用地图,在其他语言中可以使用其他名称):1表示
Attacking-->Defending
和Defending-->Attacking
一个。
让我们考虑攻击 - >防守示例。 Map将包含攻击类型作为键,将防御类型数组作为值。例如:
火 - > [火,水,草,冰,虫,岩石,龙,钢]
答案 5 :(得分:0)
如果你为这些类型限定的每个“东西”(你的口袋妖怪或其他东西)都有一个单独的类,那么这些类可以包含一个静态哈希/地图/字典结构,它可以提供攻击其他类型的乘数。这样的散列将代表该表的一行。如果你真的需要反向查找,只需再创建一个存储信息列。
答案 6 :(得分:0)
Mediator模式可以解决问题。它更像是一个中间层解决方案,而不是一流的解决方案。
http://www.dofactory.com/Patterns/PatternMediator.aspx
Colleague
将是您的Type
。ConcreteColleague0
将为Normal
,ConcreteColleague1
将为Fire
,ConcreteColleague2
将为Water
,ConcreteColleague3
将为Grass
{1}} ... Mediator
将提供方法setAttacker(Type attacker)
,setDefender(Type defender)
和fight()
的界面。他们将全部在ConcreteMediator
中实施。这意味着类属性防御者和攻击者应该在ConcreteMediator
ConcreteMediator
将隐藏矩阵的实现。它可以是地图的地图 - 某些语言的字典字典 - 。我也可能是一个单一的地图,其中密钥由攻击者和防御者类型的串联组成,如factor["fire_fire"] = 0.5, factor["fire_water"] = 0.5, factor["water_fire"] = 2
等。如果矩阵中不存在关联,则它将获得默认因子1。获得伤害因素,可能会造成伤害。IMO的优势在于:
ConcreteMediator
可以做的不仅仅是获得伤害因素,还可以应用它等等。ConcreteMediator
- 即关系 - 而不是攻击者和后卫之间的战斗。例如steal()
,observe()
等。如果您向调解器添加其他设置器,则关系范围将更广。