Си шарп с нуля

Формула программиста

основатель — Волосатов Евгений Витольдович

Клуб формулистов - Ежемесячная подписка

Вступление в Клуб Формулистов на выгодных условиях для НОВЫХ участников.

После взноса 512 256 руб. вы получите подписку
в Клуб Формулистов на 30 дней и 256 байт для быстрого старта.
Байты используются для открытия более одного урока в день, по 50 байт за урок.

Стоимость 1 дня за первый месяц: всего 8 рублей.

Первый взнос - 256 руб./30 дней.

Через 30 дней будет списано 3,000 2,400 руб.
за продление подписки в Клуб на 30 дней + подарок 512 байт.

Так будет продолжаться каждые 30 дней, пока вы не отмените подписку.
Средства будет автоматически считываться с вашей карты.
Вы в любой момент сможете отказаться от продления Клуба.

Только ДО КОНЦА НЕДЕЛИ -
-50% скидка на первый взнос, всего 256 рублей!
-20% скидка на ЕЖЕМЕСЯЧНЫЙ платёж!
Всего 2400 руб/месяц (вместо 3000 руб/месяц), или 80 руб./день - цена чашки кофе.


Стоимость 1 дня: 80 руб.

Хочу вступить!

Также есть другие варианты оплаты участия в КФ:

Билет в клуб формулистов на ...
30+ дней | 60 дней | 150 дней | 380 дней | 1000 дней

Внимание!
Стоимость участия в Клубе формулистов увеличивается 1 числа каждого месяца на 100 рублей.
При оформления подписки стоимость остаётся постоянной, пока подписка не будет отменена.







Первый взнос - 512 руб./30 дней + 512 байт.
Последующие взносы - 3,000 2400 руб./месяц + 512 байт.



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

# Название видеоурока Видео / Тесты Решило Рейтинг Доступ
1 FREE 1. Консольная игра. Добро пожаловать! 00:06:21
2 теста
49 чел. ★ 4.9 Done
  Дорога длиной в тысячу миль начинается с первого шага.

На этом уроке мы поговорим о предстоящем путешествии и сделаем наш первый шаг - создадим консольное приложение.
Отчёт отправил: 10558. Иван Воронин Выполнено за 19 мин. [Показать отчёт]
Научился: Начало положено, идём дальше. з.ы. так как ещё не известно, что получится, название может быть любым техническим, тогда не будет ограничиваться воображение. 
Сложности: найти время 
2 Марионетка 00:06:01
39 чел. ★ 5 Done
  На этом слайде мы сделаем управление символом с клавиатуры.
Отчёт отправил: 10558. Иван Воронин Выполнено за 53 мин. [Показать отчёт]
Научился: Если ничего не нажимается на клавиатуре, то перерисовка в консоли не осуществляется. Всё отлично, идём дальше. 
Сложности: найти время 
3 Представление выделяется 00:04:02
1 тест
39 чел. ★ 4.9 Done
  Show must go on!
На этом слайде мы вынесем команды для работы с экранам в отдельный класс View.
Отчёт отправил: 10558. Иван Воронин Выполнено за 20 мин. [Показать отчёт]
Научился: Вынес инициализацию в отдельный метод. Убрал мигающий курсор из консоли. Экземпляр класса View и координаты x, y сделал глобальными. Всё отлично, идём дальше. 
Сложности: найти время 
4 Модель игры 00:06:57
36 чел. ★ 5 Done
  На этом слайде мы выделим логику, модель в отдельный класс Game.
Отчёт отправил: 10558. Иван Воронин Выполнено за 18 мин. [Показать отчёт]
Научился: Так как это всё было реализовано ранее в общем классе, то просто перенёс код в новый класс Game. Всё отлично, идём дальше. з.ы. Инкапсуляция воплоти =) 
Сложности: найти время 
5 Контроллер не спешит 00:06:43
35 чел. ★ 4.9 Done
  На этом слайде мы сформулируем задачи контроллера и выделим его в отдельный класс.
Отчёт отправил: 10558. Иван Воронин Выполнено за 48 мин. [Показать отчёт]
Научился: Реализовал постоянное движение в заданном направлении. см. видео. Реализовал проверку, чтобы не объект не выходил за пределы игрового поля. Записал демонстрационное видео по удалёнке через Тимку, как будто я дома, а не в Саратовской области =) Всё просто, идём дальше. 
Сложности: найти время 
Видеообзор: AfV89YfZvd0
6 Цветной телевизор 00:03:50
1 тест
34 чел. ★ 4.9 Done
  На этом слайде мы создадим ещё одно представление и задействуем его в программе.
Отчёт отправил: 10558. Иван Воронин Выполнено за 19 мин. [Показать отчёт]
Научился: Реализовал вспомогательные функции установки цвета. Устранил баг заливки фона консоли при перемещении объекта, см. скриншот. Напрашивается обобщение View через интерфейс или абстрактный класс. Всё отлично, идём дальше. 
Сложности: найти время 
7 Видный интерфейс 00:04:45
1 тест
33 чел. ★ 4.9 Done
  На этом слайде мы создадим интерфейс IView и задействуем его в классе Game.
Класс Game теперь не зависит от конкретной реализации его представления.
Попробуйте сделать то же самое через абстрактный класс.
Отчёт отправил: 10558. Иван Воронин Выполнено за 28 мин. [Показать отчёт]
Научился: Реализовал абстрактный класс aView, реализующий интерфейс IView. Реализовал ещё один ViewInvers, которые меняет местами фон и шрифт, получается фон белый, шрифт чёрный, см. скриншот. Использование абстрактного класса полезно для устранения дубликатов кода. Всё отлично, идём дальше.  
Сложности: найти время 
8 Игра в библиотеке 00:05:01
33 чел. ★ 4.9 Done
  На этом слайде мы выделим логику игру в отдельную библиотеку.
Отчёт отправил: 10558. Иван Воронин Выполнено за 13 мин. [Показать отчёт]
Научился: Вынес в библиотеку логику Game, интерфейс IView и абстрактный класс aView. Всё просто, ждём продолжения. 
Сложности: найти время 
9 2. Рефакторинг. Перечисление субъектов 00:05:24
27 чел. ★ 4.9 Done
  Приступаем к рефакторингу.
На этом слайде мы составим список "главных героев", которые могут быть отображены на экране.
Отчёт отправил: 10558. Иван Воронин Выполнено за 14 мин. [Показать отчёт]
Научился: Уже ранее говорил, ещё раз на скриншоте показываю где сразу можно найти нужные шаблоны для быстрого создания не только перечислений =) з.ы. лучше использовать целочисленные значения в перечислениях, но символы для обучения нагляднее. 
Сложности: найти время 
10 Показ героя на экране 00:06:31
25 чел. ★ 5 Done
  На этом слайде мы задействуем перечисление субъектов в интерфейсе представления и во всех его реализациях.
Отчёт отправил: 10558. Иван Воронин Выполнено за 15 мин. [Показать отчёт]
Научился: Так как уже давно реализовал абстрактный класс aView, от которого и наследуются остальные View, то всё заработало ещё и половины урока не прошло, минимум изменений в одном файле, вместо каждого View. Всё отлично, идём дальше. 
Сложности: найти время 
11 Координатная структура 00:10:25
25 чел. ★ 5 Done
  На этом слайде мы создадим структуру Coord для хранения координат объекта на карте.
Отчёт отправил: 10558. Иван Воронин Выполнено за 24 мин. [Показать отчёт]
Научился: Не создавал конструктор в структуре, так как атрибуты публичные, то воспользовался инициализацией объектов. Добавил в структуру функцию Move(), тем самым код получился более компактным. см. скрин 2. з.ы. Структуры тоже можно создавать быстрее, см. скрин 1. Так же радует, что не приходится модифицировать каждый View, так как когда-то реализовал всё через общий абстрактный класс. 
Сложности: найти время 
12 Карта сокровищ 00:06:43
25 чел. ★ 5 Done
  На этом слайде мы создадим класс Level, в котором будет храниться карта уровня.
Благодаря этому классы мы сможем узнать, что в какой клетке поля находится.
Отчёт отправил: 10558. Иван Воронин Выполнено за 54 мин. [Показать отчёт]
Научился: Создать экземпляр класса Level(), передав размеры new Coord(width, height), установив начальные координаты игрока через SetSubject() и далее двигать игрока по полю не забывая синхронизировать с картой при помощи Get/SetSubject() 
Сложности: найти время 
13 Шаги по карте 00:05:31
1 тест
25 чел. ★ 5 Done
  На этом слайде мы задействуем класс Level в классе логики Game
Отчёт отправил: 10558. Иван Воронин Выполнено за 13 мин. [Показать отчёт]
Научился: Да, функционал перемещения однозначно надо объединять, чтобы в одном месте всё было и тем самым синхронизировалось. Всё отлично, идём дальше. 
Сложности: найти время 
14 Генерация лабиринта 00:07:29
1 тест
25 чел. ★ 5 Done
  На этом слайде мы сгенерируем лабиринт и отобразим его на экране.
Отчёт отправил: 10558. Иван Воронин Выполнено за 3 час. 18 мин. [Показать отчёт]
Научился: Не очень хорошая идея хранить динамические объекты на статической карте, так что персонаж у меня размечается по старинке, а карта подгружается из массива. 
Сложности: найти время 
15 Координатный перебор 00:06:51
1 тест
25 чел. ★ 5 Done
  На этом слайде мы создадим в структуре Coord метод для перебора всех координат, ограниченных указанным размером
Отчёт отправил: 10558. Иван Воронин Выполнено за 23 мин. [Показать отчёт]
Научился: По поводу разделения динамических объектов и статических я ещё на прошлом уроке говорил и пока что мысль свою не менял. По поводу yield да, красиво и компактно. По поводу заезда на границы вопрос решён ещё в прошлом уроке в этом всё так же отлично работает. Всё отлично, идём дальше. 
Сложности: найти время 
16 Подходящий размер! 00:04:50
25 чел. ★ 5 Done
  На этом слайде мы добавим проверки размеров нашего уровня.
Для этого мы добавим в структуру Coord ещё один метод Coord.InSize().
Отчёт отправил: 10558. Иван Воронин Выполнено за 2 час. 30 мин. [Показать отчёт]
Научился: Всё отлично, идём дальше. 
Сложности: найти время 
17 Правила игры 00:10:18
1 тест
24 чел. ★ 5 Done
  На этом слайде мы добавим проверку правил игры, чтобы главный герой не мог забираться на стенки.
Отчёт отправил: 10558. Иван Воронин Выполнено за 22 мин. [Показать отчёт]
Научился: Так как изначально все представления унаследованы от абстрактного IView, то изменения внёс только там. По поводу курсора да, скрыть и после передачи полученного символа передать true, чтобы отменять базовые действия в консоли при данном событии, получается что обработка кастомная. 
Сложности: найти время 
18 Дорога из жёлтого кирпича 00:01:42
1 тест
24 чел. ★ 5 Done
  На этом слайде мы разукрасим уровень - установим разные цвета для разных субъектов
Отчёт отправил: 10558. Иван Воронин Выполнено за 25 мин. [Показать отчёт]
Научился: Радует, что уроки короткие, не просто перевести дух, но и времени нет в силу катастрофического наплыва работы. Так как в игре уже реализованы три вида цветовой палитры, то просто доработал версию ViewColor, добавив свитч для выборки нужной комбинации fore/back, всё отлично, идём дальше. 
Сложности: найти время 
19 Ищи ветра в поле 00:06:36
1 тест
23 чел. ★ 5 Done
  На этом слайде мы напишем метод, который найдёт месторасположение субъекта на карте.
Воспользуемся этим методом для инициализации первоначальных координат игрока.
Отчёт отправил: 10558. Иван Воронин Выполнено за 17 мин. [Показать отчёт]
Научился: Так как на карте статических объектов не хранятся динамические, то данная функция пригодится в будущем для поиска статики типо монеток. Всё отлично, идём дальше. 
Сложности: найти время 
20 Координатный рефакторинг 00:10:17
1 тест
23 чел. ★ 5 Done
  На этом слайде мы добавим в структуру Coord операторы == и !=,
а также добавим метод проверки нахождения координат на краю поля.
Отчёт отправил: 10558. Иван Воронин Выполнено за 53 мин. [Показать отчёт]
Научился: Всё отлично, идём дальше. 
Сложности: найти время 
21 Собери монетки 00:17:17
1 тест
23 чел. ★ 5 Done
  На этом слайде мы добавим в игру монетки,
научимся их собирать и при этом добавлять новые.
Отчёт отправил: 10558. Иван Воронин Выполнено за 1 час. 25 мин. [Показать отчёт]
Научился: Так как изначально придерживаюсь политики, что динамика со статикой не должны пересекаться и храниться в одном контейнере, то реализовал тоже самое так, что бы это работало. Реализовал подсчёт и отображение собранных монеток. Всё отлично, идём дальше. 
Сложности: найти время 
22 3. Тестирование. Тестовый прогон 00:10:10
23 чел. ★ 5 Done
  Мы приступаем к очередному этапу созданию программы - написание unit-тестов.
На этом слайде мы создадим класс тестирования для структуры Coord.
Отчёт отправил: 10558. Иван Воронин Выполнено за 1 час. 9 мин. [Показать отчёт]
Научился: Да, вручную создание тестов веселее, так как понимание как оно работает под капотом всегда полезно, тем-более для программистов =) 
Сложности: найти время 
23 Тест обратной стороны Луны 00:08:20
23 чел. ★ 5 Done
  На этом слайде мы напишем тесты для методов InSize() и OnSide().
Отчёт отправил: 10558. Иван Воронин Выполнено за 39 мин. [Показать отчёт]
Научился: Вот именно поэтому и нужно создавать тесты, те кто ещё не делают этого, думаю после данного урока поймут всю пользу от это деяния. Всё отлично, идём дальше. 
Сложности: найти время 
24 Случайное тестирование 00:06:55
21 чел. ★ 5 Done
  На этом слайде мы напишем тест для методов Coord.YieldCoords() и Coord.GetRandom()
Отчёт отправил: 10558. Иван Воронин Выполнено за 23 мин. [Показать отчёт]
Научился: Так как у меня механика координат отличается, то и массив наполнен немного иными значениями для проверки. Всё отлично, идём дальше. 
Сложности: найти время 
25 Лабиринты тестирования 00:09:41
1 тест
21 чел. ★ 5 Done
  На этом слайде мы создадим тест для класса Level
Отчёт отправил: 10558. Иван Воронин Выполнено за 34 мин. [Показать отчёт]
Научился: Всё отлично, тесты очень полезная штука, помогают отлавливать мелкие баги, опечатки и т.д. идём дальше. 
Сложности: найти время 
26 Поиск монеток на поле Дураков 00:08:51
21 чел. ★ 5 Done
  На этом слайде мы закончим создание тестов для класса Level
Отчёт отправил: 10558. Иван Воронин Выполнено за 1 час. 26 мин. [Показать отчёт]
Научился: Повторение мать учения, отличный урок, тесты очень важная вещь и красиво выглядят зелёные галочки. Всё отлично, идём дальше. 
Сложности: найти время 
27 Внутренний мир Субъекта 00:03:26
20 чел. ★ 5 Done
  На этом слайде мы изменим модификатор доступа для метода Level.SetSubject()
Отчёт отправил: 10558. Иван Воронин Выполнено за 6 мин. [Показать отчёт]
Научился: Я думаю что это верное решение, двигаемся далее. 
Сложности: найти время 
28 Прогулка за ручку 00:12:10
18 чел. ★ 5 Done
  На этом слайде мы протестируем самый главнный класс Game в нашей библиотеке.
Отчёт отправил: 10558. Иван Воронин Выполнено за 1 час. 50 мин. [Показать отчёт]
Научился: Так как у меня используется таймер в игре и перемещение персонажа инертно в нужном направлении, поэтому у меня два метода, одни устанавливает направление движения, добавил проверки, чтобы скорость перемещения не превышала по модулю единицу. Всё отлично, идём дальше. 
Сложности: найти время 
  Итого:   28 видеоуроков 3 час. 23 мин.
14 тестов
18 чел. ★ 4.98  
  Финалисты:   Trira,   Александр,   Слава,   Дмитрий Че,   Иван Воронин,   Andrew,   Дмитрий,   DimanDOS,   Chip,   Tekashnik,   Александр,   vip,   Алексей В.,   Максим Лапшинов,   Александр Балбашов,   Никита,   Yefim,   Max .

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





Если вы пришли без приглашения -
введите тысяча двадцать четыре (цифрами).
Чтобы стать хорошим программистом — нужно писать программы. На нашем сайте очень много практических упражнений.

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

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

Ты в любой момент сможешь отписаться от рассылки.


Научился: Создал пустое решение. Создал в нем консольный проект. Избавился от static. Вывел на экран (консоль) приветствие.
Трудности: Пока очень легко.



Научился: Подучился рефакторить - выносить повторяющиеся действия в функции, а функции в классы для приведения проекта к модели MVC. При этом повторил модификаторы доступа: public, private, static, protected Как еще можно рефакторить не могу придумать - вроде уже ничего не осталось повторяющегося. Возможно нужно как раз двигаться в сторону MVC - что-то вынести из кода в отдельный класс. Но что? Нинаю)
Трудности: придумать что бы порефакторить)