Как мне правильно написать код

Всем привет. Нужна помощь от владеющих C#.

Я пишу программу которая выводит на экран рандомный комплект для игры COD: Modern Warfare 2019. В комплекте есть перки - и один из них влияет на комплект (остальные на геймплей). Соответственно программа выводит рандомные перки (а также их описание). Вопрос - как мне лучше реализовать? Через ООП или через Dictionary<string, string> (в первом string название перка, во втором его описание). Привожу фрагмент кода, дабы вам стало понятнее

Я пока реализовал только через ООП. Спрашиваю, потому способ через ООП занимает много строк и мне кажется это не очень хорошо

public class Perk { public string name; public string desc; public bool haveInfluence; public Perk(string Name, string Desc, bool have_Influence) { name = Name; desc = Desc; have_Influence = haveInfluence; } }
class Program { //объект, создающий случайные числа static Random rand = new Random(); static int rnd = 0; //синие перки static Perk OverKill = new Perk("Фора", "Позволяет носить два основных оружия.", true); static Perk QuickFix = new Perk("Быстрое лечение", "За убийство врагов, захват и удержания целей скорость восстановления здоровья будет увеличена.", false); static Perk Cold_Blooded = new Perk("Хладнокровный", "Вы становитесь невидимым для системы прицеливания ИИ и тепловизоров, а также невосприимчивым к «Сканирующей гранате».", false); static Perk E_O_D = new Perk("Сапёр", "Снижает урон от взрывчатых веществ и огня, не являющихся киллстриками. Позволяет взламывать вражеские «Клейморы», противопехотные мины, C4 и систему активной защиты.", false); static Perk DoubleTime = new Perk("Бегом марш!", "Удваивает продолжительность тактического бега. Увеличивает скорость передвижения на 30% во время приседания.", false); static Perk[] bluePerks = { OverKill, QuickFix, Cold_Blooded, E_O_D, DoubleTime }; //красные перки static Perk Restock = new Perk("Пополнение", "Восстанавливает снаряжение за 30 секунд после использования.", false); static Perk Hardline = new Perk("Упрямец", "Киллстрик стоит на одно убийство меньше.", false); static Perk High_Alert = new Perk("Бдительность", "Экран начинает мигать, когда враги видят вас за пределами вашего поля зрения.", false); static Perk Ghost = new Perk("Призрак", "БПЛА, радиолокационные БПЛА и датчики сердцебиения не смогут вас обнаружить. Также скрывает маркеры убитых вами врагов.", false); static Perk KillChain = new Perk("Массовое убийство", "Убийства, совершенные каким-нибудь киллстриком, засчитываются для получения следующей серии убийств. Относится только к киллстрикам в рамках одной жизни.", false); static Perk PointMan = new Perk("Дозорный", "Превращает серию убийств в серию очков.", false); static Perk[] redPerks = { Restock, Hardline, High_Alert, Ghost, KillChain, PointMan }; //желтые перки static Perk TuneUp = new Perk("Настройка", "Снижает время зарядки полевых модификаций на 33%.", false); static Perk Amped = new Perk("Прокачка", "Увеличивает скорость смены оружия и скорость перезарядки ракетной установки.", false); static Perk Shrapnel = new Perk("Шрапнель", "При возрождении даёт вам дополнительную единицу летального снаряжения. Урон, нанесённый при помощи взрывчатки, замедляет регенерацию здоровья у врагов.", false); static Perk BattleHardened = new Perk("Ветеран", "Сила воздействия вражеских эффектов вспышки, оглушения и ЭМИ снижается.", false); static Perk Spotter = new Perk("Наблюдатель", "Позволяет видеть вражеское снаряжение, полевые модификации и киллстрики сквозь стены. При прицеливании вы можете помечать их для своей команды.", false); static Perk Tracker = new Perk("Следопыт", "Враги будут оставлять за собой следы. Также позволяет видеть метки на местах смерти врагов и скрывать их.", false); static Perk[] yellowPerks = { TuneUp, Amped, Shrapnel, BattleHardened, Spotter, Tracker }; static void Main(string[] args) { ChooseRandomPerk(); } static void ChooseRandomPerk() { rnd = rand.Next(0, bluePerks.Length); for(int i = 0; i < bluePerks.Length; i++) { if(rnd == i) { Console.WriteLine("Голубые перки"); Console.WriteLine(bluePerks[i].name); Console.WriteLine("Описание - " + bluePerks[i].desc); } } rnd = rand.Next(0, redPerks.Length); for (int i = 0; i < redPerks.Length; i++) { if (rnd == i) { Console.WriteLine("Красные перки"); Console.WriteLine(redPerks[i].name); Console.WriteLine("Описание - " + redPerks[i].desc); } } rnd = rand.Next(0, yellowPerks.Length); for (int i = 0; i < yellowPerks.Length; i++) { if (rnd == i) { Console.WriteLine("Желтые перки"); Console.WriteLine(yellowPerks[i].name); Console.WriteLine("Описание - " + yellowPerks[i].desc); } } } }
77
20 комментариев

Я пока реализовал только через ООПНуууу нет. У тебя класс Program делает вообще всё: и заполняет данные, и обрабатывает и выводит.

Вообще у тебя три одинаковых блока кода, отличаются только тем что выйдет в консоль и тем что подается в цикл. Ты бы это мог передавать параметрами в метод ChooseRandomPerk и вызвать его три раза. Так же ты бы мог добавить цвет в свойства класс perk и обрабаывать как один массив не вызывая три раза.

Ну и по логике, тебе впринципе не нужен цикл, ты можешь просто обратиться к нужному элементу и вывести его параметры

6
Ответить

Не вникал в логику, но вынеси перки в отдельный статический класс. Можно отдельным файлом. Уже будет лучше.
При чем ты можешь сделать AllPerks, в нем Red, Blue, Yellow, и дальше уже в них отдельные перки.

3
Ответить

Выбери как тебе удобнее, проще и привычней писать. В данном случае не важно как до тех пор пока оно работает.

3
Ответить

Понял, спасибо!

Ответить

Наверно повторюсь во многом, но вот что приходит лично мне в голову.
Ты упомянул, что данный код - лишь часть программы, поэтому исходя из того, что ты привел:

Во-первых, у тебя логика перемешана с данными, так лучше не делать. Вынеси и храни перки где-то в другом месте, лучше вообще в каком-нибудь json, который можно поменять без необходимости собирать программу заново.

Да, нет необходимости гонять циклы, просто бери элемент по рандомному индексу. Я бы добавил приватный метод. который принимает на вход массив и возвращает\выводит рандомный элемент из него.

Не очень понятно, где применяется haveInfluence, ты говоришь, что должен браться всегда один перк, который имеет влияние и остальные без.

Может стоит группировать их по этому признаку тоже? Perk является классом, так что ты можешь создать еще два массива, сложить туда объекты которые влияют и не влияют. И брать один рандомный с первого массива и остальное нужно количество со второго.

Нужна ли тебе группировка по цвету вовсе - тоже тяжело сказать.

По поводу Dictionary, ты можешь использовать для ассоциации цвет => перки, но мне кажется это меньшая из проблем.

2
Ответить

Блин интересная тема, а я уже спать(

1
Ответить

Слышь. Помогай.

1
Ответить