Есть ли образец для этого? - PullRequest
8 голосов
/ 13 апреля 2010

У меня есть кое-что, что требует матрицы значений, аналогично pokemon:

покемон http://firechao.com/Images/PokemonGuide/PokemonTypeChart.PNG

У меня есть объект класса для каждого из типов, есть шаблон или хороший способ реализовать это, как средний уровень или в классах?

Ответы [ 7 ]

7 голосов
/ 13 апреля 2010

Зачем делать это так сложно - ради обслуживания сделай так, как оно выглядит. С двумерным массивом все будет в порядке, и поскольку он статичен, он даст вам наилучшую производительность поиска - вам просто нужно перейти от Name / Type к индексу массива.

5 голосов
/ 13 апреля 2010

Да, попробуйте шаблон проектирования Decorator .

подсказка : просто создайте класс Normal со всей необходимой статистикой.Затем создайте класс Decorator для каждой строки матрицы: FireDecorator, SteelDecorator, который применяет множитель для атаки / защиты.

бонус # 1 : вы можете очень легко создать «Огненного стального персонажа», динамически (цель шаблона)*: когда вы добавляете другого персонажа, скажем «Гигант», вы просто добавляете один класс, не касаясь чего-либо еще

3 голосов
/ 13 апреля 2010

Это основная проблема с несколькими отправками. К сожалению, большинство языков не поддерживают множественную диспетчеризацию.

Так что я бы, вероятно, использовал карту карт. Внешняя карта отображает атаки на карты защиты, которые, в свою очередь, отображают защиту на очки / эффекты / что угодно.

Вы можете использовать шаблон Visitor, но это становится громоздким быстро.

В Python, предполагая, что вы не используете много подклассов (например, нет подклассов Ice), вы можете использовать словарь, отображающий (attack,defense) кортежей для оценки. Это было бы довольно чистым решением и было бы поддержано множеством языков (все, что вам нужно, это класс Pair и возможность представлять типы атак как объекты, либо через объект класса, либо что-то вроде перечисления).

1 голос
/ 13 апреля 2010

Словарь использует имена атакующего (Fire, Ice и т. Д.) В качестве ключа, который содержит словари, в которых имена защитника используются в качестве ключей, а множители - в качестве значений.

0 голосов
/ 24 марта 2013

Шаблон Mediator может помочь. Это скорее решение среднего уровня, чем решение класса.

http://www.dofactory.com/Patterns/PatternMediator.aspx

  • В приведенном выше примере Colleague будет вашим Type.
  • ConcreteColleague0 будет Normal, ConcreteColleague1 будет Fire, ConcreteColleague2 будет Water, ConcreteColleague3 будет Grass ...
  • 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 по умолчанию. фактор урона, может наносить урон.

Преимущества ИМО:

  1. Если вы добавите новый тип, он получит коэффициент повреждения по умолчанию. Таким образом, добавление нового типа не требует разработки, за исключением случаев, когда стандартного недостаточно.
  2. Вы ConcreteMediator можете сделать гораздо больше, чем получить фактор урона, он может применить его и т. Д.
  3. Вы можете развивать другие ConcreteMediator - то есть отношения - кроме борьбы между атакующим и защитником. Например, steal(), observe() и т. Д. Если вы добавите в посредник другие сеттеры, область отношений будет шире.
0 голосов
/ 13 апреля 2010

Если у вас есть отдельный класс для каждой «вещи», которая квалифицируется этими типами (ваш покемон или что-то еще), классы могут содержать статическую структуру хэш / карта / словарь, которая дает множители для атаки на другие. Такой хэш будет представлять одну строку таблицы. Если вам действительно нужен обратный поиск, просто сделайте еще один, в котором будет храниться столбец информации.

0 голосов
/ 13 апреля 2010

Вы можете использовать 2 карты (карта в java, на других языках она может иметь другое имя): 1 для

Attacking-->Defending и один для Defending-->Attacking.

Давайте рассмотрим пример атаки> защиты. Карта будет содержать Типы атак в качестве ключей и массивы типов защиты в качестве значений. Например:

Огонь -> [Огонь, Вода, Трава, Лед, Жук, Камень, Дракон, Сталь]

...