у меня есть что-то, что требует матрицы значений, подобных покемону:
(источник: firechao.com)
у меня есть объект класса для каждого из типов, есть ли шаблон или хороший способ реализовать это как средний слой или в классах?
Да, попробуйте использовать паттерн проектирования Decorator.
подсказка: просто создайте класс Normal
со всеми необходимыми вам статистиками. Затем создайте класс Decorator
для каждой
строки матрицы: FireDecorator
, SteelDecorator
, которые применяют множитель для атаки/защиты.
бонус #1: вы можете очень легко построить "Огненно-стального персонажа", динамически (замысел шаблона)
бонус #2: когда вы добавляете другого персонажа, скажем, "Гиганта", вы просто добавляете один класс, не трогая ничего другого
Словарь использует имена атакующего (Fire, Ice и т. Д.) В качестве ключа, который содержит словари, которые используют имена защитника в качестве ключей и мультипликаторов. как ценности.
Если у вас есть отдельный класс для каждой «вещи», к которой относятся эти типы (ваш покемон или что-то еще), классы могут содержать статическую структуру хэша / карты / словаря, которая дает, какие множители существуют для атаки других. Такой хеш будет представлять одну строку таблицы. Если вам действительно нужен обратный поиск, просто сделайте еще один, в котором будет храниться столбец информации.
Вы можете использовать 2 карты (map в java, в других языках может иметь другое название): одну для
Attacking-->Defending
и одну для Defending-->Attacking
.
Рассмотрим пример Attacking-->Defending. Карта будет содержать типы Attacking в качестве ключей и массивы типов Defending в качестве значений. Например:
Fire-->[Fire, Water, Grass, Ice, Bug, Rock, Dragon, Steel]
Зачем это усложнять - В целях обслуживания сделайте так, как он выглядит. Двумерный массив подойдет, а поскольку он статичен, лучше всего подойдет поиск производительность - вам просто нужен способ перейти от имени / типа к индексу массива.
Это основная проблема множественной диспетчеризации. К сожалению, большинство языков не поддерживают множественную отправку.
Так что я бы, наверное, использовал карту карт.Внешняя карта отображает атаки на карты защиты, которые, в свою очередь, отображают защиту на очки / эффекты / что угодно.
Вы можете использовать шаблон Visitor, но он быстро становится громоздким.
В Python, предполагая, что вы не используете много подклассов (например, никаких подклассов Ice), вы могли бы использовать сопоставление словаря (атака, защита)
кортежей для очков. Это было бы довольно чистое решение и поддерживалось бы множеством языков (все, что вам нужно, это класс Pair и возможность представлять типы атак как объекты, либо через объект класса, либо что-то вроде перечисления).