Comments 109
Ещё на .net митапы сходить несколько раз, если у вас в городе они проходят.
На них все же требуется уровень не ниже среднего.
Dimtry44 очень точно подметил:
Для того чтобы было легче, надо наставника найти, хорошего
Мне вспомнилось как я постигал азы программирования.
Я учился в Академии им. Ф.Э.Дзержинского на кафедре № 25, кафедра программирпования. Мы были вторым набором программистов (1971 год). У меня после Казанского СВУ не было никаких проблем с учебой (многие предметы сдавал экстерном). Но началось программирование и я никак не мог постичь физику предмета: какие-то ячейки, адреса, параметры, аргументы. Короче темный лес. Учился со мной Гена Хренков, который звезд с неба не хватал. Когда я ему рассказал о своих проблемах, он удивился и сказал, а чего здесь не понятного. Берем три коробка со спичками. Это три ячейки. Открываем первый коробок и смотрим сколько в ней спичек, это будет значение первой ячейки. Аналогично для второго коробка. Потом в зависимости от операции складываем или вычитаем. Берем столько спичек каков результат и кладем в третий коробок. Вот мы и запрограммировали сложение/вычитание чисел. Не надо забывать, что это был 1972 год и накаких Си и т.п. еше не было. А были одно, двух или трехадресные машины.
Урок я усвоил и с тех пор не знаю никаких проблем в программировании.
Кстати, а Гена Хренков, к сожалению, не стал программистом.
А для языков высокого уровня коробки со спичками просто незаменимы.
… это был 1972 год и накаких Си и т.п. еше не было. А были одно, двух или трехадресные машины.
Не всё было столь печально.
В те годы в Советском Союзе был достаточно распространен и использовался для обучения студентов Алгол, язык вполне высокоуровневый.
Практически на всех буржуйских компьютерах и на некоторых советских был доступен язык Фортран, который являлся универсальным языком программирования до того, как Си в этом качестве его вытеснил. На Фортране были реализованы вполне себе масштабные проекты, в том числе требующие объектно-ориентированного подхода (просто это тогда так не называлось). Оптимизирующий компилятор с Фортрана для компьютеров IBM был написан на Фортране. Кстати как раз в 1972 году Фортран был впервые стандартизован (FORTRAN 66).
В министерстве обороны США (US Department of Defense) с начала шестидесятых в качестве стандарта использовался язык Кобол (COBOL), тоже не то чтобы ассемблер.
Так что проблемы трудного детства несколько преувеличены.
Так что проблемы трудного детства несколько преувеличены.
А кто писал о трудном детстве?! Уж точно не я. Во-первых, не детство, а юность, и она была прекрасна. И помимо Алгола, Фортрана и того же Cobol-а, нам преподавли (1973-1976 г.г., Советский Союз) и Ассемблер, и Алмо, и PL/1, и RPG и много чего другого. И писал я не о трудностях, а о своем личном понимании программирования.
Конечно. Самоучитель. В моем случае это был самоучитель по VBA. Для него достаточно иметь Excel и можно неплохо познакомиться с процедурным прогоаммированием.
Главное — не в учебных материалах. Главное — иметь задумку, которая будет мотивировать. Для большинства любительских проектов достаточно освоить 10-15 команд, погружаться в дебри не надо.
Для меня это пока работает.
Я под эту лавочку месяца за 3-4 вечерами и с убунтой подружился, и Апач настроил, и веб-приложение на питоне сконструировал, и оно даже умеет «в уме» запускать браузер, делать скриншоты, тащить инфу с сайта, перерабатывать ее и делать финальный документ на базе всего этого. Одна беда — безопасники на работе не разрешили использовать сервис, лежащий на сторонних серваках. Сейчас пытаюсь развернуть это все внутри локальной сети на работе, но сколько при этом ограничений, жесть. Все, что на своем сервере делается парой команд, тут надо согласовывать)))
А помойму годная и задумка и подача материала. Автор молодец. Жду следующую пачку.
Дурак — глупый человек. Вряд ли автор является таковым, особенно учитывая контент статьи. Так что заголовок кликбейтный.
Никто не занимается программированием в качестве хобби. Такого понятия, как “любительское программирование” (запомните это слово) его вообще не существует.
Да ладо. В прошлом почти все начинали с любительского, они наверно так не думают
Если когда нибудь мне надо будет сделать рулетку, я не задумываясь обращусь к автору статьи. Спасибо, хорошая статья, с утра подняла настроение!
Я живу в Нигерии с кнопочным телефоном и нахожусь в отчаянном положении.история заиграла новыми красками, стал искать тег «перевод». Скрины на русском удивили. Всё из-за моей невнимательности.
PS: Увы, скорее всего разбирал на стримах ЕГЭ (объяснял на PascalABC.Net). Надо бы собрать отдельное видео по этой теме.
var rnd = new Random();
эквивалентен вызову var rnd = new Random(DateTime.Now.Millisecond);
DateTime обновляется раз в, примерно, 16 миллисекунд — это приводит к тому, что все созданные в этот промежуток времени экземпляры генератора выдадут одинаковые последовательности. Поэтому обычно создают один статический экземляр Random уровня модуля.
Или можно использовать RNGCryptoServiceProvider в случае если требуется что-то пригодное для криптографии, или спецефических задач (вроде генерации кодов подтверждения).
Также не стоит забывать, что дефолтный Random
не потокобезопасный, т.е. при многопоточном обращении его нужно заворачивать в lock
.
Крайне рекомендую прочитать, что такое "Линейный конгруэнтный генератор" и тогда все станет понятно :) Несмотря на умное слово в середине, вещь поразительно простая. Не то, чтобы так работали все ГПСЧ (генератор псевдо-случайных чисел, PRNG на вражеском), скорее наоборот, но зато станет понятно что такое seed и какие ограничения бывают. Можете даже свой ГПСЧ написать :)
Конечно же я документацию от Микрософта читаю первым делом. Но там половина слов непонятная. И нет объяснения что это, для чего поименяется и когда надлежит использовать.
docs.microsoft.com/ru-ru/dotnet/api/system.random?view=netframework-4.8#avoiding-multiple-instantiations
Я не заради позлорадствовать, но это же прям в содержании написано.
Random RandomNumber = new Random();
Но мне же в разных местах кода потребуются случайные числа в разных диапазонах. А иногда два разных случайных числа в одном диапазоне. Они разве не будут одинаковы, если я последовательность сгенерирую один раз на всю программу?
Вы потом вызываете var i = RandomNumber.Next() и каждый раз получаете новое сгенерированное число.
Или вы вызываете RandomNumber.Next(min, max) и получаете новое число в диапазоне min<>max.
Или вы что-то другое имели ввиду?
Random RandomStat = new Random();
находится в классе Item. Вызывается из конструкторов дочернего класса Armor
ItemArmor = RandomStat.Next(1, 10);
которые инициализируются через List.Add
armorList.Add(new Armor(true));
И при последовательных вызовах без задержки генерирует доспехи с одинаковой бронёй.
То есть, каждый Item создаёт свой Random? Тогда в этом и проблема. Можно создать Random на уровень выше и передавать в конструкторы брони и оружия. Тогда все предметы создаваемые подряд будут использовать один и тот же объект Random, и проблема решится.
Выше написанное решение по идее должно помочь. Ну или делаете RandomStat статическим атрибутом Item и инициализируете его ровно один раз. Скажем при старте вашей программы.
class App {
//...
public static Random RandomStat = new Random();
//...
}
и далее везде использовать его: var rndNum = App.RandomStat.Next(10,100);
Объект класса Random
, проинициализированный конкретным значением seed
, будет всегда воспроизводить одинаковую последовательность псевдослучайных чисел.
Это позволяет, например, написать стабильные тесты на функцию использующую этот самый объект.
на питоне вы можете выплюнуть
print("Hello world!")
и это работает)
using static System.Console;
//...
WriteLine("Hello world!");
//...
А в целом соглашусь. Обвеска классом, пространством имен немного отпугивает новичков, чем Python и подкупает. Но стоил лишь добраться до кастомных структур данных, ООП, и Python начинает проигрывать.
Обвеска пространством имен необязательная.
с CSharp плохо знаком, просто интересно, в чем Python ему проигрывает?
В динамической типизации (ошибки во время запуска, а не компиляции), в скорости.
Это понятно, я имел ввиду в контексте кастомных структур и ООП
По первости это лишнее. Проще с текстовыми файлами работать. Сделать свою примитивную десериализацию для загрузки карты. Может быть и сериализацию для хранения игры. Это несложно. А когда уже будет много CRUD транзакций (скорее только UD), тогда чтоб не мучиться, можно перейти на SQL.
Летом экспериментировал со школьниками, пока они ждали результаты ЕГЭ. Рассказал им на простых примерах (местами для них простых, т.к. они только что профильную математику сдали).
www.youtube.com/playlist?list=PLXZ932--vmI_ZEpSfEK_uvI7Zi4EHDSoC
(сильно не пинать, это не плановый учебный курс, а живые стримы, чтоб с интересом скоротать время ожидания)
На мой взгляд, это очень похоже, попробуйте.
Поздравляю, вы дошли до настоящей разработки. Правильных ответов на эти вопросы не существует. Даже правильных подходов много и они противоречат друг другу.
Но если уж взялись за C#, то на гитхабе полно туториалов и примеров простых программ. Они не заменят обучения как такового, но там всегда можно что-то подсмотреть. То есть просто ввести там в поиск что-то вроде «C# learning game» и посмотреть что вылезет.
Да и свой проект лучше там держать:)
Ну в скрэтч у меня ребёнок играет — это не серьёзно. Чем он мне поможет?
Ну если для вас это уже несерьёзно, то и хорошо :)
П С. Но начинать совсем с нуля и сразу в С#… Просто для меня С# был далеко не первым языком программирования и я всё равно с ним хорошо помучился в своё время :)
Как сделать создание объектов программно? Как генерировать их названия и тем более выбирать нужные для изменения их параметров?
можно начать с Dictionary<T, V>, где ключами будут имена полей. А хранить их все в массиве.
Т.е. «создание объекта» — это добавление в этот массив нового словарика с полями «здоровье»:100, «удар»:3 и «броня»:5 (и т.д — положение в пространстве, состояние голода, что в руках), и это может быть не просто число, например значение по ключу «инвентарь» — это может быть еще один массив словарей, только уже с предметами.
После чего можно будет ходить по этому массиву и опрашивать — кто где, и если все жизни 0 (и инвентарь пустой и т.д.) — удалять оттуда.
Это же даст вам и понятие про «БД в памяти» и не нужно ломиться в SQL (хотя он будет нелишним, но зачем на полпути ?).
Дальше еще можно делать сохранение этого всего (в текстовый файл или БД или передача json-ами по сети) и т.д.
Хороший метод развития навыков — решение олимпиадных задач, но если хочется того же, но в более красивом виде — посмотрите cайт CodinGame.com (раздел Practice) и подобные. Там и задачи уже придуманы, и язык программирования можно выбирать удобный лично для Вас, и задачи, как правило, такие, что их решения могут пригодиться в дальнейшем игрострое.
В любом случае — удачи, и упорства в достижении цели.
Принято считать, что программирование — удел профессионалов. Никто не занимается программированием в качестве хобби. Такого понятия, как “любительское программирование” (запомните это слово) его вообще не существует.
На запрос «любительское программирование” (в кавычках) гугл выдал 351 результат. Это сравнительно немного, т.о. это слово встречается нечасто. Но если под этим словом понимать непрофессиональное программирование, то это очень распространенное занятие.
Прежде всего я бы отметил профи в других областях, которые регулярно пишут програмки для своей работы (только для себя). Нпр., знаю одного химика органика синтетика — доктор хим. наук, работает в одном из ведущих НИИ РАН. Программировать учился самостоятельно. Изучал только то, что было ему нужно — нпр., рулетку он не напишет :)
Есть любители в других областях, нпр., радиолюбители, которые пишут код для своего хобби.
Но есть люди постоянно связанные с программированием по основной работе. Нпр., „чистый“ математик может входить в бригаду программистов, где разрабатывать очень изощренные алгоритмы и при этом не знать ни одного ЯП.
И как быть со школьниками? Сейчас уже в начальной школе учат программированию. Школьник может им увлекаться, но до профи ему еще очень далеко.
А еще много мододелов-любителей. Пишет, нпр., моды для любимой игры на очень ограниченном скриптовом языке. Но ведь и это „кодинг“ с отладкой.
Не всех из перечисленных можно считать любителями. Я в новых постах отдельную мысль про это напишу.Очень интересно будет узнать Ваше мнение. Забегая вперед возражу, что и Вы не совсем любитель (не с нуля начали):
Кроме того в старших классах были уроки информатики. Turbo Pascal. Нас учили писать настоящий код. Разумеется, в тетрадях. Но у меня был компьютер (уже какой-то Пентиум) и я мог практиковаться.
Так я познакомился с самыми элементарными вещами. Конструкциями if-then-else и циклами. Вершиной моего мастерства стала программа «Рулетка».
Поэтому мне не понятно затруднение:
Первое препятствие. Дошел до понятия классов и объектов. Понятие совершенно непонятно.По паскалю и по школьной математике Вам знакомо понятие типа данных, нпр., отличия целых чисел от вещественных:
— чтобы сравнить целые на равенство пишем:
if x=y then
— а если x и y вещественные, то нужно написать:
if abs(x-y)<epsilon then
Наверняка этому в школе учили, но у Вас это знание ушло в пассив. Чтобы вспомнить про простые и сложные типы достаточно проглядеть статью в вики потратив 20 минут. Переход от понятия типа к понятиям ООП очень прост — подробнее я написал. Там и про то, что ООП — удобная технология, но не надо преувеличивать ее пользу.
Создать классы для игрока, казино и рулетки? Потом придумывать объекты в них? И что они будут делать? Слишком притянуто. Кажется чем-то неестественным и только запутывает программу.Я предпочитаю ОО Паскаль в Дельфи-7. И начал бы делать Вашу задачу в GUI. В этом случае по команде «новый проект» среда Дельфи генерирует код с основным окном — объектом экземпляром класса TForm. На эту форму-окно я бы стал класть компоненты для управления игрой (ход, выход и т.д.), писать обработчики событий (нпр., нажатие на кнопку), а в них уже логику игры. В простой постановке классы казино, игрок, рулетка были бы не нужны. Более сложный пример, где нужны особые нестандартные классы.
Успехов!
По-английски это будет programming hobbyist — загуглите и поразитесь количеству результатов.
А вообще, поддержу предыдущего оратора. Скажу более: я с 1990 года в "айти". Начинал программистом на Паскале (даже умудрился 800 рублей заработать за три месяца, неплохие деньги!), затем стал чем-то типа эникейщика в микробиологической лаборатории, после снова на три года вернулся в программирование, а затем уже плотно и окончательно подсел на сисадминство. Тем не менее, продолжаю быть "программистом-хоббиистом" (автоматизирую процессы на работе, программирую микроконтроллеры для всяких электронных поделок, разрабатываю милые мелочи для мобилок, время от времени просто открываю новые для себя ЯП — сейчас пытаюсь "врубиться" в F#, чтобы мозги плесенью не покрывались, ну и т. п.). Так что нас, программистов-любителей, весьма и весьма много!
Уроки с сайта mycsharp.ru и “Полное руководство по языку программирования С# 8.0 и платформе .NET Core 3” на metanit.com/sharp/tutorial
Я попробую изменить отношение общества к программированию. Принято считать, что программирование — удел профессионалов. Никто не занимается программированием в качестве хобби. Такого понятия, как “любительское программирование” (запомните это слово) его вообще не существует.
Я попробую изменить отношение общества к нейрохирургии. Принято считать, что нейрохирургия — удел профессионалов. Никто не занимается нейрохирургией в качестве хобби. Такого понятия, как “любительская нейрохирургия” (запомните это слово) его вообще не существует.
Интересно, что могла бы представлять из себя любительская нейрохирургическая операция?
Широкое распространение получил разработанный в 1945 году американцем Уолтером Фрименом[en] метод трансорбитальной лейкотомии («лоботомия топориком для льда»)[8], при котором не требовалось сверлить череп пациента. Фримен стал ведущим пропагандистом лоботомии. Свою первую лоботомию он провёл, используя в качестве обезболивания электросудорожную терапию. Он нацеливал зауженный конец хирургического инструмента, напоминающего по форме нож для колки льда, на кость глазной впадины, с помощью хирургического молотка пробивал тонкий слой кости и вводил инструмент в мозг. После этого движением рукоятки ножа рассекались волокна лобных долей головного мозга. Фримен утверждал, что процедура устранит из «душевной болезни» пациента эмоциональную составляющую. Первые операции проводились с помощью настоящего ножа для колки льда[9].
Я попробую изменить отношение общества к нейрохирургии. Принято считать, что нейрохирургия — удел профессионалов. Никто не занимается нейрохирургией в качестве хобби. Такого понятия, как “любительская нейрохирургия” (запомните это слово) его вообще не существует.
Огонь! В точку. Именно об этом я и говорю. С Вашего позволения процитирую это высказывание.
И точно так же я все забросил до прошлого года, когда увлекся питоном, пилю небольшую автоматизацию для своей работы и балуюсь с ML, строя несложные модельки в области оценки стоимости недвижимости. Удачи Вам!!!
Я конечно C# не знаю, мне ближе java,python,php,sql итд, но готов помочь, если будут какие то вопросы (в т.ч. и те задачки что в статье сейчас если до сих пор не смогли решить), пишите, чем смогу — помогу.
Причем к таким фрагментам названия можно «прикручивать» и модификаторы характеристик. Так, например, сделано в серии игр Borderlands — название оружия составляется из префикса и титула, влияющих на характеристики (по сути, с точки зрения такого конструктора части названия являются такими же «деталями» оружия, как ствол, рукоятка и т.п.)
Ребёнок Дима = new Ребёнок ();
Ребёнок Саша = new Ребёнок ();
Потому что необходимо работать совершенно по отдельности с ними.
Значительно лучше
List<Ребёнок> Дети = new List<Ребёнок>();
Дети.Add( new Ребёнок ('Дима', 11));
Дети.Add( new Ребёнок ('Саша', 13));
Так можно работать перебором с любым количеством детей (ну, или имуществом в инвентаре) и любым разнообразием.
Статья интересная, но как на счет того чтобы добавлять примеры кода (с которым возникали трудности ) думаю многие могли бы поучиться на ваших ошибках.
По поводу изучения SQL и баз данных, это лишнее для начали и для простых игр.
если сохранения в игре не предусмотрены, то хранить предметы и монстров лучше в коллекциях (например, List).
Если сохранения в игре должны быть, чтобы игру начинать потом с того же мета, то лучше использовать Json, записывать в файл при сохранении и читать из файла при загрузке. Как работать с Json можно понять за пару часов очень начинающему программисту )
Никто не занимается программированием в качестве хобби. Такого понятия, как “любительское программирование” (запомните это слово) его вообще не существует.Я 18 лет занимаюсь программированием в качестве хобби.
Это просто потрясающее, снимаю шляпу. Надеюсь протянуть столько же. А поделитесь подробностями? Как к этому пришли? Над чем работаете? Что Вам это даёт?
Как к этому пришли?В 12 лет подарили компьютер байт, с книгой о том как программировать на встроенном бэйсике. Попробывал — понравилось. Так и увлекся.
Над чем работаете?В данный момент над компилятором свого яп(начал его делать, ещё до того как это стало мэйнстримом)
Что Вам это даёт?Возможность воплощать свои идеи в жизнь, также позволяет мне более широко мыслить и применять навыки из программирования в жизни.
Например (выпал первым по ключевому слову C#) github.com/paulbatum/Dominion
Там найдутся примеры организации кода, переиспользования кода с помощью наследования и множество других вещей, которые на собственном опыте постигаются долго и болезненно.
Главное постоянно задавать себе вопрос «почему это было сделано именно таким образом» и гуглить неизвестные термины.
Еще может пригодиться ознакомитьельная статья по паттернам проектирования «Три ключевых принципа ПО», имхо это полезно даже с поверхностными языка программирования. habr.com/ru/post/144611
В качестве литературы для начинающих могу посоветовать
RB Whitaker — The C# Player's Guide
В качестве бесплатной альтернативы существует
Rob Miles — C# Programming Yellow Book
Меня наверно запирают, но я бы посоветовал ардуино какую. Она по-моему идеально подходит для подобного.
Будет максимально наглядно, да не шарп, но у автора не с самим языком проблемы, как я понял.
Я бы посоветовал книгу Head First C#. В своё время хорошо зашла. Многим не нравится подача материала (слишком много картинок)). Но с точки зрения разработки игр для себя, примеры там подходящие.
Вот тут есть гитхаб, в котором они вроде как работают, но его уже 2 месяца не обновляли.
github.com/head-first-csharp/fourth-edition
Кстати, я так и не понял, что делать новичкам в связи с постепенным переползанием с .NET Framework на Core. В своё время пытался что-то писать на Питоне, но из-за вечного перепрыгивания с 2 на 3 и обратно быстро разочаровался во всём этом и забросил. Сейчас читаю старые книги по C Sharp, там всё на Framework. Я правильно понял, что он пока что умирать не собирается и подход к написанию приложению похож, это только новая имплементация?
Так язык один и тот же, так что старые книги вполне подойдут. Есть некоторые различия по стандартной библиотеке (например, в NET Core идеологически отсутствует Thread.Abort, что вообще правильно), но для новичков это не важно. Ну и инфраструктура у NET Core более продуманная и простая.
С интересом прочитал публикацию. Судя по количеству комментариев, не я один. Хотелось посоветовать какой-нибудь ресурс для обучения. Сам люблю читать книги, но толковой для данного случая не приходило на ум.
Потом вспомним про замечательный курс "Основы программирования на примере C#" на ulearn.me. Он стоит того, чтобы хотя бы попробовать его немного. А там уж как зайдёт.
Удачи!
P. S. Курсы на русском языке, в открытом доступе. Есть и более продвинутый и не менее интересный "Проектирование на языке C#".
Нет, основное время там уходит на практические задания, по моему опыту. Посмотреть десятиминутный ролик во время перерыва на чай и вместо чтения новостей — ерунда. Но курс действительно обширный, 2 семестра по 3 — 6 часов в неделю — это реальная оценка. Но опять же, можно смотреть только интересующие темы.
Пишу на С#, уже 11 лет. До этого, писал на C, C++, Java, Python и пр.
Моё мнение: C# — это не про язык. Сам по себе язык, очень хороший, современный и прогрессивый. C# — это в первую очередь, про платформу .Net от Microsoft. Именно её, и стоит изучать. Чтобы, всё не закончилось на Console.WriteLine(«Hello, World!»);
В 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);
}
}
}
Как дурак C# учил. Часть 1