Изучение c# на примерах

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

Игра Тетрис

Цель игры - набрать как можно больше очков.
Очки начисляются при заполнении
Полностью горизонтальной линии фигурами.
Тогда эта линия уберется и зачисляться очки.

Это 20 уроков по написанию игры Тетрис,
Мы пройдемся по всем этапам разработки.
Посмотрим что нам будет необходимо,
Чтобы легко, удобно и быстро управлять игрой.
Напишем несколько универсальных методов,
Которые помогут в работе с массивами.

Что ты получишь, пройдя курс:
+ Собственную игру Тетрис
+ Знания, для перемещения блоками элементов
+ Навык разработки динамических игр

Различные вариации игры
1. Классический
2. На прохождение
3. Классический вдвоем кооператив
4. Классический вдвоем каждый сам за себя
5. Вдвоем друг против друга

Объём: 17 видеоуроков
Время: 6 часов 28 минут.
Доступ на 30 дней.

4,000 руб.


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

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

# Название видеоурока Решило Рейтинг Доступ
1 Подготовка формы 00:10:54 24 чел. ★ 4.8 Done
  Отчёт отправил: 1101. Аркадий Решено за 10 мин. [Показать отчёт]
Научился: Создание проекта, работа со свойствами объектов 
Сложности: ничего 
Комментарии: нет 
2 Игровая доска 00:22:02 20 чел. ★ 4.8 Done
  Отчёт отправил: 1101. Аркадий Решено за 30 мин. [Показать отчёт]
Научился: заполнять панель двухмерным циклом. формула для автоматического расчета размера бокса int box_size = panel.Width / size_x; в том случае если бокс квадратный, то пойдет, если вычислять отдельно по высоте, то сделать int box_size_x = panel.Width / size_x; int box_size_y = panel.Width / size_y; 
Сложности: ничего 
Комментарии: нет 
3 Логика игры 00:17:08 17 чел. ★ 4.9 Done
  Отчёт отправил: 1101. Аркадий Решено за 30 мин. [Показать отчёт]
Научился: присваивать значения массивов друг другу, в зависимости от значения массива назначать значение переменной. 
Сложности: не могу понять как происходит отображение фигуры, в функции refresh мы просто присваиваем массиву box по индексу какое-то значение(цвет), но не пойму где происходит привязка box к panel_board ??? 
Комментарии: нет 
4 Класс Фигур 00:17:22 11 чел. ★ 5 Done
  Отчёт отправил: 1101. Аркадий Решено за 50 мин. [Показать отчёт]
Научился: Создавать структуры, заполнять структуры.  
Сложности: Понять саму идею работы структуры с массивом, а потом по индексу массива задавать бекколор массиву боксов. В итоге просто когда последовательно отслеживаешь мысль, с первого раза не прокатывает. 
Комментарии: так и не пойму как box связан с отображением!!! 
5 Движение фигур 00:22:20 11 чел. ★ 5 Done
  Отчёт отправил: 1101. Аркадий Решено за 40 мин. [Показать отчёт]
Научился: перемещать данные в массиве, тем самым перерисовывая их на форме. новая фигура должна появляться при: достижении текущей фигуры дна(т.е. проверять если нижняя граница уперлась в дно стакана или уперлась в заполненную ячейку снизу в массиве map_back) И start_position позволяет разместить новую фигуру. 
Сложности: ничего 
Комментарии: нет 
6 Разноцветные фигуры 00:21:38 11 чел. ★ 5 Done
  Отчёт отправил: 1101. Аркадий Решено за 30 мин. [Показать отчёт]
Научился: Создал цветовой массив, сделал проверки при перемещении фигур, добавление новой фигуры, сохранение фигуры в стакане. 
Сложности: ничего 
Комментарии: нет 
7 Поворачиваем фигуры 00:16:14 11 чел. ★ 5 Done
  Отчёт отправил: 1101. Аркадий Решено за 40 мин. [Показать отчёт]
Научился: Потренировался в координатах фигур. 
Сложности: ничего 
Комментарии: думаю что не самый изящный способ вращения, но это уже потом можно оптимизировать 
8 Управление 00:29:18 10 чел. ★ 5 Done
  Отчёт отправил: 1101. Аркадий Решено за 20 мин. [Показать отчёт]
Научился: управление по нажатию клавиатуры, работа таймера в активной форме. 
Сложности: хотел вставить условие в оператор switch, но не получилось, пришлось вынести за пределы switch. не совсем красиво но решение верное. 
Комментарии: нет 
9 Мини-панель 00:22:10 10 чел. ★ 5 Done
  Отчёт отправил: 1101. Аркадий Решено за 30 мин. [Показать отчёт]
Научился: добавил отображение следующей фигуры на панели. узнал как можно первоначально получить экземпляр объекта при первоначальном значении null. массивов map и map_back нет потому что мы их использовали для сохранения и перемещения фигуры, на панели следующей фигуры мы не используем данные методы, потому и не надо!!! 
Сложности: ничего 
Комментарии: нет 
10 Удаляем строки 00:32:37 9 чел. ★ 5 Done
  Отчёт отправил: 1101. Аркадий Решено за 1 час. 30 мин. [Показать отчёт]
Научился: Удалять строки в двумерном массиве, работа с массивами, добавлять строки в массив, работа с вложенными циклами 
Сложности: ну пришлось конечно подумать при реализации этих методов в алгоритм тетриса. 
Комментарии: Очень понравился урок!!! помимо понимания работы с массивами, сам думаешь с каким массивом надо работать!!! по несколько раз проходишь алгоритм чтобы еще раз разложить все по полочкам. Еще раз - ОЧЕНЬ понравился урок!!!! 
11 Проигрыш 00:14:54 8 чел. ★ 4.9 Done
  Отчёт отправил: 1101. Аркадий Решено за 20 мин. [Показать отчёт]
Научился: выводить счет игры ))) в методе АddFigureOnBoard() есть цикл по координатам фигуры, там сделал проверку на координат фигуры со стартовой позицией, если она уже занята на map_back, значит КОНЕЦ. 
Сложности: ничего 
Комментарии: нет 
12 Перезапуск игры 00:24:36 8 чел. ★ 5 Done
  Отчёт отправил: 1101. Аркадий Решено за 1 час. 00 мин. [Показать отчёт]
Научился: Сделал проверку вхождения фигур при вращении в стакан, перезапуск игры. 
Сложности: Сложность возникла при создании делегата. Я попробовал использовать делегат через Action (хотел сократить код). вставив вот такой участок кода if (map_back[start_position.x + coord.x, start_position.y + coord.y] > 0) { Action ShowWin = new FormTetris().ShowWin; ShowWin(false); return; } и сделав метод ShowWin с доступом public почему то при создании нового класса board ничего не происходило. Пока так и не разобрался с чем это связано!!! 
Комментарии: Варианты победы: достижение определенного количества очков; удаление определенного количества строк; если сделать игру с уровнями сложности то победой можно будет считать очистка стакана от всех строк; время прохождения........ ну и много еще чего!!! 
13 Главное меню 00:24:00 8 чел. ★ 5 Done
  Отчёт отправил: 1101. Аркадий Решено за 1 час. 00 мин. [Показать отчёт]
Научился: Создал форму и вызов из нее формы для игры. По окончанию сделал право выбора повторить или нет. Сделал заготовку под другой режим игры. 
Сложности: стараюсь применить в коде сокращенные конструкции, например public FormTetris(int n): this() { tek_lvl = n; } 
Комментарии: нет 
14 Уровень 1 00:34:28 8 чел. ★ 5 Done
  Отчёт отправил: 1101. Аркадий Решено за 30 мин. [Показать отчёт]
Научился: Создал новый режим игры, с продолжением, и перезапуском. 
Сложности: ничего 
Комментарии: нет 
15 Игра вдвоем кооператив 00:20:16 8 чел. ★ 5 Done
  Отчёт отправил: 1101. Аркадий Решено за 30 мин. [Показать отчёт]
Научился: Добавили еще один режим игры. 
Сложности: оптимизация 
Комментарии: нет 
16 Игра вдвоем каждый сам за себя 00:28:37 8 чел. ★ 5 Done
  Отчёт отправил: 1101. Аркадий Решено за 40 мин. [Показать отчёт]
Научился: Добавил режим игры для двух отдельных игроков. Использовать 2 экземпляра класса board. 
Сложности: сделать надпись для подсчета счета )) 
Комментарии: для второго игрока не надо добавлять класс Board потому как он уже есть, класс - это как шаблон, просто для второго игрока мы создаем второй экземпляр класса board и потом уже в нем оперируем данными. В это и есть вся фишка ООП, только не сразу она становиться понятной и осознанной. 
17 Баттл начинается! 00:29:46 5 чел. ★ 5 Done
  Отчёт отправил: 1101. Аркадий Решено за 1 час. 20 мин. [Показать отчёт]
Научился: Сделал новый режим - БАТЛ. Добавил выбор следующей фигуры через форму.  
Сложности: Сложно сразу понять последовательность работы методов и массивов данных, но если посидеть и несколько раз переосмыслить понимание придет. Сложность была при вызове другой формы и возврата значений от нее, пришлось некоторые классы и поля сделать public, чтобы проще было к ним обращаться. 
Комментарии: Все очень интересно а главное что наглядно показаны разные механизмы работы с объектами, классами, методами и полями. этот урок сильно прокачивает навыки. 
18 ФИНАЛЬНЫЙ УРОК 4 чел. ★ 5 Done
  Отчёт отправил: 1101. Аркадий Решено за 30 мин. [Показать отчёт]
Научился: записывать видео с первого раза ))) а вообще стал более быстро понимать как работать с классами и полями, их методами доступа, при реализации своих доработок немного пришлось изменить код чтобы получать доступ к полям в других классах. 
Сложности: устранить все ошибки в программе)) 
Комментарии: Всё очень понравилось. Хотелось бы сесть и самому все повторить, но думаю так быстро не получиться, хотя если такое проделать то это будет +200% к опыту. 
Видеообзор: https://youtu.be/TqycJxY4cos
19 VIP урок. Angry Birds или проблемы красивых игр 00:20:07 4 чел. ★ 5 Done
  Отчёт отправил: 1101. Аркадий Решено за 30 мин. [Показать отчёт]
Научился: Заменил простой background на image. Сделал игру более привлекательной. 
Сложности: Найти картинки. 
Комментарии: важно что картинка должна быть маленькой как и размер боксика, иначе я так понимаю переполняется буфер и игра выкидывает ошибку. выбрал немного другую тематику картинок - алмазики ))) Ура - я завершил этот курс!!! 
  Итого:   19 видеоуроков общей продолжительностью 6 час. 48 мин. 4 чел. ★ 4.97  
  Финалисты:   Аркадий,   Сергей Соколов,   Николай,   Алексей|BrisK|Кривицкий .

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




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

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

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

Ты в любой момент сможешь отписаться от рассылки.
Научился: По канонам ООП научился создавать класс, отвечающий за логику игры! Это дорогого стоит. Научился писать процедуры передвижения и поворота фигур на доске и управление клавишами. Научился использованию консоли для процедуры замещения строк. продолжил изучение делегатов. Рассмотрено много механизмов работы с классами, объектами и методами.
Трудности: Были сложности с выполнением некоторых ДЗ. Были ошибки. Кирилл подробно и четко все объяснял.
Многое планировал сделать на этом курсе. Но из-за частичной потери зрения не реализовал. Очень надеюсь вернуться позже к курсу и все задумки претворить в жизнь. В первую очередь сделать музыкальное сопровождение, как в Тетрисе образца 90-х годов. Я очень благодарен Кириллу за воплощение игры средствами Си#. Он очень верно почувствовал тренд спроса на подобные игры. Все уроки очень проработаны. Показаны возможные ошибки и их последствия. Рассчитано на новичков, но и профи найдут много полезного. Пока не планирую проходить какой-либо курс. Надо восстановить зрение.
Смотреть видеозапись: https://youtu.be/6sgx0mYHh9Y
Научился: Спасибо за отличный видео курс. На этом курсе я повторил теорию ООП. Научился работать с массивами. Научился обрабатывать нажатия клавиш и многому другому.
Трудности: в принципе ничего сложного не вспомню.
Еще больше таких отличных курсов =)
Смотреть видеозапись: https://youtu.be/SxKRYpR0OL0