Определите структуру или тип класса, который содержит все свойства, которые имеют все различные виды оружия.Создайте массив [40] этого типа оружия и сохраните его как свойство типа игрока.Определите перечисление целых чисел для использования в качестве именованных индексов в массиве оружия.Пистолет = 0, Дробовик = 1 и т. Д. Используйте эти имена перечислений для индексации массива оружия в вашем коде.
В редких случаях, когда вам нужно найти оружие по строковому имени, вы можете просто сканировать массив оружия, пока не найдете оружие, имя которого соответствует тому, что вы ищете.Захватите индекс этого оружия и выбросьте имя строки, чтобы все дальнейшие операции выполнялись с помощью индексированного массива.Стоимость линейного сканирования по 40 объектам не будет заметна.
Если вам действительно действительно нужно избегать сканирования списка на предмет совпадения имени, вы можете создать словарь, чтобы обеспечить быстрый поиск по имени.Вы захотите, чтобы записи словаря возвращали оружие конкретного игрока, поэтому вам понадобится отдельный экземпляр словаря для каждого игрока, и он будет храниться в поле объекта игрока.Если простого сканирования достаточно (почти наверняка), не беспокойтесь о словарном подходе.
Независимо от того, определяете ли вы тип оружия как структуру или класс, это структурированный тип, и высоздаем экземпляры этого типа каждый раз, когда вы его используете.40 экземпляров на игрока.Основное различие между классом и структурой состоит в том, где / как распределена память и копирует ли присвоение значения или нет.Если вы осторожны, чтобы никогда не назначать оружие из массива в локальную переменную оружия, и вы не используете словарь, описанный выше, или делаете что-либо еще, чтобы делиться ссылками на те же данные об оружии, тогда структура должна быть в порядке.Если сомневаетесь, используйте класс.
Вам не нужно беспокоиться о том, какое оружие будет выброшено, когда игрок уходит - пока массив оружия является единственной вещью, которая сохраняет долгосрочную ссылку наоружие, тогда они все будут уничтожены, когда игрок будет уничтожен.Правильная инкапсуляция и минимизация перекрестных ссылок между различными объектами помогут здесь.
Если вы уверены, что ваш выбор оружия всегда будет иметь одинаковые переменные и одинаковые действия (методы), то вы можете обойтись с помощьюодин тип оружия для всего оружия, и этот тип может быть структурой или классом.
Если вы начинаете попадать в особые случаи, когда это действие ведет себя по-разному для этого оружия, или у этого оружия есть дополнительные данные, которые ни один издругое оружие нужно, тогда вы должны определить базовый класс оружия и его потомков для специализации по мере необходимости.