Как мне правильно написать код
Всем привет. Нужна помощь от владеющих 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);
}
}
}
}
Я пока реализовал только через ООПНуууу нет. У тебя класс Program делает вообще всё: и заполняет данные, и обрабатывает и выводит.
Вообще у тебя три одинаковых блока кода, отличаются только тем что выйдет в консоль и тем что подается в цикл. Ты бы это мог передавать параметрами в метод ChooseRandomPerk и вызвать его три раза. Так же ты бы мог добавить цвет в свойства класс perk и обрабаывать как один массив не вызывая три раза.
Ну и по логике, тебе впринципе не нужен цикл, ты можешь просто обратиться к нужному элементу и вывести его параметры
Не вникал в логику, но вынеси перки в отдельный статический класс. Можно отдельным файлом. Уже будет лучше.
При чем ты можешь сделать AllPerks, в нем Red, Blue, Yellow, и дальше уже в них отдельные перки.
Выбери как тебе удобнее, проще и привычней писать. В данном случае не важно как до тех пор пока оно работает.
Понял, спасибо!
Наверно повторюсь во многом, но вот что приходит лично мне в голову.
Ты упомянул, что данный код - лишь часть программы, поэтому исходя из того, что ты привел:
Во-первых, у тебя логика перемешана с данными, так лучше не делать. Вынеси и храни перки где-то в другом месте, лучше вообще в каком-нибудь json, который можно поменять без необходимости собирать программу заново.
Да, нет необходимости гонять циклы, просто бери элемент по рандомному индексу. Я бы добавил приватный метод. который принимает на вход массив и возвращает\выводит рандомный элемент из него.
Не очень понятно, где применяется haveInfluence, ты говоришь, что должен браться всегда один перк, который имеет влияние и остальные без.
Может стоит группировать их по этому признаку тоже? Perk является классом, так что ты можешь создать еще два массива, сложить туда объекты которые влияют и не влияют. И брать один рандомный с первого массива и остальное нужно количество со второго.
Нужна ли тебе группировка по цвету вовсе - тоже тяжело сказать.
По поводу Dictionary, ты можешь использовать для ассоциации цвет => перки, но мне кажется это меньшая из проблем.
Блин интересная тема, а я уже спать(
Слышь. Помогай.