C# обучение для чайников

Формула программиста
основатель — Волосатов Евгений Витольдович

Игра СОКОБАН

Приглашаю пройти видеокурс по созданию полноценной игровой программы СОКОБАН.
Мы вместе, за руку, пройдём по всем этапам создания законченной интеллектуальной игры.
1. Создание редактора уровней.
2. Придумывание этих самых уровней.
3. Создание собственно игры.
4. Решение олимпиадной задачки для добавления ИИ.
5. Переделка игры в режим "на двоих".
6. Написание класса Phone для связи двух программ по сети.
7. Создание сетевой версии игры Sokoban.
8. Оформление итоговой программы.

Открытие 27 ноября в 18:00

Название: Игра Сокобан
Объём: 21 видеоурок.
Доступ: 30 дней

5,000 руб


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

Список уроков | фото | видео

# Название видеоурока Решило Рейтинг Доступ
1 Сокобан - Вступление 00:11:09 114 чел. ★ 4.8 Done
  Отчёт отправил: 7276. Ильшат Решено за 2 час. 40 мин. [Показать отчёт]
Научился: Научился играть в Сокобан. 
Сложности: Выполнить задание - пройти 10 уровней. 
Комментарии: На первом скриншоте представлен последний шаг для завершения 10 уровня, на втором - список пройденных уровней. Великолепная игра, вроде бы ничего сложного, толкаешь ящики по всей карте, но есть свои особенности, ограничения, которые придают изюминку. По ходу прохождения уровней представление об игре изменилось: здесь можно надолго засесть, продумывая различные ходы и комбинации. Достаточно сложно и интересно, затягивает, теперь появился интерес самому создать такую игру) 
2 Сокобан - Подготовка - Картинки и лабиринт 00:04:56 76 чел. ★ 4.9 Done
  Отчёт отправил: 7276. Ильшат Решено за 1 час. 20 мин. [Показать отчёт]
Научился: Скачал Paint.net, научился накладывать несколько рисунков друг на друга, создавать прозрачный фон у изображения. 
Сложности: Найти 6 подходящих картинок, тематика - Белка из Ледникового периода) 
Комментарии: Достаточно долгое время выбирал картинки, подгонял их под размеры. До этого не сталкивался с такими задачами, как прозрачное выделение и накладывания картинок друг на друга, а в этом уроке потребовалось научиться. Погуглил, ссылки вывели на использование программы Paint.net, скачал ее, сделал по инструкции для чайников, заработало) 
3 Сокобан - Редактор - Загрузка 00:33:25 76 чел. ★ 4.9 Done
  Отчёт отправил: 7276. Ильшат Решено за 50 мин. [Показать отчёт]
Научился: Повторил работу с двумерными массивами в C#, построчное считывание данных из файла. 
Сложности: Сложностей не было. 
Комментарии: Не так давно выполнял видеоурок по составлению расписания, узнал, что компонент DataGridView индексирует данные вертикально, что было для меня неудобным. Здесь вновь столкнулся с этим) Для меня непривычно, когда матрицы заполняются вертикально (т.е. первый индекс это столбец, а второй строка), приходится напрягаться, чтобы лучше ориентироваться что и где находится. Я привык, что многомерные массивы - это массивы вложенных массивов, а в случае двумерного массива или матрицы - это массив одномерных массивов, где первый индекс - это номер строки (то есть, номер вложенного массива), а второй индекс - это номер столбца (то есть, индекс во вложенном массиве) и заполнение идет горизонтально. 
4 Сокобан - Редактор - Интерфейс 00:40:37 63 чел. ★ 5 Done
  Отчёт отправил: 7276. Ильшат Решено за 2 час. 10 мин. [Показать отчёт]
Научился: Познакомился с компонентом ToolStrip. 
Сложности: После редактирования кода искал ошибку форматирования, как оказалось, проблема была в том, что в файле сначала идет число столбцов, потом число строк, в программе же я считывал наоборот. 
Комментарии: По предложению Евгения Витольдовича хотел добавить 4 картинки для игрока, но потом решил, что это будет отвлекать. Поэтому выбрал другой путь, нашел другую картинку Белки, где она смотрит прямо. Немного подкорректировал картинки, чтобы орехи и Белка были на фоне снега. Написал по видео уроку программу, запустил, результат понравился) Правда, как Илья говорил, все мелко, если это окажется критичным, то переделаю. Код немного переделал, добавил несколько служебных pod-классов, переименовал переменные, методы.  
5 Сокобан - Редактор - Редактирование 00:38:33 57 чел. ★ 4.9 Done
  Отчёт отправил: 7276. Ильшат Решено за 1 час. 50 мин. [Показать отчёт]
Научился: Повторил работу с ToolStrip, сохранение данных в Tag картинки и ее дальнейшее использование, в этом уроке сохраняли информацию типа Point. 
Сложности: Сложностей не было, немного меняю код, появляются небольшие несостыковки, эксперименты. 
Комментарии: Интересный урок, хорошо видна связь между тем, что крутится в программе и тем, что показывается на экране формы. От себя немного изменил код, константы размеров поля перенес в свой класс, переименовал методы и переменные. Как временное решение перенес двумерный массив cell в класс и сделал его открытым для чтения и модификаций. Проверку на размерность поля вынес в конструктор класса Game_area, если инвариант проваливается, то вылетаем с эксепшеном и на другом конце провода ловим его в специальном методе create_game_area, который показывает MessageBox с ошибкой и возвращает прежние параметры поля. 
6 Сокобан - Редактор - Сохранение 00:44:47 54 чел. ★ 4.9 Done
  Отчёт отправил: 7276. Ильшат Решено за 1 час. 50 мин. [Показать отчёт]
Научился: Повторил работу с загрузкой/сохранением данных в файл. 
Сложности: Ошибка при сохранении файла - выход за границы массива, когда обращался к старому массиву строк по индексам нового, расширенного массива. Просто посмотрев код не понял причину, помог отладчик) 
Комментарии: Я выбрал немного другой способ сохранения игровых уровней в файл, написал код с нуля, использовал второй массив new_lines, который заполнял в трех циклах: первый цикл - это копирование уровней из lines до строки сохраняемого уровня, второй цикл - это копирование содержимого cell, то есть сохраняемого уровня, третий цикл - это копирование оставшихся уровней. По сути то же самое, что по уроку, но мне мой вариант проще понимается, хотя с индексами второго массива немного засиделся. Здорово, у меня теперь есть полноценный редактор уровней игры Сокобан!) 
7 Сокобан - Редактор - Улучшение 00:29:00 53 чел. ★ 5 Done
  Отчёт отправил: 7276. Ильшат Решено за 2 час. 10 мин. [Показать отчёт]
Научился: Повторил работу с toolStrip, toolStripComboBox. 
Сложности: Понять, как сделать значения из списка toolStripComboBox доступными только для чтения. 
Комментарии: Понравился способ добавления сразу нескольких элементов на поле игры. Внес небольшие изменения, поставил перед собой цель - ограничить выбор и установку значения ширины и высоты уровня в допустимых пределах, то есть, разрешить ввод только числовых значений и организовать проверку случая выхода за границы интервала минимального и максимального размера уровня. Сначала хотел добиться этого путем создания дополнительного кода: просто брать данные из textBox и парсить, но хотелось другого решения, с помощью средств компонентов Windows Forms. Решение оказалось простым - компонент toolStripComboBox. Для того, чтобы игрок не мог ввести буквы и число вне диапазона, установил значение свойства DropDownStyle = DropDownList, и благодаря этому данные из toolStripComboBox оказались доступными только для чтения и возможный выбор размера ограничен моим заранее созданным списком значений. Осталось дело за малым, корректно заполнить список элементов списка и в дальнейшем обрабатывать выбранное значение. 
8 Сокобан - Создаём свои уровни 00:08:05 51 чел. ★ 4.9 Done
  Отчёт отправил: 7276. Ильшат Решено за 1 час. 40 мин. [Показать отчёт]
Научился: Повторил работу с редактированием уровней, улучшил интерфейс программы. 
Сложности: Придумать два уровня игры Сокобан. 
Комментарии: От себя добавил два уровня, которые представлены на скриншотах, в интернете нашел 12 уровней, все сохранил в файл levels.txt. Во время создания уровней обнаружил некоторые недочеты в своем оформлении, коде. Например, у меня в программе из предыдущего отчета при смене уровня не обновлялись счетчики установленных орехов и кладовок, это критично. Изменив это, обнаружил новый недочет. Так как в разных уровнях установлены разные количества орехов и кладовок, то метки с описание счетчиков автоматически расширялись и сужались в зависимости от текста, например, 1x и 10x имеют разную ширину вывода. Это приводило к тому, что панель инструментов "бегала вправо-влево" и когда быстро щелкал на правую стрелку, чтобы перейти к последним уровням, то "по ошибке" попадал на стрелку влево. Поэтому установил у меток-счетчиков орехов и кладовок свойство AutoSize на False и подобрал достаточное абсолютное значение ширины. Далее, установил минимальные значения ширины и высоты формы, чтобы не сворачивалась верхняя панель инструментов. 
9 Сокобан - Игра - Интерфейс 00:43:45 53 чел. ★ 5 Done
  Отчёт отправил: 7276. Ильшат Решено за 1 час. 20 мин. [Показать отчёт]
Научился: Поработал с компонентом LinkLabel. 
Сложности: Сложностей не было. 
Комментарии: Вместо кнопки использовал LinkLabel, установил прозрачный фон, убрал подчеркивание, думаю так смотрится лучше) Будет интересно посмотреть на класс Game и использование делегатов. Думаю реализация будет аналогичной как в игре "Домино" из курса "Игры со спрайтами". 
10 Сокобан - Игра - Управление 01:06:38 46 чел. ★ 5 Done
  Отчёт отправил: 7276. Ильшат Решено за 2 час. 40 мин. [Показать отчёт]
Научился: Идея использовать два массива: статичных и динамичных объектов. 
Сложности: Насколько знаю, в C# операция присваивания для объектов означает просто копирование ссылки. Я привык (привет, C++ где бОльший контроль над объектами), что если адекватный автор неполиморфного класса разрешил и перегрузил конструктор копирования и оператор присваивания по lvalue reference, то при копировании выполняется deep copy содержимого. Напоролся на разницу в семантике двух языков, в своем написанном коде минут 15 думал, почему же данные затираются. Все работает, а данные кривые. Опять-таки, помог отладчик. Наверняка в C# есть встроенные возможности по копированию, deep или shallow, пока что не сталкивался и не изучал, двоечник) 
Комментарии: Мне понравилась идея использовать два массива, один для неподвижных объектов, другой для подвижных. Написал все по уроку, понравился класс Game, все аккуратно. Уже в конце урока пошли дополнения, разные варианты, с чата предлагали решение проверки на доступность уровней. Код проверки, на мой взгляд, оказался не в том месте, этим должен заниматься класс Game, поэтому переделывал по себя. Попутно взялся за свой класс загрузчика уровня, наконец, довел его до состояния, с которым мне удобнее работать. Позже изменю метод save, он у меня не ахти - длинный, некрасивый и дублирует код. Все-таки здорово, когда уже есть функционал, которым можно крутить как угодно. Писать с нуля сложнее, надо много думать об интерфейсе клиента и прочее. Интерфейс игры пока что не менял, есть где вести доработки, например фон Белки, когда она стоит на плитке-кладовке. Данила предложил подумать над плитками. Ждем разбора полетов на следующем вебинаре) Игра понравилась, здорово, спасибо Евгений Витольдович, база отличная, теперь идем дальше, к улучшениям и триксам) 
11 Сокобан - Решалка - Тестер 00:59:55 40 чел. ★ 5 Done
  Отчёт отправил: 7276. Ильшат Решено за 2 час. 15 мин. [Показать отчёт]
Научился: Поработал с консольным выводом, научился изменять положение курсора, цвет выводимого текста. 
Сложности: Сложностей не было. 
Комментарии: По-другому организовал код: написал класс SokobanTester, создал его экземпляр в статичном методе Main. Придумал тестовый уровень, написал для него решение. Поработал с выводом информации на консоль. Для удобства проверки решения, символ следующего шага выделен желтым цветом. Урок понравился, теперь знаю некоторые способы удобного и красивого вывода информации в консоль, спасибо) 
12 Сокобан - Решалка - Мышка 00:53:02 39 чел. ★ 5 Done
  Отчёт отправил: 7276. Ильшат Решено за 4 час. 15 мин. [Показать отчёт]
Научился: Повторил алгоритм поиска в ширину, увидел его реализацию с использованием очереди. 
Сложности: Был момент, когда мое решение не работало. Искал причину, ошибка была в том, что у нас в этой программе используется один массив для статических и динамических объектов. Поэтому когда игрок достигал целевой точки, то вставал на ее место и она исчезала из карты. Решил с помощью дополнительных переменных, но решение с двумя массивами лучше. 
Комментарии: На этот раз решил поэкспериментировать, разделить код по классам. Полученным решением более-менее доволен, уже можно расширять и создавать новые программки из этих маленьких кирпичиков. Немного расширил функционал программы, добавил меню, возможность установки позиций игрока и целевой точки, расчет по этим точкам траектории движения и пошаговый режим к целевой точке. 
13 Сокобан - Решалка - Яблоко 00:44:23 38 чел. ★ 5 Done
  Отчёт отправил: 7276. Ильшат Решено за 2 час. 10 мин. [Показать отчёт]
Научился: Повторил работу с двумерными массивами. 
Сложности: Сложностей не было. 
Комментарии: Несколько раз натыкался на небольшие неточности в использовании своего кода. Все-таки, сначала нужно хорошенько составить публичный интерфейс класса, его корректное использование, чтобы в дальнейшем при обращении к этому объекту не задумываться о каких-то хитрых связях внутри объекта. Для этого, нужно при создании класса изолироваться от остального мира классов, рассматривать все локально, накинуть юнит-тесты и только потом собирать все воедино. В моем случае получилось несколько стихийно, что затормозило разработку. 
14 Сокобан - Решалка - Оптимизация 00:11:37 38 чел. ★ 5 Done
  Отчёт отправил: 7276. Ильшат Решено за 35 мин. [Показать отчёт]
Научился: Оптимизировать алгоритм поиска траектории движения для игры Сокобан. 
Сложности: Сложностей не было. 
Комментарии: Да, результат впечатляет, хорошая оптимизация поиска. На первом скриншоте представлен результат работы алгоритма с использованием List<>. На втором скриншоте - результат работы оптимизированного алгоритма, с использованием четырехмерного массива. В первом случае время решения 69 мс, во втором - 4 мс. 
15 Сокобан - Игра - Автоходы 00:42:22 37 чел. ★ 4.9 Done
  Отчёт отправил: 7276. Ильшат Решено за 1 час. 20 мин. [Показать отчёт]
Научился: Самостоятельно изучил индексаторы в C#. 
Сложности: Работа с индексами двумерных массивов. Эта проблема идет с самого начала проекта Сокобан, после того, как я решил использовать в качестве первого индекса двумерных массивов - номер строки, а второй индекс обозначает номер столбца. В дальнейшем, ситуация стала критической - в программе обработка данных ведется как пара (x, y), а обращение к элементам массива как (y, x). Во время выполнения этого урока несколько раз ошибочно путал местами x, y. Меня это утомило, настало время навести в этом порядок и выполнить унификацию доступа. В предыдущих уроках я создал класс Level, для хранения информации о загруженном уровне. Для унификации доступа было необходимо добавить некий промежуточный слой между пользователями Level и хранящейся в нем матрицей уровня. Этот промежуточный слой должен выполнять преобразование координат из (x, y) в (y, x). Для удобного доступа к данным и прозрачного преобразования координат искал нечто подобное перегрузке оператора []. В C# для этого используются индексаторы. Почитал материал, попробовал на двумерном массиве и все получилось. Теперь везде доступ по x, y. Вздохнул свободно)  
Комментарии: Интересное дополнение, автоходы значительно экономят время, спасибо) 
16 Сокобан - Редактор - На двоих 00:31:57 33 чел. ★ 5 Done
  Отчёт отправил: 7276. Ильшат Решено за 2 час. 40 мин. [Показать отчёт]
Научился: Проверка на существование файла File.Exists(), в случае отсутствия создание пустого файла. 
Сложности: Сложностей не было. 
Комментарии: Понравилось то, что создание редактора для новой игры потребовало небольших изменений. От себя добавил 10 уровней, разной сложности, на скриншотах показаны первые два. Интересная задумка, игра на двоих: здесь можно реализовать как соревнование, так и кооперацию) 
17 Сокобан - Игра - На двоих 00:15:40 33 чел. ★ 5 Done
  Отчёт отправил: 7276. Ильшат Решено за 30 мин. [Показать отчёт]
Научился: Обработке нажатия цифровых клавиш NumPad. 
Сложности: Сложностей не было. 
Комментарии: Здесь хорошо подошла идея использовать два массива map и top. Несколько изменений в коде и в результате новая игра, здорово) 
18 Сокобан - Телефон - TCP/IP протокол 00:47:44 44 чел. ★ 5 Done
  Отчёт отправил: 7276. Ильшат Решено за 1 час. 10 мин. [Показать отчёт]
Научился: Повторил работу с нитями (Thread), с передачей данных между клиент-серверными приложениями. 
Сложности: Сложностей не было. 
Комментарии: Данный урок ранее выполнял в качестве VIP-урока по курсу Игры со спрайтами. Решил пройти еще раз, для закрепления. Материал был знакомый, в этот раз оценил удобство использования делегата для асинхронного вывода информации о получении данных. 
19 Сокобан - Игра - На двоих по сети 00:56:59 32 чел. ★ 5 Done
  Отчёт отправил: 7276. Ильшат Решено за 1 час. 50 мин. [Показать отчёт]
Научился: Создал сетевую версию игры "Сокобан". 
Сложности: Сложностей не было. 
Комментарии: Интересный урок, в котором наглядно показано использование "абстрактного" (имеется ввиду не привязанного к конкретной предметной области или приложению) класса Phone для расширения возможностей уже существующей игры. 
20 Сокобан - Завершение 00:37:44 31 чел. ★ 5 Done
  Отчёт отправил: 7276. Ильшат Решено за 2 час. 20 мин. [Показать отчёт]
Научился: Закрепил полученные знания по прошлым урокам. 
Сложности: Сложностей не было. 
Комментарии: Поначалу хотел переписать весь код, сделать его более абстрактным, расширяемым. Потом понял, что в итоге у меня получится ситуация, аналогичная консольным программам в этом курсе: да, будет абстракция, да, все по полочкам и слабо зависит друг от друга, но толку от этого? Акцент в тех программах был на алгоритмах, а не на жонглировании кодом, поэтому в этот раз решил принять предложенный финальный вариант. В дальнейшем буду уделять внимание алгоритмам, функционалу, возможностям программ, а в коде стремится к простоте, как было отмечено во время марафона. Для решения проблемы с архитектурными излишествами и терзаниями уже пора бы "нормально" прочесть старые-добрые книжки Коплиена, GoF, GRASP и поставить наконец-то эту жирную точку) 
21 ФИНАЛЬНЫЙ урок. Видео-обзор проекта Сокобан 00:23:23 21 чел. ★ 5 Done
  Отчёт отправил: 7276. Ильшат Решено за 40 мин. [Показать отчёт]
Научился: Повторил создание видео обзоров. 
Сложности: Кратко рассказать про пройденный курс) 
Комментарии: Данный курс я начал проходить во время новогоднего марафона программиста, где была хорошая поддержка Евгения Витольдовича и марафонцев. В целом, очень достойный курс, хорошие дополнения, такие как автоходы, игра на двоих, по сети. Спасибо, Евгений Витольдович!) 
Видеообзор: https://youtu.be/J7pDmAqdUFU
22 VIP. Бот для игры БАЛДА 01:22:57 4 чел. ★ 5 Done
  Отчёт отправил: 7276. Ильшат Решено за 4 час. 20 мин. [Показать отчёт]
Научился: Повторил работу с рекурсией, множествами, динамическими массивами. 
Сложности: Рекурсивная функция поиска search. 
Комментарии: Данный урок ранее выполнял в предновогоднюю чашку кофе, тогда сроки выполнения задания были сжаты и поэтому мало времени уделил разбору алгоритма. В этот раз времени много, пишу самостоятельно и хотя использовал алгоритм из урока: двойной цикл по матрице, в нем цикл по алфавиту, далее двойной цикл по матрице с подставленной буквой и запуском рекурсии, но часто возникали мелкие недочеты, ручка с тетрадкой хорошо помогли:). Понравилась работа рекурсивной функции и как она "заметает" за собой следы. Оптимизация поиска так же хорошо подошла для этой задачи. 
  Итого:   22 видеоурока общей продолжительностью 13 час. 48 мин. 4 чел. ★ 4.97  
  Финалисты:   zhikharevav,   Ильшат,   Максим,   Новопашин Владимир .

Начинаем практику по языку C#




Чтобы стать хорошим программистом — нужно писать программы. На нашем сайте очень много практических упражнений.

После заполнения формы ты будешь подписан на рассылку «C# Вебинары и Видеоуроки», у тебя появится доступ к видеоурокам и консольным задачам.

Несколько раз в неделю тебе будут приходить письма — приглашения на вебинары, информация об акциях и скидках, полезная информация по C#.

Ты в любой момент сможешь отписаться от рассылки.
Научился: Практикуюсь в записи видеообзоров
Трудности: Сделать запись. При закуске программы возникла ошибка. пришлось ее исправлять и все переделывать.
Я завершила этот курс!!!
Смотреть видеозапись: https://youtu.be/mCgKbXAxru0
Научился: Доводить курс до конца.
Трудности: записывать ночью
Замечательный курс. Тут и создание классов, и их взаимодействие - очень было полезно все это сделать.
Смотреть видеозапись: https://youtu.be/Q0CazQPvgNg