Как дурак C# учил. Часть 1


    Запись 1


    Я решил записывать. Главным образом потому, что я люблю записывать. Хотя нет. На самом деле мне хочется рассказать историю. Историю о том, что программирование это интересно. О том, что программирование может быть не только, профессией, но и отличным хобби, как фотография, шахматы, живопись или игра на гитаре. О том, что не обязательно иметь врожденный талант, суперсилу или годы специального образования чтобы добиться маленьких, но больших побед в любом деле.

    Это дневник человека, изучающего программирование для удовольствия. Не для профессии, не для заработка. Я не живу в Нигерии с кнопочным телефоном и не нахожусь в отчаянном положении. Я просто учусь и программирую для развлечения в свободное от работы и семейных дел время. Шоу в реальном времени. Публикуется пачками по 5 записей.

    Отчего-то сложившийся менталитет (мой и окружающих) как бы защищает нас от смелых экспериментов с чем-то новым. «Я не умею» — звучит как чёртов смертный приговор. Я каждый день вижу это на работе, когда коллеги сталкиваются с незнакомой задачей. Я не умею. Конец программы.

    Мой семилетний сын боится пробовать незнакомые занятия. Потому что не умеет. А надо понимать, что в свои годы он не умеет очень многого.

    Иногда я говорю ему “Приятель, если бы люди делали только то, что умеют, мы бы до сих пор жили в пещерах, а конкретно ты целыми днями мычал, ползал и какал в штаны, вместо игры в Angry Birds. Хотя нет, ты бы ползал без штанов, потому что никто не умел бы шить”.

    К чему это я? К тому что я совершенно не умею программировать. Но собираюсь научиться. Не потому, что хочу стать разработчиком — профессия у меня уже есть. А потому что могу. Хотя вообще-то у меня есть целых три причины.

    Первая — размять мозг. Я убежден, что нельзя строить жизнь вокруг какой-то одной деятельности. Надо занимать свой ум разными задачами. И чем они будут разнообразнее — тем для ума лучше.

    Вторая причина — практическая. Я собираюсь написать игру (банально, да), в которую мы с мелким будем играть и веселиться.У нас уже есть идея — в прошлой итерации мы пробовали сделать настолку, но механика оказалась слишком сложна.

    Третья причина — образовательная. Я попробую изменить отношение общества к программированию. Принято считать, что программирование — удел профессионалов. Никто не занимается программированием в качестве хобби. Такого понятия, как “любительское программирование” (запомните это слово) его вообще не существует.

    Часть читающих меня профи сейчас набросится с комментариями о том, что я обесцениваю их профессию и наработанные годами скиллы. Не спешите. Пока просто поверьте мне, что это не так, а мы к этой теме еще потом вернемся.

    Короче, я решил учить C#. Потому что для моей идеи нужен движок, и я так понял, что лучше всего Unity. А Unity — это C#. Это первое.

    Второе, что я понял — начинать с Unity рановато. Почти все обучающие материалы исходят из того, что читатель уже знаком с языком. А всё, что я знаю про C# — это то, что правильно говорить «Си Шарп», а не «Цэ с решёткой». Так что начнём с самого языка.

    Третье, что я понял — обучение будет основательным. Поскольку шарп для меня новый язык, нужно что-то “для чайников”, а такого нет.

    Есть учебник “C# для школьников” Мартина Дрейера, но читать его решительно невозможно. Во-первых, знакомство с программированием у него начинается с изучения классов и объектов. Слишком сложно и непонятно. Во-вторых, на один абзац сути приходится три страницы примеров из реального мира. Слишком много. Я не готов тратить столько времени на историю о том, как девочка на необитаемом острове убеждает робота-инопланетянина заставить слона сорвать кокос.

    Есть другая крайность. Уроки с сайта mycsharp.ru и “Полное руководство по языку программирования С# 8.0 и платформе .NET Core 3” на metanit.com/sharp/tutorial

    Тут есть примеры кода, из которых можно что-то переиспользовать, но примеры слишком абстрактные типа “Давайте напишем программу, которая помещает в память объекты a, b и c, это же так увлекательно!”. Но это чуть лучше, чем слоны и кокосы, тем более, что у меня есть своя методика обучения.

    В общем, я решил, что справлюсь и отправляюсь устанавливать Visual Studio.

    Запись 2


    Всё пошло не по плану. На следующий день, я словил Чёрный экран. Так и не понял, что это было, но похоже, что видеодрайвер обновился вперёд Windows и оказался несовместим со старой версией.

    Когда-то я был аккуратен в подобных вещах. При любых проблемах просто восстанавливал раздел с ОС из бережно приготовленного образа, но это было давно. Винда стала стабильнее, я стал беспечнее. И вот.

    Я провел неделю в попытках всё поправить. Перепробовал все рецепты. Нашел способ запустить командную строку, добыл древний Far, перенёс файлы, с третьей попытки подобрал подходящую сборку (я пользуюсь кастомизированной виндой) с уже установленным проблемным обновлением.

    Тут надо сказать пару слов о моем бэкграунде. Я не умею программировать, но в общем-то считаю себя достаточно компьютерным человеком. Лет в 8 у нас дома появился первый в моей жизни ПК. Packard Bell 486. Крутой по тем временам. На нём было две программы — Лексикон и Инфо-бухгалтер.



    Я играл в Лексикон.

    Из символов I, / и \ я рисовал гоночную трассу, а курсор был машиной. Такие вот прибитые к полу игрушки. Ни интернета, ни друзей с компьютерами (поначалу). Я развлекался, как мог.

    Кроме двух программ к компу прилагался полноценный MS-DOS на стопке дискет и я часто экспериментировал с разными командами. Дошёл и до такой, которая называлась QBASIC.

    В бэйсике был небольшой мануал, и я кое-что понял. Выучил одну или две команды, и смог писать программы, которые выводили на экран какие-нибудь буквы. Было круто.

    Кроме того в старших классах были уроки информатики. Turbo Pascal. Нас учили писать настоящий код. Разумеется, в тетрадях. Но у меня был компьютер (уже какой-то Пентиум) и я мог практиковаться.

    Так я познакомился с самыми элементарными вещами. Конструкциями if-then-else и циклами. Вершиной моего мастерства стала программа «Рулетка». Рулетка была игрой. Ты выбираешь число от 0 до 10 и делаешь ставку. Угадал — бонус, нет — потеря ставки. И так, пока не кончатся деньги. Я очень гордился.

    Тем не менее, я был полным гуманитарием и не стал связывать свою жизнь с информатикой. Так что после школьных экспериментов я не вспоминал о программировании примерно 19 лет.

    О! Кажется, установка Visual Studio завершена. Какая красивенькая. Чёрненькая вся. Давайте разбираться, что тут к чему.

    Запись 3


    Вообще-то это не первая моя попытка программирования. Где-то год назад на меня уже находила блажь, и я пробовал VBA. Смог освоить синтаксис нескольких команд и написал такую же рулетку, как тогда в школе. Только лучше. Теперь у меня был графический интерфейс из полей и кнопок, а также функции сохранения и загрузки игры (данные хранились в excel-таблицах).

    Тем не менее я довольно быстро это дело бросил. По большей части от невозможности нормально использовать изображения, а может ещё и от лени. Не помню точно. В любом случае будем считать мой VBA-опыт своего рода разминкой. Теперь же пришло время настоящего хардкора.

    За шарпом я провёл 4-5 вечеров. Прочитал две главы из учебника. Что я могу сказать? Меня совершенно не вдохновляет академический подход, основанный на написании бессмысленных программ, делающих абстрактрые вычисления. Не уверен, что смогу гордиться приложением, которое считает площадь треугольника.

    Так что я придумал свой учебный план. С блэкджеком и… ну почти. Я выучил несколько самых важных команд: Console.WriteLine для вывода надписей, Console.Readline для ввода с клавиатуры, арифметические операции, условную конструкцию if-else, цикл while и конечно же Random для случайных чисел.

    Наверное, вы уже догадались. Я снова написал консольную рулетку :)



    Ощущения — восторг. Она работает! В ней можно проиграть или выиграть! И это настоящая программа — в ней 68 строк непонятного кода, в том числе целых 5 вызываемых методов.

    Сложно ли было? Да. Я читал мануалы, допускал ошибки и всё ломал, тратил часы на поиск дефектов, снова читал мануалы, путался в коде и несколько раз всё переписывал, упрощая конструкции в циклах и убирая лишние переменные.

    Но результат того стоил. Я полон надежд и двигаюсь дальше.

    Запись 4


    Первое препятствие. Дошел до понятия классов и объектов. Понятие совершенно непонятно. Как бы сама идея ясна, но как и для чего её применить? Создать классы для игрока, казино и рулетки? Потом придумывать объекты в них? И что они будут делать? Слишком притянуто. Кажется чем-то неестественным и только запутывает программу.

    Дошло до меня через несколько дней. Я гулял с сыном на детской площадке и смотрел на мир вокруг объектно-ориентированными глазами.

    class Парк {string ПаркName;}, 
    class Ребёнок {string РебёнокName; int РебёнокAge;} 
    Ребёнок Дима = new Ребёнок ();
    Ребёнок Саша = new Ребёнок ();



    И тут я всё понял. Моя программа-рулетка слишком тупая и примитивная. Там просто не нужны классы. Это было хорошее упражнение для освоения процедурного программирования, но не более того.

    Надо было придумать новое упражнение, чтобы понять классы. И я придумал. Прямо вот сел на лавочке и на телефоне написал себе задачку. Сделать мини-RPG. Там будет герой со своими параметрами силы и здоровья. Каждый ход он будет заходит в новую пещеру и встречать там тролля со своими параметрами. Они будут сражаться, бросая кубик, как в Невервинтере. А еще там можно будет найти оружие и доспехи.

    Основные классы напросились сами собой:

    • Герой (сила, здоровье, деньги)
    • Предмет (урон, броня, прочность)
    • Монстр (сила, здоровье)

    Должно получиться интересно. Справлюсь? Легко. Поехали.

    Запись 5


    Легко не получилось. Я достаточно быстро набросал классы с полями. Выяснил из учебника, что такое конструктор и запилил конструкторы брони и оружия. Сделал интерфейс, попутно разобравшись, как менять цвет текста.

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



    И даже это не было просто. Я постоянно натыкался на ошибки. Особенное при переносе кода в методы. Какая-то фигня не существует в каком-то контексте. Другая фигня недоступна из-за уровня защиты…

    Мне очень не хватало какого-то руководства для чайников по структурированию кода. Куда поместить метод для генерации предмета? В класс Item? В класс Program? Просто оставить в коде? Приходится экспериментировать, ловить и исправлять ошибки.

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

    Дальше эйфория кончилась и начался ступор. Я сумел сгенерировать два предмета, вручную, присвоив им названия Weapon1 и Armor1. Но мне потребуется делать это после каждого хода, копить их в инвентаре, менять… Как сделать создание объектов программно? Как генерировать их названия и тем более выбирать нужные для изменения их параметров?

    С VBA было проще. В интернете полно примеров скриптов под каждую частную задачу. Найти и переиспользовать нужный — не проблема. Очень часто я вообще не понимал, половину написанного кода, но он волшебным образом работал, а тут приходится разбираться.

    Учебник не помогает. Там уже рассказывают про лямбда-выражения и многопоточность, а примеры до сих пор на уровне “Найти сумму всех четных чисел в ряде чисел”. Скукота. Поиск в интернете тоже не даёт ответов, потому что я как-то не так формулирую вопрос.

    Подозреваю, что надо подключать базу данных и записывать объекты туда. Придётся мне учить SQL.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 107

    • НЛО прилетело и опубликовало эту надпись здесь
        +3
        Ещё на .net митапы сходить несколько раз, если у вас в городе они проходят.

        На них все же требуется уровень не ниже среднего.

          +1

          Dimtry44 очень точно подметил:


          Для того чтобы было легче, надо наставника найти, хорошего

          Мне вспомнилось как я постигал азы программирования.
          Я учился в Академии им. Ф.Э.Дзержинского на кафедре № 25, кафедра программирпования. Мы были вторым набором программистов (1971 год). У меня после Казанского СВУ не было никаких проблем с учебой (многие предметы сдавал экстерном). Но началось программирование и я никак не мог постичь физику предмета: какие-то ячейки, адреса, параметры, аргументы. Короче темный лес. Учился со мной Гена Хренков, который звезд с неба не хватал. Когда я ему рассказал о своих проблемах, он удивился и сказал, а чего здесь не понятного. Берем три коробка со спичками. Это три ячейки. Открываем первый коробок и смотрим сколько в ней спичек, это будет значение первой ячейки. Аналогично для второго коробка. Потом в зависимости от операции складываем или вычитаем. Берем столько спичек каков результат и кладем в третий коробок. Вот мы и запрограммировали сложение/вычитание чисел. Не надо забывать, что это был 1972 год и накаких Си и т.п. еше не было. А были одно, двух или трехадресные машины.
          Урок я усвоил и с тех пор не знаю никаких проблем в программировании.
          Кстати, а Гена Хренков, к сожалению, не стал программистом.
          А для языков высокого уровня коробки со спичками просто незаменимы.

            +3
            … это был 1972 год и накаких Си и т.п. еше не было. А были одно, двух или трехадресные машины.

            Не всё было столь печально.
            В те годы в Советском Союзе был достаточно распространен и использовался для обучения студентов Алгол, язык вполне высокоуровневый.
            Практически на всех буржуйских компьютерах и на некоторых советских был доступен язык Фортран, который являлся универсальным языком программирования до того, как Си в этом качестве его вытеснил. На Фортране были реализованы вполне себе масштабные проекты, в том числе требующие объектно-ориентированного подхода (просто это тогда так не называлось). Оптимизирующий компилятор с Фортрана для компьютеров IBM был написан на Фортране. Кстати как раз в 1972 году Фортран был впервые стандартизован (FORTRAN 66).
            В министерстве обороны США (US Department of Defense) с начала шестидесятых в качестве стандарта использовался язык Кобол (COBOL), тоже не то чтобы ассемблер.
            Так что проблемы трудного детства несколько преувеличены.
              +1
              Так что проблемы трудного детства несколько преувеличены.

              А кто писал о трудном детстве?! Уж точно не я. Во-первых, не детство, а юность, и она была прекрасна. И помимо Алгола, Фортрана и того же Cobol-а, нам преподавли (1973-1976 г.г., Советский Союз) и Ассемблер, и Алмо, и PL/1, и RPG и много чего другого. И писал я не о трудностях, а о своем личном понимании программирования.

            0
            Я вот новичок, никто из друзей/знакомых не учит и не учил программирование. Вот где найти наставника или приятеля с которым можно вместе учить и спорить? Может посоветуешь что то?
              0

              Конечно. Самоучитель. В моем случае это был самоучитель по VBA. Для него достаточно иметь Excel и можно неплохо познакомиться с процедурным прогоаммированием.


              Главное — не в учебных материалах. Главное — иметь задумку, которая будет мотивировать. Для большинства любительских проектов достаточно освоить 10-15 команд, погружаться в дебри не надо.


              Для меня это пока работает.

                0
                Да! Согласен, без мотивационного зуда — «хочу сделать вот такое вот», сложно учиться))
                Я под эту лавочку месяца за 3-4 вечерами и с убунтой подружился, и Апач настроил, и веб-приложение на питоне сконструировал, и оно даже умеет «в уме» запускать браузер, делать скриншоты, тащить инфу с сайта, перерабатывать ее и делать финальный документ на базе всего этого. Одна беда — безопасники на работе не разрешили использовать сервис, лежащий на сторонних серваках. Сейчас пытаюсь развернуть это все внутри локальной сети на работе, но сколько при этом ограничений, жесть. Все, что на своем сервере делается парой команд, тут надо согласовывать)))
            +6

            А помойму годная и задумка и подача материала. Автор молодец. Жду следующую пачку.

              +1

              Спасибо. Я пока нудно разбираюсь с коллекциями, но как только материал накопится — выложу.

                +2
                у вас дети неправильно инициализируются (возраст явно не указан и конструктор не перегружен)
                  0

                  Дети же инициализируются int ChildAge = 0, нет?

                    0
                    А имя по дефолту {0x00}
              0
              Рекомендую книгу Developing 2D Games with Unity: Independent Game Programming with C# автор Jared Halpern. Книга написана на очень понятном английском языке, весь код объясняется, даже с минимальными знаниями C# и ООП можно будет разобраться. При этом в книге рассматривается создание простой RPG.
                0
                Есть еще хорошая Begin to Code with C# от Rob Miles.
                  0

                  Ух ты. Мне пока до Unity далеко, но книгу положу в список.

                  +2

                  Дурак — глупый человек. Вряд ли автор является таковым, особенно учитывая контент статьи. Так что заголовок кликбейтный.

                    0
                    Дурак — глупый человек.

                    Учим матчасть:

                    Иван-дурак (Иванушка-дурачок) — один из популярнейших героев русских, а также белорусских и украинских[1][2] волшебных сказок.

                    Один из классических образцов «иронических удачников» в русской волшебной сказке, третий младший сын у царя, на которого никто не обращает внимания. Он прислушивается к советам и учится, в отличие от надменных старших братьев, и в результате получает богатство и царевну в жёны[3]. Воплощает особую сказочную стратегию, исходящую не из стандартных постулатов практического разума, а опирающуюся на поиск собственных решений, часто противоречащих здравому смыслу, но, в конечном счёте, приносящих успех. Имеет некоторые черты трикстера. А. М. Панченко указывал на близость сказочного дурака к юродивым[4].
                    Материал из Википедии
                      0

                      Ну тогда надо было употребить "Иван-дурак" :)

                        0

                        Но я не Иван… Да и вообще так — в рифму

                      +3

                      Спасибо на добром слове. Я как-то по аналогии с народными сказками выдумал заголовок. Там дурак — это скорее чудак, который делает странное.

                        0
                        Там дурак — это скорее чудак, который делает странное.

                        Скорее, человек обладающий нестандартным мышлением.
                          +1
                          «Глупость — это не отсутствие ума, это такой ум.» — А.И.Лебедь
                      +15
                      Никто не занимается программированием в качестве хобби. Такого понятия, как “любительское программирование” (запомните это слово) его вообще не существует.

                      Да ладо. В прошлом почти все начинали с любительского, они наверно так не думают
                        0
                        Не удивлюсь, если многие читатели этой статьи с любовью вспомнят какой-нибудь спектрум, а что это, как не любительское. :-) прошёл мимо меня.
                          0
                          МК-54, статьи в «Технике-молодежи», игры «Посадка на Луну» и прочие…
                        0

                        Если когда нибудь мне надо будет сделать рулетку, я не задумываясь обращусь к автору статьи. Спасибо, хорошая статья, с утра подняла настроение!

                          +2
                          Читал по диагонали, после предложения
                          Я живу в Нигерии с кнопочным телефоном и нахожусь в отчаянном положении.
                          история заиграла новыми красками, стал искать тег «перевод». Скрины на русском удивили. Всё из-за моей невнимательности.
                          • НЛО прилетело и опубликовало эту надпись здесь
                              0
                              Вау! Единомышленник! Это очень здорово. А Вы пробовали вызвать rnd два раза подряд без задержки? Я так понимаю, корень его рандомности в системном времени, поэтому одномоментные вызовы дают одинаковый результат.
                                0
                                Да, и это не баг, это фича! В моем «курсе» рассказывал ребятам про это. Сейчас попробую найти ссылку с привязкой по времени.
                                PS: Увы, скорее всего разбирал на стримах ЕГЭ (объяснял на PascalABC.Net). Надо бы собрать отдельное видео по этой теме.
                                  +2
                                  Класс Random — это класс для генерации псевдослучайных последовательностей из некоего базового значения. Т.е. вызов
                                  var rnd = new Random();
                                  эквивалентен вызову
                                  var rnd = new Random(DateTime.Now.Millisecond);

                                  DateTime обновляется раз в, примерно, 16 миллисекунд — это приводит к тому, что все созданные в этот промежуток времени экземпляры генератора выдадут одинаковые последовательности. Поэтому обычно создают один статический экземляр Random уровня модуля.

                                  Или можно использовать RNGCryptoServiceProvider в случае если требуется что-то пригодное для криптографии, или спецефических задач (вроде генерации кодов подтверждения).
                                    +1

                                    Также не стоит забывать, что дефолтный Random не потокобезопасный, т.е. при многопоточном обращении его нужно заворачивать в lock.

                                      0

                                      Крайне рекомендую прочитать, что такое "Линейный конгруэнтный генератор" и тогда все станет понятно :) Несмотря на умное слово в середине, вещь поразительно простая. Не то, чтобы так работали все ГПСЧ (генератор псевдо-случайных чисел, PRNG на вражеском), скорее наоборот, но зато станет понятно что такое seed и какие ограничения бывают. Можете даже свой ГПСЧ написать :)


                                      https://ru.m.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4

                                        0
                                        Вы так пишете, будто на .net отсутствует документация в свободном доступе и сакральные знания о поведении классов можно получить только экспериментальным путем
                                          0

                                          Конечно же я документацию от Микрософта читаю первым делом. Но там половина слов непонятная. И нет объяснения что это, для чего поименяется и когда надлежит использовать.

                                            0
                                            Но там же прям параграф про это:
                                            docs.microsoft.com/ru-ru/dotnet/api/system.random?view=netframework-4.8#avoiding-multiple-instantiations

                                            Я не заради позлорадствовать, но это же прям в содержании написано.
                                              0
                                              Вот я щас глупость скажу, но тем не менее. Ок, я создам один раз
                                              Random RandomNumber = new Random();
                                              Но мне же в разных местах кода потребуются случайные числа в разных диапазонах. А иногда два разных случайных числа в одном диапазоне. Они разве не будут одинаковы, если я последовательность сгенерирую один раз на всю программу?
                                                0

                                                Вы потом вызываете var i = RandomNumber.Next() и каждый раз получаете новое сгенерированное число.
                                                Или вы вызываете RandomNumber.Next(min, max) и получаете новое число в диапазоне min<>max.


                                                Или вы что-то другое имели ввиду?

                                                  0
                                                  Попробовал. Не работает.
                                                  Random RandomStat = new Random();
                                                  находится в классе Item. Вызывается из конструкторов дочернего класса Armor
                                                  ItemArmor = RandomStat.Next(1, 10);
                                                  которые инициализируются через List.Add
                                                  armorList.Add(new Armor(true));
                                                  И при последовательных вызовах без задержки генерирует доспехи с одинаковой бронёй.
                                                    0

                                                    То есть, каждый Item создаёт свой Random? Тогда в этом и проблема. Можно создать Random на уровень выше и передавать в конструкторы брони и оружия. Тогда все предметы создаваемые подряд будут использовать один и тот же объект Random, и проблема решится.

                                                      0

                                                      Выше написанное решение по идее должно помочь. Ну или делаете RandomStat статическим атрибутом Item и инициализируете его ровно один раз. Скажем при старте вашей программы.

                                                        0
                                                        Можно еще «глобальную переменную» добавить. Сделать класс (или взять App) и в нем добавить
                                                        class App {
                                                        //...
                                                            public static Random RandomStat = new Random();
                                                        //...
                                                        }
                                                        и далее везде использовать его:
                                                          var rndNum = App.RandomStat.Next(10,100);


                                                          0
                                                          Я вот не понимаю, зачем вообще делать объектом математическую функцию, по сути. Тем более, когда реализация не синглтоном приводит к таким вот казусам.
                                            • НЛО прилетело и опубликовало эту надпись здесь
                                              +4
                                              Странно, у меня сложилось обратное мнение, что C# более прост и логичен по синтаксису, чем питон.
                                                0
                                                логичен — мб, прост- точно нет
                                                на питоне вы можете выплюнуть

                                                print("Hello world!")

                                                и это работает)
                                                  +2
                                                  using static System.Console;
                                                  //...
                                                      WriteLine("Hello world!");
                                                  //...
                                                  

                                                  А в целом соглашусь. Обвеска классом, пространством имен немного отпугивает новичков, чем Python и подкупает. Но стоил лишь добраться до кастомных структур данных, ООП, и Python начинает проигрывать.
                                                    0

                                                    Обвеска пространством имен необязательная.

                                                      0
                                                      Да, но в учебниках для новичков об этом крайне редко упоминают.
                                                        +1
                                                        обвеска классом обязательна, да и точка входа необходима
                                                        0

                                                        с CSharp плохо знаком, просто интересно, в чем Python ему проигрывает?

                                                          +1

                                                          В динамической типизации (ошибки во время запуска, а не компиляции), в скорости.

                                                            0

                                                            Это понятно, я имел ввиду в контексте кастомных структур и ООП

                                                              +1
                                                              ИМХО, для меня ООП на Python это некий «Тяп-Ляп», ажурная конструкция, которая может быть будет работать. А ООП на C# это сборка звездолета, в котором все механизмы проверяются еще на этапе кодирования/проектирования, где VS, как некий бот помощник, каждую секунду подсказывает что-нибудь. Для меня оптимально на Python небольшие скрипты писать, не более.
                                                        +2
                                                        Но в шарпе я могу код хоть в одну строку весь написать, или другими извращениями структуру кода менять — код будет работать. Стоит в питоне потерять один отступ — и пошло веселье. А при копипасте новичком кода из книг или с сайтов потеря «лишних» табов и пробелов — явление нередкое. =)
                                                    +1
                                                    > Подозреваю, что надо подключать базу данных и записывать объекты туда. Придётся мне учить SQL.

                                                    По первости это лишнее. Проще с текстовыми файлами работать. Сделать свою примитивную десериализацию для загрузки карты. Может быть и сериализацию для хранения игры. Это несложно. А когда уже будет много CRUD транзакций (скорее только UD), тогда чтоб не мучиться, можно перейти на SQL.

                                                    Летом экспериментировал со школьниками, пока они ждали результаты ЕГЭ. Рассказал им на простых примерах (местами для них простых, т.к. они только что профильную математику сдали).
                                                    www.youtube.com/playlist?list=PLXZ932--vmI_ZEpSfEK_uvI7Zi4EHDSoC
                                                    (сильно не пинать, это не плановый учебный курс, а живые стримы, чтоб с интересом скоротать время ожидания)
                                                      0
                                                      Когда самообразовывался — находил курсы по паттернам С# и к ним книжку «Design Patterns via C#», в которой по шагам строится и усложняется игра-лабиринт.
                                                      На мой взгляд, это очень похоже, попробуйте.
                                                        +8
                                                        «Мне очень не хватало какого-то руководства для чайников по структурированию кода. Куда поместить метод для генерации предмета? В класс Item? В класс Program? Просто оставить в коде?»

                                                        Поздравляю, вы дошли до настоящей разработки. Правильных ответов на эти вопросы не существует. Даже правильных подходов много и они противоречат друг другу.
                                                          +1
                                                          Я бы советовал в таких случаях из всех возможных вариантов выбирать самый простой. Самый простой вариант имеет неоспоримое преимущество — он прост. А другие возможные преимущества других вариантов начинающий программист просто не поймёт. Оверинжиниринг — зло.
                                                          –1
                                                          Возможно всё-таки стоило начать не сразу с С#, а с основами программирования сначала «поиграться» на каком-нибудь детском/учебном языке. Например на каком-нибудь Scratch. Там и примеры простые легче найти и может быть сыну тоже стало интересно.

                                                          Но если уж взялись за C#, то на гитхабе полно туториалов и примеров простых программ. Они не заменят обучения как такового, но там всегда можно что-то подсмотреть. То есть просто ввести там в поиск что-то вроде «C# learning game» и посмотреть что вылезет.

                                                          Да и свой проект лучше там держать:)

                                                            0

                                                            Ну в скрэтч у меня ребёнок играет — это не серьёзно. Чем он мне поможет?

                                                              0

                                                              Ну если для вас это уже несерьёзно, то и хорошо :)


                                                              П С. Но начинать совсем с нуля и сразу в С#… Просто для меня С# был далеко не первым языком программирования и я всё равно с ним хорошо помучился в своё время :)

                                                                0
                                                                И тем не менее учить бесполезный язык ради каких-то абстрактных навыков — очень скучная трата времени. Для меня по факту C# был первым языком, не считая макросов в экселе на VBA. Очень легкий в изучении и логичный язык. Учил без книг (только «CLR via C#» через полгода изучения).
                                                            0
                                                            Как сделать создание объектов программно? Как генерировать их названия и тем более выбирать нужные для изменения их параметров?

                                                            можно начать с Dictionary<T, V>, где ключами будут имена полей. А хранить их все в массиве.
                                                            Т.е. «создание объекта» — это добавление в этот массив нового словарика с полями «здоровье»:100, «удар»:3 и «броня»:5 (и т.д — положение в пространстве, состояние голода, что в руках), и это может быть не просто число, например значение по ключу «инвентарь» — это может быть еще один массив словарей, только уже с предметами.
                                                            После чего можно будет ходить по этому массиву и опрашивать — кто где, и если все жизни 0 (и инвентарь пустой и т.д.) — удалять оттуда.
                                                            Это же даст вам и понятие про «БД в памяти» и не нужно ломиться в SQL (хотя он будет нелишним, но зачем на полпути ?).
                                                            Дальше еще можно делать сохранение этого всего (в текстовый файл или БД или передача json-ами по сети) и т.д.
                                                              0
                                                              Автор, я бы посоветовал прежде освоения объектно-ориентированного программирования полистать книгу «Алгоритмы и структуры данных».
                                                              Хороший метод развития навыков — решение олимпиадных задач, но если хочется того же, но в более красивом виде — посмотрите cайт CodinGame.com (раздел Practice) и подобные. Там и задачи уже придуманы, и язык программирования можно выбирать удобный лично для Вас, и задачи, как правило, такие, что их решения могут пригодиться в дальнейшем игрострое.

                                                              В любом случае — удачи, и упорства в достижении цели.
                                                                +1
                                                                Спасибо. Интересно.
                                                                Принято считать, что программирование — удел профессионалов. Никто не занимается программированием в качестве хобби. Такого понятия, как “любительское программирование” (запомните это слово) его вообще не существует.

                                                                На запрос «любительское программирование” (в кавычках) гугл выдал 351 результат. Это сравнительно немного, т.о. это слово встречается нечасто. Но если под этим словом понимать непрофессиональное программирование, то это очень распространенное занятие.

                                                                Прежде всего я бы отметил профи в других областях, которые регулярно пишут програмки для своей работы (только для себя). Нпр., знаю одного химика органика синтетика — доктор хим. наук, работает в одном из ведущих НИИ РАН. Программировать учился самостоятельно. Изучал только то, что было ему нужно — нпр., рулетку он не напишет :)

                                                                Есть любители в других областях, нпр., радиолюбители, которые пишут код для своего хобби.

                                                                Но есть люди постоянно связанные с программированием по основной работе. Нпр., „чистый“ математик может входить в бригаду программистов, где разрабатывать очень изощренные алгоритмы и при этом не знать ни одного ЯП.

                                                                И как быть со школьниками? Сейчас уже в начальной школе учат программированию. Школьник может им увлекаться, но до профи ему еще очень далеко.

                                                                А еще много мододелов-любителей. Пишет, нпр., моды для любимой игры на очень ограниченном скриптовом языке. Но ведь и это „кодинг“ с отладкой.
                                                                  +1
                                                                  Очень хорошее замечание. Не всех из перечисленных можно считать любителями. Я в новых постах отдельную мысль про это напишу.
                                                                    0
                                                                    Не всех из перечисленных можно считать любителями. Я в новых постах отдельную мысль про это напишу.
                                                                    Очень интересно будет узнать Ваше мнение. Забегая вперед возражу, что и Вы не совсем любитель (не с нуля начали):
                                                                    Кроме того в старших классах были уроки информатики. Turbo Pascal. Нас учили писать настоящий код. Разумеется, в тетрадях. Но у меня был компьютер (уже какой-то Пентиум) и я мог практиковаться.

                                                                    Так я познакомился с самыми элементарными вещами. Конструкциями if-then-else и циклами. Вершиной моего мастерства стала программа «Рулетка».

                                                                    Поэтому мне не понятно затруднение:
                                                                    Первое препятствие. Дошел до понятия классов и объектов. Понятие совершенно непонятно.
                                                                    По паскалю и по школьной математике Вам знакомо понятие типа данных, нпр., отличия целых чисел от вещественных:
                                                                    — чтобы сравнить целые на равенство пишем:
                                                                    if x=y then

                                                                    — а если x и y вещественные, то нужно написать:
                                                                    if abs(x-y)<epsilon then

                                                                    Наверняка этому в школе учили, но у Вас это знание ушло в пассив. Чтобы вспомнить про простые и сложные типы достаточно проглядеть статью в вики потратив 20 минут. Переход от понятия типа к понятиям ООП очень прост — подробнее я написал. Там и про то, что ООП — удобная технология, но не надо преувеличивать ее пользу.
                                                                    Создать классы для игрока, казино и рулетки? Потом придумывать объекты в них? И что они будут делать? Слишком притянуто. Кажется чем-то неестественным и только запутывает программу.
                                                                    Я предпочитаю ОО Паскаль в Дельфи-7. И начал бы делать Вашу задачу в GUI. В этом случае по команде «новый проект» среда Дельфи генерирует код с основным окном — объектом экземпляром класса TForm. На эту форму-окно я бы стал класть компоненты для управления игрой (ход, выход и т.д.), писать обработчики событий (нпр., нажатие на кнопку), а в них уже логику игры. В простой постановке классы казино, игрок, рулетка были бы не нужны. Более сложный пример, где нужны особые нестандартные классы.
                                                                    Успехов!
                                                                      0

                                                                      По-английски это будет programming hobbyist — загуглите и поразитесь количеству результатов.
                                                                      А вообще, поддержу предыдущего оратора. Скажу более: я с 1990 года в "айти". Начинал программистом на Паскале (даже умудрился 800 рублей заработать за три месяца, неплохие деньги!), затем стал чем-то типа эникейщика в микробиологической лаборатории, после снова на три года вернулся в программирование, а затем уже плотно и окончательно подсел на сисадминство. Тем не менее, продолжаю быть "программистом-хоббиистом" (автоматизирую процессы на работе, программирую микроконтроллеры для всяких электронных поделок, разрабатываю милые мелочи для мобилок, время от времени просто открываю новые для себя ЯП — сейчас пытаюсь "врубиться" в F#, чтобы мозги плесенью не покрывались, ну и т. п.). Так что нас, программистов-любителей, весьма и весьма много!

                                                                    –4
                                                                    Лет в 8 у нас дома появился первый в моей жизни ПК. Packard Bell 486. Крутой по тем временам. На нём было две программы — Лексикон и Инфо-бухгалтер.

                                                                    Какого года статья? У меня глаза аж заболели…
                                                                      0
                                                                      Статья сегодняшняя, а «лет в 8» — отсылка к 1992 году, когда автору было 8 лет.
                                                                        0
                                                                        Всё происходит прямо здесь и сейчас :)
                                                                          0
                                                                          Судя по тому, что упоминаются уроки по C#8 и Core3, то статья довольно свежая.
                                                                          Уроки с сайта mycsharp.ru и “Полное руководство по языку программирования С# 8.0 и платформе .NET Core 3” на metanit.com/sharp/tutorial
                                                                          0
                                                                          Я попробую изменить отношение общества к программированию. Принято считать, что программирование — удел профессионалов. Никто не занимается программированием в качестве хобби. Такого понятия, как “любительское программирование” (запомните это слово) его вообще не существует.

                                                                          Я попробую изменить отношение общества к нейрохирургии. Принято считать, что нейрохирургия — удел профессионалов. Никто не занимается нейрохирургией в качестве хобби. Такого понятия, как “любительская нейрохирургия” (запомните это слово) его вообще не существует.
                                                                            0

                                                                            Интересно, что могла бы представлять из себя любительская нейрохирургическая операция?

                                                                              0
                                                                              Вскрытие каменным топором черепа претендента на жизненное пространство из соседнего племени? =)
                                                                                0
                                                                                Подпольное добавление модуля памяти, логики, прямого подключения к телеграму или торренту ;)
                                                                                  0
                                                                                  Например, Лоботомия :
                                                                                  Широкое распространение получил разработанный в 1945 году американцем Уолтером Фрименом[en] метод трансорбитальной лейкотомии («лоботомия топориком для льда»)[8], при котором не требовалось сверлить череп пациента. Фримен стал ведущим пропагандистом лоботомии. Свою первую лоботомию он провёл, используя в качестве обезболивания электросудорожную терапию. Он нацеливал зауженный конец хирургического инструмента, напоминающего по форме нож для колки льда, на кость глазной впадины, с помощью хирургического молотка пробивал тонкий слой кости и вводил инструмент в мозг. После этого движением рукоятки ножа рассекались волокна лобных долей головного мозга. Фримен утверждал, что процедура устранит из «душевной болезни» пациента эмоциональную составляющую. Первые операции проводились с помощью настоящего ножа для колки льда[9].
                                                                                  0
                                                                                  Я попробую изменить отношение общества к нейрохирургии. Принято считать, что нейрохирургия — удел профессионалов. Никто не занимается нейрохирургией в качестве хобби. Такого понятия, как “любительская нейрохирургия” (запомните это слово) его вообще не существует.

                                                                                  Огонь! В точку. Именно об этом я и говорю. С Вашего позволения процитирую это высказывание.
                                                                                  +1
                                                                                  Ай, как здорово)) Читал с расширяющейся улыбкой) Это же и про меня тоже! 286 комп в 1992 году, Турбо Бейсик, вершиной мастерства на котором были написанные мной Тараканьи бега)) Делаем ставку на одного таракана из трех и они мчат снизу вверх, с рандомной задержкой на каждом шаге)) Самое веселое было запустить ее позже на пентиуме, тараканы добегали за долю секунды, потому что задержка была реализована пустым циклом.
                                                                                  И точно так же я все забросил до прошлого года, когда увлекся питоном, пилю небольшую автоматизацию для своей работы и балуюсь с ML, строя несложные модельки в области оценки стоимости недвижимости. Удачи Вам!!!
                                                                                    0

                                                                                    +1 единомышленник, отлично. Можно своё сообщество начинать :)

                                                                                    +1
                                                                                    Вот все пишут, удачи, но никто не вызвался помочь человеку.
                                                                                    Я конечно C# не знаю, мне ближе java,python,php,sql итд, но готов помочь, если будут какие то вопросы (в т.ч. и те задачки что в статье сейчас если до сих пор не смогли решить), пишите, чем смогу — помогу.
                                                                                      0

                                                                                      Спасибо. На самом деле многие пишут лично и предлагают помощь да совет. Но мне пока не требуется, вроде ещё с настоящими трудностями не сталкивался.


                                                                                      Хотя один добрый человек рассказал, как включить отладку — должно здорово помочь.

                                                                                      +1
                                                                                      Автор, проверьте личные сообщения)
                                                                                        0
                                                                                        Про генерацию имен — по-моему, типовой способ это составление словосочетания рандомным выбором частей названия из списков, наподобие тех «генераторов», что по соцсетям ходят:
                                                                                        image

                                                                                        Причем к таким фрагментам названия можно «прикручивать» и модификаторы характеристик. Так, например, сделано в серии игр Borderlands — название оружия составляется из префикса и титула, влияющих на характеристики (по сути, с точки зрения такого конструктора части названия являются такими же «деталями» оружия, как ствол, рукоятка и т.п.)
                                                                                        Скриншот калькулятора характеристик по списку частей
                                                                                        image

                                                                                          +2
                                                                                          Вот так неудобно создавать почти всегда:
                                                                                          Ребёнок Дима = new Ребёнок ();
                                                                                          Ребёнок Саша = new Ребёнок ();

                                                                                          Потому что необходимо работать совершенно по отдельности с ними.
                                                                                          Значительно лучше
                                                                                          List<Ребёнок> Дети = new List<Ребёнок>();
                                                                                          Дети.Add( new Ребёнок ('Дима', 11));
                                                                                          Дети.Add( new Ребёнок ('Саша', 13));

                                                                                          Так можно работать перебором с любым количеством детей (ну, или имуществом в инвентаре) и любым разнообразием.
                                                                                            0

                                                                                            Статья интересная, но как на счет того чтобы добавлять примеры кода (с которым возникали трудности ) думаю многие могли бы поучиться на ваших ошибках.

                                                                                              0

                                                                                              Не думаю, что мой примитивный код кому-либо поможет :)
                                                                                              Я пытаюсь вдохновить людей на интерес к хобби — программированию. А с деталями им помогут на StackOverflow гораздо лучше :)

                                                                                              +1
                                                                                              Шикарная статья. Спасибо автору. Я как-будто вурнулся в прошлое. Я сам так же начинал — в качестве хобби, но потом это переросло в профессию разработчика игр на Unity и Unreal Engine.
                                                                                              По поводу изучения SQL и баз данных, это лишнее для начали и для простых игр.
                                                                                              если сохранения в игре не предусмотрены, то хранить предметы и монстров лучше в коллекциях (например, List).
                                                                                              Если сохранения в игре должны быть, чтобы игру начинать потом с того же мета, то лучше использовать Json, записывать в файл при сохранении и читать из файла при загрузке. Как работать с Json можно понять за пару часов очень начинающему программисту )
                                                                                                +1
                                                                                                Никто не занимается программированием в качестве хобби. Такого понятия, как “любительское программирование” (запомните это слово) его вообще не существует.
                                                                                                Я 18 лет занимаюсь программированием в качестве хобби.
                                                                                                  0

                                                                                                  Это просто потрясающее, снимаю шляпу. Надеюсь протянуть столько же. А поделитесь подробностями? Как к этому пришли? Над чем работаете? Что Вам это даёт?

                                                                                                    0
                                                                                                    Как к этому пришли?
                                                                                                    В 12 лет подарили компьютер байт, с книгой о том как программировать на встроенном бэйсике. Попробывал — понравилось. Так и увлекся.
                                                                                                    Над чем работаете?
                                                                                                    В данный момент над компилятором свого яп(начал его делать, ещё до того как это стало мэйнстримом)
                                                                                                    Что Вам это даёт?
                                                                                                    Возможность воплощать свои идеи в жизнь, также позволяет мне более широко мыслить и применять навыки из программирования в жизни.
                                                                                                  0
                                                                                                  Предлагаю также посмотреть код игровых опен-сорс проектов на гитхабе github.com/leereilly/games
                                                                                                  Например (выпал первым по ключевому слову C#) github.com/paulbatum/Dominion
                                                                                                  Там найдутся примеры организации кода, переиспользования кода с помощью наследования и множество других вещей, которые на собственном опыте постигаются долго и болезненно.
                                                                                                  Главное постоянно задавать себе вопрос «почему это было сделано именно таким образом» и гуглить неизвестные термины.
                                                                                                  Еще может пригодиться ознакомитьельная статья по паттернам проектирования «Три ключевых принципа ПО», имхо это полезно даже с поверхностными языка программирования. habr.com/ru/post/144611
                                                                                                    0

                                                                                                    В качестве литературы для начинающих могу посоветовать
                                                                                                    RB Whitaker — The C# Player's Guide
                                                                                                    В качестве бесплатной альтернативы существует
                                                                                                    Rob Miles — C# Programming Yellow Book

                                                                                                      0
                                                                                                      Очень интересная статья и автор молодец! Программирование — это призвание, и часто у профессиональных программистов его нет
                                                                                                        0

                                                                                                        Меня наверно запирают, но я бы посоветовал ардуино какую. Она по-моему идеально подходит для подобного.
                                                                                                        Будет максимально наглядно, да не шарп, но у автора не с самим языком проблемы, как я понял.

                                                                                                          +1
                                                                                                          metanit — очень годный ресурс для новичков, сам с него начинал.
                                                                                                            –3
                                                                                                            Правильно говорить не «Си шарп», а «Си плюсплюс плюсплюс», потому что "#", это по сути 4 плюса, вот такой вот вброс.
                                                                                                              0

                                                                                                              Я бы посоветовал книгу Head First C#. В своё время хорошо зашла. Многим не нравится подача материала (слишком много картинок)). Но с точки зрения разработки игр для себя, примеры там подходящие.

                                                                                                                0
                                                                                                                Насколько я помню, все дружно ждут четвёртое издание, которое выйдет чуть ли не в Августе 2020 года.

                                                                                                                Вот тут есть гитхаб, в котором они вроде как работают, но его уже 2 месяца не обновляли.
                                                                                                                github.com/head-first-csharp/fourth-edition

                                                                                                                Кстати, я так и не понял, что делать новичкам в связи с постепенным переползанием с .NET Framework на Core. В своё время пытался что-то писать на Питоне, но из-за вечного перепрыгивания с 2 на 3 и обратно быстро разочаровался во всём этом и забросил. Сейчас читаю старые книги по C Sharp, там всё на Framework. Я правильно понял, что он пока что умирать не собирается и подход к написанию приложению похож, это только новая имплементация?
                                                                                                                  0

                                                                                                                  Так язык один и тот же, так что старые книги вполне подойдут. Есть некоторые различия по стандартной библиотеке (например, в NET Core идеологически отсутствует Thread.Abort, что вообще правильно), но для новичков это не важно. Ну и инфраструктура у NET Core более продуманная и простая.

                                                                                                                0

                                                                                                                С интересом прочитал публикацию. Судя по количеству комментариев, не я один. Хотелось посоветовать какой-нибудь ресурс для обучения. Сам люблю читать книги, но толковой для данного случая не приходило на ум.


                                                                                                                Потом вспомним про замечательный курс "Основы программирования на примере C#" на ulearn.me. Он стоит того, чтобы хотя бы попробовать его немного. А там уж как зайдёт.


                                                                                                                Удачи!


                                                                                                                P. S. Курсы на русском языке, в открытом доступе. Есть и более продвинутый и не менее интересный "Проектирование на языке C#".

                                                                                                                  0
                                                                                                                  Эх… опять видео… на видео нужно много времени :(
                                                                                                                    0

                                                                                                                    Нет, основное время там уходит на практические задания, по моему опыту. Посмотреть десятиминутный ролик во время перерыва на чай и вместо чтения новостей — ерунда. Но курс действительно обширный, 2 семестра по 3 — 6 часов в неделю — это реальная оценка. Но опять же, можно смотреть только интересующие темы.

                                                                                                                  0
                                                                                                                  Рискую, быть заминусованным.
                                                                                                                  Пишу на С#, уже 11 лет. До этого, писал на C, C++, Java, Python и пр.
                                                                                                                  Моё мнение: C# — это не про язык. Сам по себе язык, очень хороший, современный и прогрессивый. C# — это в первую очередь, про платформу .Net от Microsoft. Именно её, и стоит изучать. Чтобы, всё не закончилось на Console.WriteLine(«Hello, World!»);
                                                                                                                    0
                                                                                                                    Бывают же совпадения! Я тоже буквально пару недель назад начал учить C#. Правда, в отличие от Вас, у меня уже есть 3 года опыта фронтендером, и я уже писал код и в ООП-стиле, и в функциональном. Но это все javascript, в который эти концепции понатаскали из разных других языков программирования и в котором благодаря этому есть неограниченная свобода в написании программ.
                                                                                                                    В C# же чувствуешь себя, как в смирительной рубашке, по крайней мере, поначалу. И дело даже не в строгой типизации: я до этого пробовал писать на typescript, и это замечательный опыт. Типизированный код для разработки в команде — это мастхэв, как по мне, так как спасает от двухчасового дебага в библиотеках, написанных внутри компании.
                                                                                                                    Короче, желаю удачи в освоении программирования!
                                                                                                                    Похвастаюсь своим кодом. Я тоже пишу RPG, правда я хочу полноценно в геймдев скатиться:
                                                                                                                    Класс боя
                                                                                                                    using System;
                                                                                                                    
                                                                                                                    namespace Components.Battle
                                                                                                                    {
                                                                                                                        public class Battle
                                                                                                                        {
                                                                                                                            public bool alive = false;
                                                                                                                    
                                                                                                                            private int turn = 0;
                                                                                                                    
                                                                                                                            private Combatant firstCombatant;
                                                                                                                            private Combatant secondCombatant;
                                                                                                                    
                                                                                                                            private Combatant currentCombatant;
                                                                                                                            private Combatant otherCombatant
                                                                                                                            {
                                                                                                                                get
                                                                                                                                {
                                                                                                                                    return currentCombatant == firstCombatant
                                                                                                                                        ? secondCombatant
                                                                                                                                        : firstCombatant;
                                                                                                                                }
                                                                                                                            }
                                                                                                                    
                                                                                                                            public Battle(
                                                                                                                                Combatant firstCombatant,
                                                                                                                                Combatant secondCombatant
                                                                                                                            )
                                                                                                                            {
                                                                                                                                this.firstCombatant = firstCombatant;
                                                                                                                                this.secondCombatant = secondCombatant;
                                                                                                                            }
                                                                                                                    
                                                                                                                            public void Start()
                                                                                                                            {
                                                                                                                                alive = true;
                                                                                                                    
                                                                                                                                Combatant startingCombatant = CheckInitiative();
                                                                                                                    
                                                                                                                                Turn(startingCombatant);
                                                                                                                            }
                                                                                                                    
                                                                                                                            private Combatant CheckInitiative()
                                                                                                                            {
                                                                                                                                int firstInitiative = firstCombatant.CheckInitiative();
                                                                                                                                int secondInitiative = secondCombatant.CheckInitiative();
                                                                                                                    
                                                                                                                                Console.WriteLine(
                                                                                                                                    $"Initiative check: first - {firstInitiative}, second - {secondInitiative}"
                                                                                                                                );
                                                                                                                    
                                                                                                                                if (firstInitiative >= secondInitiative)
                                                                                                                                {
                                                                                                                                    return firstCombatant;
                                                                                                                                }
                                                                                                                                else
                                                                                                                                {
                                                                                                                                    return secondCombatant;
                                                                                                                                }
                                                                                                                            }
                                                                                                                    
                                                                                                                            private void Turn(Combatant combatant)
                                                                                                                            {
                                                                                                                                if (turn != 0) {
                                                                                                                                    currentCombatant.ResetInitiative();
                                                                                                                                }
                                                                                                                    
                                                                                                                                currentCombatant = combatant;
                                                                                                                    
                                                                                                                                currentCombatant.PerformActions();
                                                                                                                                currentCombatant.ReduceInitiative();
                                                                                                                    
                                                                                                                                Combatant nextCombatant = CheckInitiative();
                                                                                                                    
                                                                                                                                turn++;
                                                                                                                    
                                                                                                                                Turn(nextCombatant);
                                                                                                                            }
                                                                                                                        }
                                                                                                                    }
                                                                                                                    

                                                                                                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                                                                    Самое читаемое