Я собираюсь запустить простую браузерную текстовую RPG с персонажами, которые могут (пассивно) сражаться с другими людьми. Это включает в себя список около 10 навыков, таких как сила, ловкость и так далее, с дополнительными навыками для различных видов оружия.
Есть ли лучший способ создать этот класс персонажей, чем просто использовать эти навыки в качестве атрибута класса? Это кажется легким, но я отказываюсь, потому что это неуклюжесть.
class Char(self):
int strength
int dexterity
int agility
...
int weaponless
int dagger
...
architecture
oop
Sven
источник
источник
Charactor
класса?Ответы:
Пока ваша система относительно проста, это должно работать. Но когда вы добавите такие вещи, как временные модификаторы навыков, вы скоро увидите много повторяющегося кода. Вы также столкнетесь с проблемами с различным оружием, используя различные навыки. Поскольку каждый навык - это отдельная переменная, вам придется писать разные коды для каждого типа навыка, который в основном делает то же самое (или использует несколько мерзких отражений - при условии, что ваш язык программирования поддерживает их).
По этой причине я бы рекомендовал вам хранить навыки и навыки в ассоциативной структуре данных, которая сопоставляет константы навыков со значениями. Как это сделать, элегантно отличается от языка программирования к языку программирования. Когда ваш язык поддерживает это, константы должны быть в
enum
.Чтобы дать вам пример того, как это будет работать на практике, ваш код для расчета ущерба от атаки будет выглядеть примерно так:
источник
getSkill()
противоречит основному принципу объектно-ориентированного программирования .Почему бы не использовать связанные массивы ?, это дает преимущество простоты расширения (например, с использованием PHP)
для таких вещей, как оружие, вы, вероятно, захотите создать несколько базовых классов
Оружие -> оружие ближнего боя, оружие дальнего боя
а затем создать свое оружие оттуда.
Конечный результат, к которому я бы стремился, - это класс, похожий на этот
Вы можете хранить все в массиве, если вы действительно хотите.
источник
Я постараюсь ответить на этот вопрос наиболее ООП-способом (или, по крайней мере, так, как я думаю). Это может быть полностью излишним, в зависимости от эволюции, которую вы видите в отношении статистики.
Вы можете представить класс SkillSet (или Stats ) (я использую C-подобный синтаксис для этого ответа):
Тогда у героя будет поле intrinsicStats типа SkillSet. Оружие может иметь модификатор skillSet.
Это, конечно, пример, чтобы дать вам идею. Вы также можете использовать шаблон проектирования Decorator, чтобы модификаторы статистики работали как «фильтры», которые применяются один за другим…
источник
Вероятнее всего, ООП-способ делать что-то с наследованием. Ваш базовый класс (или суперкласс в зависимости от языка) будет персоной, тогда, возможно, злодеи и герои унаследуют от базового класса. Тогда ваши герои, основанные на силе, и герои, основанные на полете, разветвляются, например, потому что у них другой вид транспорта. Это дает дополнительный бонус за то, что ваши компьютерные игроки могут иметь тот же базовый класс, что и игроки-люди, и это, надеюсь, упростит вашу жизнь.
Другая вещь, касающаяся атрибутов, и это менее специфично для ООП, состоит в том, чтобы представлять атрибуты вашего персонажа в виде списка, чтобы вам не нужно было явно определять их все в вашем коде. Поэтому, возможно, у вас будет список оружия и список физических атрибутов. Создайте некоторый базовый класс для этих атрибутов, чтобы они могли взаимодействовать, чтобы каждый из них определялся с точки зрения ущерба, стоимости энергии и т. Д., Поэтому, когда два человека собираются вместе, относительно ясно, как будет происходить взаимодействие. Вы должны были бы перебрать список атрибутов каждого персонажа и вычислить урон, который один наносит другому, со степенью вероятности в каждом взаимодействии.
Использование списка поможет вам избежать переписывания большого количества кода, поскольку для добавления символа с атрибутом, о котором вы еще не думали, вам просто нужно убедиться, что он взаимодействует с вашей существующей системой.
источник
Я бы порекомендовал менеджер типов статистики, заполняемый из файла данных (например, я использую XML) и объектов Stat, с типом и значением, хранящимся в символьной таблице в качестве хеш-таблицы, с уникальным идентификатором типа статистики в качестве ключа.
Изменить: Псудо код
источник
StatType
класс ненужным, просто используйтеname
вStatType
качестве ключа. Как сделал Гримстон. То же самое сStats
.Try постараюсь дать вам пример того, как вы можете создать свой арсенал и свой арсенал.
Наша цель - разделить сущности, поэтому оружие должно быть интерфейсом.
Предположим, что у каждого игрока может быть только одно оружие, мы можем использовать его
Strategy pattern
, чтобы легко менять оружие.Другим полезным шаблоном будет шаблон нулевого объекта на случай, если игрок безоружен.
Что касается арсенала, мы можем носить несколько защитных средств.
Для развязки я создал интерфейс для защитника.
И
Player
класс.Давайте добавим немного игрового процесса.
Вуаля!
источник