Ответ на пост «Я написал свою книгу по программированию»
Если данный господин является инфоцыганом, то предлагаю на него кинуть жалобу в СК РФ сейчас их любят кошмарить!
Если данный господин является инфоцыганом, то предлагаю на него кинуть жалобу в СК РФ сейчас их любят кошмарить!
Меня мало кто помнит но старички надеюсь пустят ностальгическую слезу. 8 лет назад здесь я кинул абсолютно безумный клич: "Буду обучать бесплатно любого желающего программированию". Я думал соберу человек 10 и в качестве хобби помогу людям. :))
Шут там, собралось почти 2000 человек и я провёл месяц без сна так, как проверял всем домашки и постоянно вёл лекции. И самое весёлое что это правда было просто хобби и я не взял ни рубля с людей а также не продавал никаких курсов. Странно это слышать в эру прогревов и теневых продаж, не правда ли?
Через 2 года после этих занятий я сел писать книгу по программированию на языке C# и благодаря участникам тех занятий мы собрали 85 000 рублей на написание на краудфандинге. Спустя 6 лет с того момента я закончил.
Книга научит вас языку программирования C# с самых основ через практику. Мы начнём с вами с переменных и закончим инкапсуляций техник динамического программирования в объектно-ориентированном дизайне (чтобы это не значило).
В книге получилось почти 400 страниц и вы можете забрать бесплатно PDF здесь - https://t.me/sakutin_csharp/2274
Спасибо Пикабу за всё!
Всем добрый день! Я новичок в Unity и мне нужна помощь. Я сделал простой 2D-платформер и был готов его собрать, но не тут то было. Unity при попытке сборки проекта выдает ошибку: "Error building Player because the editor has script compilation errors". Более того, прежде чем пытаться собрать проект, игра запускалась во вкладке Game. Я попробовал перезапустить Unity, но, к сожалению, это не помогло. Досадно, что после перезапуска Unity я потерял интерфейс игры и возможность ее создания. Пожалуйста, помогите мне решить эту проблему.
Приветствую всех. Подскажите пожалуйста. Натолкнуло меня на этот вопрос волна приложений "честная цена".
Допустим, новичок хочет быть программистом - делать небольшие игры. Но при этом понимает, что игродел - это скорее хобби, а хотелось бы в дальнейшем какую-никакую, а копейку за свою работу получать, а кому этого бы не хотелось?
Почему-то мне показалось, что будущее за вебом и мобильной разработкой. Логика в целом такая, что даже на пикабу если полистать посты, то и дело можно увидеть, как кто-то написал приложение за пару часов, кто-то игру какую-то онлайн делает, кто-то сайт запилил на коленке за день. Создается иллюзия, что это более возможно и доступно для обычного новичка, потому как постов о полновесных проектах серьезных не так уж и много.
Но, начиная изучать что-то из этого, понимаешь - что-то тут не то.
Из популярных языков - это либо, огромный локомотив типа С# и .NET, на котором можно сделать абсолютно ВСЁ, но в то же время и ничего, потому как реализация через фреймворки определенных задач будет похожа на забивание гвоздя отверткой.
Либо это легкий и непринужденный инструмент, вроде Python, на котором можно сделать тоже абсолютно ВСЁ, но это всё будет несерьезным и легковесным, скорее как дополнение к чему-то.
Либо это совсем какие-то узконаправленные языки, на которых кроме определенной задачи ничего и не сделаешь. Вот создан язык, чтобы на нем сайты делать - вот и делай на нём только сайты.
Казалось бы, всё просто, так оно и работает, в одиночку никто проекты не разрабатывает и в проектах как раз и есть условные 3 человека, которые знают все эти 3 разные технологии и объединяют в единое целое. НО!
НО! Тогда кто все эти люди, которые за вечер клепают свои альфа проекты? Они тебе и игры запилят, и сайты, и десктоп, и андроид приложения. И вообще оказывается это всё они пилят после просмотра пары роликов на ютуб. Но не могут же они знать абсолютно все технологии и языки, чтобы так легко переключаться с одного на другой?
И так с абсолютно каждым языком. У кого ни спроси - это всегда какие-то абстрактные ответы по типу, что для каждой задачи свой язык.
Неужели среди программистов, где чуть ли не правило - не изобретать велосипед, если его уже сделали до тебя, до сих пор нет понятного примерного плана пути для начинающего? Не того road map, где стрелочками отмечены абсолютно все существующие технологии по определенной сфере, а что-то понятное, то через что проходили все, прежде чем стать профессионалами, прежде чем начать делать что-то своё?
Не хочется же быть тем человеком, который потратит, скажем, пару месяцев на изучение языка, а оказывается его никто и не использует в реальной деятельности. Или узнать, что то, над чем ты мучался месяцы и кучей кода на другом языке делается за пару минут.
P. S. Я знаю, что сейчас в IT не войти, надо работать на заводе, а на 100 резюме джунов приходится всего 1 вакансия. У меня другая работа, которая устраивает. Это скорее попытка узнать, какую ошибку я совершил в молодые годы, когда выпустился из техникума со специальностью "информационные технологии", где максимум тебя научили писать "hello, world" на двух разных ЯП, а из-за обилия выбора направлений в дальнейшем я запутался, заблудился и не воспользовался шансом, когда он еще был.
Пока в курсе идут простые задания, я экспериментирую и умышленно усложняю себе задачу. Недавно наткнулся в Play Market на интересную игру Void Tyran, боевая механика данного рогалика завязана на игре в "очко".
Для тех кто не знает, 21 или "очко" - это карточная игра. Суть в том, что игроки поочереди берут карты, накапливая очки. Задача - набрать 21 или близкое к нему значение, но никак не больше - иначе проигрыш.
Так же и в Void Tyran, только вместо 21 стоит 12, а колода представляет из себя 24 карты (по 4 карты каждого значения от 1 до 6). Оба участника боя поочередно вытягивают карты из своей колоды накапливая очки, а когда оба решают остановиться - идет сравнение их результатов. Например, вы остановились на 11, а соперник на 8 - разница ровна 3 очкам. Значит, вы наносите по противнику три удара.
Согласитесь, что спустя десяток партий такая игра могла бы наскучить, но тут на помощь приходят особые карты. Какие то добавляют очки к результату, какие то усиливают атаку или защиту, а некоторые и вовсе обнуляют вражеский счетчик.
Void Tyran - геймплей
Игра зацепила и я решил повторить ее механику на C#, но для начала нужно сделать базу игры в "очко" до 12. Для начала накидал простой алгоритм, который дает игроку выбор - сделать бросок или остановиться.
База для игры в "очко"
Однако игра не имела смысла, потому что противник продолжал бросать пока не проиграет. Нужно "научить" его принимать решение, стоит ли останавливать выдачу или нет.
Шанс проиграть появляется в тот момент, когда сумма очков больше шести. Чем выше данный шанс, тем больше становится вероятность, что противник решит остановиться. Таким образом на 7-8 очках, он в большинстве случаев продолжит играть, но на 9-11 очках наверняка остановит свои броски.
Противник поднял лапки и остановился
Игра идет до тех пор, пока у одного из игроков не будет перебор или оба не выберут остановку. Во втором случае сравниваются результаты и тот у кого больше - побеждает.
Победа!
В дальнейшем добавлю в данный алгоритм здоровье и урон наносимый в соответствии с разницей в очках у победителя и проигравшего. А вишенкой на торте станут карты...
Конечно, в консоли это выглядит не так впечатляюще, но сам алгоритм работает, а это значит что я уже не такой криворукий. В следующий раз попробую реализовать данную систему в GDevelop или Godot.
Низкий гоблинский поклон всем кто дочитал до конца статьи! Если вам интересно наблюдать за развитием новичка (или посмеиваться над банальными ошибками) - подписывайтесь на мой блог!
Классическое задание при изучении языка программирования - написать на нем калькулятор. И вот вроде все просто, сделай переменные для вводимых данных и добавь выбор операции. Реализовать все это можно через if - else или switch. Но есть пара нюансов...
Вариант работающий на switch
Вариант работающий на if - else
Все работает до тех пор, пока мы вводим корректные данные. Если в запрос первого или второго числа мы введем какой либо текст, консоль пошлет нас в пешее эротическое путешествие и откажется работать ссылаясь на исключение. Ну ничего, и не таких уламывали...
Вундервафля try - catch
Нам нужен оператор обработки исключений try, на случай если найдется очередной нетакусик в строке ввода данных. Для того чтобы нам каждый раз не пришлось перезапускать программу, она зациклена при помощи while.
В try мы помещаем данные для проверки, а в catch порядок действий при обнаружении исключения. В нашем случае мы выводим сообщение что пользователь ошибся и при помощи continue запускаем цикл по новой, минуя остальные операции.
Если бы оператор continue был человеком...
Но даже если мы ввели корректные числа, математика вновь может нагнуть нас. Напомню, что на ноль делить нельзя, но при этом его можно ввести как одну из переменных. Всего одна молитва Горку и Морку в виде if - else все исправляет...
На первый взгляд простая задача из курса по итогу тыкает носом в пробелы знаний у новичка. Даже такая базовая вещь как калькулятор требует отладки и устранения всех возможных ошибок при работе программы. А мне еще учиться и учиться...
Так как я еще только в начале пути программиста, а пощупать разработку игр уже хочется, я решил параллельно с освоением C# познакомиться с движками работающими по принципу no code. Пока что мой гоблинский взор пал на GDevelop и в ближайшее время я выложу первые впечатления.
Низкий гоблинский поклон всем кто дочитал до конца статьи! Если вам интересно наблюдать за развитием новичка (или посмеиваться над банальными ошибками) - подписывайтесь на мой блог!
День 1
Вводный урок с объяснением возможностей языка и порядком установки Visual Studio. Следуя своей гоблинской натуре побежал вперед паровоза и забыл установить компонент для работы с NET.
Посмотрел на интерфейс, понял что пока ни черта не понимаю, помолился Горку и Морку, крикнул WAAAGH и продолжил изучение. Впитал базу про структуру проекта и типы данных, благо данные понятия уже были известны после JavaScript и Python.
День 2
Подробно разобрали типы данных и их обозначение в языке C#. Это конечно весело и круто что их так много, но похоже в ближайшее время будем использовать только int, string и bool. Поигрался с вводом/выводом гоблинских мудростей в консоль и базовыми математическими операциями.
На самом деле надо, а потому продолжаем...
День 3
Познакомился с типами конвертации, в целом удобно. А вот дальше пошел мимо курса изучать самостоятельно операции с if - else и классом Random. В прошлом посте я рассказывал о боевой системе схожей с дуэлями в Crusader Kings и данные операции нужны мне для ее реализации.
День 4
Опираясь на алгоритм, что до этого был испытан на Python, начал писать боевую систему уже на C#, попутно внося коррективы.
На Python ранения просто изменяли итоговые параметры здоровья и доблести (подобнее о системе в прошлом посте). Однако, по задумке ранения будут оставаться и после боя, каждое имеет свой срок заживления.
Для хранения информации о ранениях я создал три массива:
- Текстовое имя ранения
- Штраф доблести
- Штраф к здоровью
И в этом была моя ключевая ошибка... я создал МАССИВЫ, а в них нельзя добавлять больше элементов, чем заданно изначально. Снова поторопился и накосячил потакая своей гоблинской натуре, что поделать. В итоге узнал, что помимо массивов в C# есть списки и стал изучать класс List.
Заменив все три массива на списки я решил проблему и оно запустилось! ХВАЛА ГОРКУ И МОРКУ, WAAAGH!
Итог
Пока что мне в кайф изучать новый язык и экспериментировать. Как минимум я уже начинаю понимать возможности для различных игровых механик.
На днях расскажу подробнее про расширение своей боевой системы, типы ранений и различные виды оружия.
Если тебе интересно наблюдать за развитием новичка в GameDev (или смеяться) - подписывайся на мой блог Goblin Cave!
Всем привет. Решил поделиться кодом для создания подземелья, который я использую в своём рогалике. Код опубликовал год назад, но добавить пояснения и комментарии для начинающих руки дошли только сейчас.
Примеры генерации, как настроить канвас и прикрепить скрипт (первая минута): https://www.youtube.com/watch?v=_Vz9FDigioU
В игре есть тропический остров, на котором расположены руины, после обнаружения которых игрок спускается в подземелье состоящее из нескольких этажей (есть опция начать сразу с подземелья). Собственно с помощью кода создаётся основа для каждого этажа (но можно использовать и для создания интерьеров в наземных прямоугольных строениях). Работа алгоритма построения проста - сначала строится горизонтальная или вертикальная стена и в ней отмечается дверь (или несколько), таким образом пространство делится на две части, в каждом из которых происходит последующее разделение на две части и т.д. За основу взят метод построения правильных лабиринтов “Recursive Division”, посмотреть интерактивные примеры (в том числе и для десятка других алгоритмов) и код для ruby можно здесь: http://www.jamisbuck.org/mazes/
Чтобы в подземелье были «комнаты» и возможность нарезать круги добавлено ограничение на минимальный размер комнаты (int roomMinHorizontal, roomMinVertical) и шанс построения дополнительной двери (int extraDoorChance, minLengthForExtraDoor - минимальная длинна стены для дополнительной двери). В коде всего три метода, давайте посмотрим что они выполняют.
CreateDungeon() - главный метод, вызывается по нажатию пробела, строит подземелье и отрисовывает его на спрайте. В начале метода происходит проверка размера карты - по горизонтали и вертикали должны быть только нечётные числа. Затем идёт инициализация двумерного массива int[,] maze в котором и будет храниться карта. Далее - вызов метода разделения начальной пустой области Division(). Отрисовка полученной карты идёт с 39 по 56 строку - создается текстура и спрайт, текстуре присваивается цветовая информация (стены, пол, двери). Этот фрагмент можно использовать для отображения в игре мини-карты.
Division(int startX, int endX, int startY, int endY) - определение как надо разделить переданную область от стартовых координат (int startX, int startY) до конечных (int endX, int endY) на две части. В методе производится проверка габаритов области и если она слишком мала то выходим из метода через return - в этом случае дальнейшие действия в этом прямоугольнике не производятся. Если нет - создаём новую область через CreateRoom().
CreateRoom(bool isHorizontal, int startX, int endX, int startY, int endY) - непосредственно построение стены и дверей в определенной «комнате». isHorizontal - область по горизонтали шире чем по вертикали, т.е. будет ли построена вертикальная или горизонтальная стена. Сделано для того, чтобы комнаты не были слишком растянуты в одном из направлений. Это определяется в предыдущем методе через if (endX - startX > endY - startY), для квадратных комнат используется рандомное расположение стены. После этого проводится стена в массиве maze[verticalWall, i] = 1 (0 - пол, 1 - стена, 2 - дверь), через int doorNumbers определяем количество дверей в ней - как минимум должна быть одна дверь (но вы можете усложнить не добавляя на этом этапе дверей и создав телепорты для несвязанных частей подземелья). Затем вызывается Division() для каждой из двух областей разделённых стеной и происходит дальнейшее деление, пока не останется неразмеченных областей, после чего продолжится выполнение метода CreateDungeon() и будет визуально отрисована карта получившегося подземелья.
Итак, какие есть плюсы и минусы данного алгоритма. Построение комнат элементарно, при этом они все связаны и при дополнительных дверях появляется нелинейность прохождения. Также игровое пространство используется по максимуму, а с получившимися прямоугольниками в дальнейшем легко работать, расставляя в них мобов и дополнительный интерьер. В то же время, простота алгоритма определяет и его недостатки - некоторая однообразность и предсказуемость - в подземелье будет как минимум одна стена идущая от края до края. Более интересных и «пещеристых» подземелий можно добиться с помощью модификации этого алгоритма под названием "Blobby" Recursive Subdivision Algorithm (в ссылке выше примеры идут сразу после Recursive Devision). Однако, для своего проекта решил остановиться на первом варианте, поскольку мне удобнее работать с прямоугольниками, а вот внутри уже них я применял другие алгоритмы для создания самых разнообразных помещений, пещерок и коридоров. Вот примеры того как таким образом можно усложнить подземелье (игрок на карте отмечен зелёным кружочком):
Здесь коридоры на самом деле тоже находятся внутри прямоугольных комнат - они просто соединяют клетки дверей граничащих комнат, а остальное пространство заливается стенами.
Пару слов о рогалике Tzakol in Exile. Разработку веду с 2021 года, планировал опубликовать в прошлом году, но притормозил и отодвинул дату до лучших времён. Сейчас периодически добавляю новый контент и то, что раньше было демоверсией постепенно повышаю до уровня lite - бесплатной версии. В ней есть два режима - с мета-прогрессией и в стиле традиционных рогаликов (доступны за исключением нескольких последний этажей и сражения с финальным боссом). Планирую добавить ещё блиц-режим, который будет представлен в lite-версии полностью. Скачать демо можно в стиме: https://store.steampowered.com/app/1764840/Tzakol_in_Exile/
Если есть вопросы по коду или по игре - пишите в комментариях, постараюсь ответить.