Си шарп с нуля

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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







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



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

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

На этом уроке мы поговорим о предстоящем путешествии и сделаем наш первый шаг - создадим консольное приложение.
Отчёт отправил: 18783. Andrew Выполнено за 8 мин. [Показать отчёт]
Научился: Создал пустое решение, создал в нём консольный проект. Избавился от static, вывел на экран приветствие. 
Сложности: Пока всё просто. 
2 Марионетка 00:06:01
43 чел. ★ 5 Done
  На этом слайде мы сделаем управление символом с клавиатуры.
Отчёт отправил: 18783. Andrew Выполнено за 26 мин. [Показать отчёт]
Научился: Создал и определил координаты объекта. Вывел символ в указанных координатах. Считал с клавиатуры нажатую клавишу. Изменил координату в зависимости от направления. Организовал бесконечный цикл. Сделал затирание символа при перемещении. Закончил игру по нажатию клавиши Escape. 
Сложности: Всё в порядке. 
3 Представление выделяется 00:04:02
2 теста
43 чел. ★ 5 Done
  Show must go on!
На этом слайде мы вынесем команды для работы с экранам в отдельный класс View.
Отчёт отправил: 18783. Andrew Выполнено за 26 мин. [Показать отчёт]
Научился: Извлёк метод вывода символа на экран по указанным координатам. Извлёк метод вывода приветствия. Создал класс View и перенес туда эти методы. Сделал эти методы публичными и не-статичными. Внёс соответствующие изменения в метод Start() и проверил работу. 
Сложности: Написать, что ещё можно порефакторить 
4 Модель игры 00:06:57
40 чел. ★ 5 Done
  На этом слайде мы выделим логику, модель в отдельный класс Game.
Отчёт отправил: 18783. Andrew Выполнено за 3 час. 23 мин. [Показать отчёт]
Научился: Создал класс Game Добавил поле view и установил его через конструктор. Добавил поля для координат и установил их значения в методе Start(). Создал метод Move (int sx, int sy) для перемещения объекта. Изменил код в операторе switch() на использование метода Move(). Проверил работу программы. 
Сложности: Всё ОК. 
5 Контроллер не спешит 00:06:43
1 тест
39 чел. ★ 4.9 Done
  На этом слайде мы сформулируем задачи контроллера и выделим его в отдельный класс.
Отчёт отправил: 18783. Andrew Выполнено за 4 час. 48 мин. [Показать отчёт]
Научился: Перенес создание объектов в метод Main() Создал класс Controller Добавил поле для хранения Game и конструктор для его инициализации Создал метод Run() и перенес в него содержимое метода Start() Вызвал контроллер из метода Main() и проверил работу игры Разобрался в различии вариантов MVC шаблона. В нашем случае контроллер изменяет только модель, сообщая ей о событиях, а модель напрямую запускает методы, которые изменяют представление.  
Сложности: Делать постоянное движение объекта в выбранном направлении 
6 Цветной телевизор 00:03:50
1 тест
38 чел. ★ 4.9 Done
  На этом слайде мы создадим ещё одно представление и задействуем его в программе.
Отчёт отправил: 18783. Andrew Выполнено за 16 мин. [Показать отчёт]
Научился: Создал класс ViewColor и добавил в него разноцвета. Переименовал класс View в ViewBasic Изменил программу для использования представления ViewColor 
Сложности: Более правильно создавать представления, чтобы их было проще переключать 
7 Видный интерфейс 00:04:45
2 теста
37 чел. ★ 4.9 Done
  На этом слайде мы создадим интерфейс IView и задействуем его в классе Game.
Класс Game теперь не зависит от конкретной реализации его представления.
Попробуйте сделать то же самое через абстрактный класс.
Отчёт отправил: 18783. Andrew Выполнено за 34 мин. [Показать отчёт]
Научился: Создал интерфейс IView с заголовками двух методов, унаследовал ViewBasic и ViewColor от IView. Внутри класса Game использовал IView, попереключал представления. 
Сложности: Создавать ещё одно представление, сделать всё то же самое через абстрактный класс 
8 Игра в библиотеке 00:05:01
37 чел. ★ 4.9 Done
  На этом слайде мы выделим логику игру в отдельную библиотеку.
Отчёт отправил: 18783. Andrew Выполнено за 28 мин. [Показать отчёт]
Научился: Создал новый проект-библиотеку - LibraryGame, перенес в него класс Game и интерфейс IView. Откомпилировал библиотеку и нашел DLL файл. Добавил в консольный проект ссылку на библиотеку. Добавил директиву using LibraryGame в нужных классах. Проверил работу игры. 
Сложности: Не сразу заработало из-за разных версий .NET Framework, пересобрал. 
9 2. Рефакторинг. Перечисление субъектов 00:05:24
31 чел. ★ 4.9 Done
  Приступаем к рефакторингу.
На этом слайде мы составим список "главных героев", которые могут быть отображены на экране.
Отчёт отправил: 18783. Andrew Выполнено за 10 мин. [Показать отчёт]
Научился: Создал enum Subject, приписал символы к каждому значению. 
Сложности: Задействовать перечисление в представлениях 
10 Показ героя на экране 00:06:31
28 чел. ★ 5 Done
  На этом слайде мы задействуем перечисление субъектов в интерфейсе представления и во всех его реализациях.
Отчёт отправил: 18783. Andrew Выполнено за 14 мин. [Показать отчёт]
Научился: Изменил описание метода в интерфейсе IView Добавил недостающий метод "переходник" в класс ViewColor Отказался от "переходника" и оставил один метод Show() Внес изменения в класс ViewBasic Проверил работу программы 
Сложности: Всё ОК. 
11 Координатная структура 00:10:25
28 чел. ★ 5 Done
  На этом слайде мы создадим структуру Coord для хранения координат объекта на карте.
Отчёт отправил: 18783. Andrew Выполнено за 34 мин. [Показать отчёт]
Научился: Создал публичную структуру Coord, описал публичные поля х, у и добавил конструктор. Изменил сигнатуру метода Show в интерфейсе IView. В классе Game изменил два поля х, у на один userCoord. Внес остальные изменения в класс Game для использования Coord. Изменил реализацию метода Show в представлениях ViewColor, ViewBasic 
Сложности: Всё хорошо 
12 Карта сокровищ 00:06:43
28 чел. ★ 5 Done
  На этом слайде мы создадим класс Level, в котором будет храниться карта уровня.
Благодаря этому классы мы сможем узнать, что в какой клетке поля находится.
Отчёт отправил: 18783. Andrew Выполнено за 32 мин. [Показать отчёт]
Научился: Создал публичный класс Level, описал поле размера огорода size, описал двумерный массив map. Создал констурктор, добавил методы GetSubject() и SetSubject() с очевидной реализацией 
Сложности: Переделать методы GetSubject() и SetSubject()  
13 Шаги по карте 00:05:31
1 тест
28 чел. ★ 5 Done
  На этом слайде мы задействуем класс Level в классе логики Game
Отчёт отправил: 18783. Andrew Выполнено за 16 мин. [Показать отчёт]
Научился: Описал поле Level в классе Game и получил его в конструкторе. Добавил в метод Game.Move() информирование о действиях в класс Level. В методе Controller.Run() определил size и level, передал их в Game. В методе Game.Start() сохранил полученный level. Убедился, что программа компилируется, запускается и работает. 
Сложности: Всё ОК 
14 Генерация лабиринта 00:07:29
1 тест
28 чел. ★ 5 Done
  На этом слайде мы сгенерируем лабиринт и отобразим его на экране.
Отчёт отправил: 18783. Andrew Выполнено за 3 час. 22 мин. [Показать отчёт]
Научился: Создал метод Level.Init() и вызвал его из конструктора. Написал два вложенных цикла и сгенерировал стенки по краям уровня. В методе Game.Start() разместил отображение всего уровня. Убедился, что программа компилируется и запускается. 
Сложности: Всё ок. 
15 Координатный перебор 00:06:51
1 тест
28 чел. ★ 5 Done
  На этом слайде мы создадим в структуре Coord метод для перебора всех координат, ограниченных указанным размером
Отчёт отправил: 18783. Andrew Выполнено за 14 мин. [Показать отчёт]
Научился: Создал метод YieldCoords() в структуре Coord Сделал в нём перебор всех координат до указанной позиции Задействовал этот метод для генерации стен лабиринта в методе Game.Start() Убедился, чтро программа компилируется, запускается и корректно работает 
Сложности: Всё нормально 
16 Подходящий размер! 00:04:50
28 чел. ★ 5 Done
  На этом слайде мы добавим проверки размеров нашего уровня.
Для этого мы добавим в структуру Coord ещё один метод Coord.InSize().
Отчёт отправил: 18783. Andrew Выполнено за 2 час. 35 мин. [Показать отчёт]
Научился: Добавил метод Coord.InSize(Coord size) Добавил проверки на корректные координаты в методах GetSubject() / SetSubject() Добавил проверку на возможность перемещения в метод Game.Move() Убедился, что программа компилируется, запускается и корректно работает 
Сложности: Всё ок. 
17 Правила игры 00:10:18
1 тест
27 чел. ★ 5 Done
  На этом слайде мы добавим проверку правил игры, чтобы главный герой не мог забираться на стенки.
Отчёт отправил: 18783. Andrew Выполнено за 22 мин. [Показать отчёт]
Научился: Добавил проверки в метод Game.Move(), спрятал курсор, чтобы не мешался. Убрал отображение символов при вызове ReadKey() 
Сложности: Всё ОК 
18 Дорога из жёлтого кирпича 00:01:42
1 тест
27 чел. ★ 5 Done
  На этом слайде мы разукрасим уровень - установим разные цвета для разных субъектов
Отчёт отправил: 18783. Andrew Выполнено за 1 час. 2 мин. [Показать отчёт]
Научился: Установил цвет, в зависимости от выводимого субъекта. 
Сложности: Отличный урок 
19 Ищи ветра в поле 00:06:36
1 тест
26 чел. ★ 5 Done
  На этом слайде мы напишем метод, который найдёт месторасположение субъекта на карте.
Воспользуемся этим методом для инициализации первоначальных координат игрока.
Отчёт отправил: 18783. Andrew Выполнено за 13 мин. [Показать отчёт]
Научился: Создал метод Level.FindFirst() для поиска субъекта. Задал в структуре Coord статическое поле для несуществующей координаты. Вызвал FindFirst() из метода Game.Start() для определения начальных координат героя. 
Сложности: Ok. 
20 Координатный рефакторинг 00:10:17
1 тест
26 чел. ★ 5 Done
  На этом слайде мы добавим в структуру Coord операторы == и !=,
а также добавим метод проверки нахождения координат на краю поля.
Отчёт отправил: 18783. Andrew Выполнено за 31 мин. [Показать отчёт]
Научился: Разкомментировал проверку координат, добавил два оператора в структуру Coord. Убрал размещение игрока и проверил, что выпадает исключение. Добавил метод OnSide() в структуру Coord, использовал её при создании стен лабиринта. Добавил метод Equals() и GetHashCode() и завернул их в регион Equality. 
Сложности: Думать о тестировании и о тестах 
21 Собери монетки 00:17:17
1 тест
26 чел. ★ 5 Done
  На этом слайде мы добавим в игру монетки,
научимся их собирать и при этом добавлять новые.
Отчёт отправил: 18783. Andrew Выполнено за 21 час. 27 мин. [Показать отчёт]
Научился: Добавил первую монетку, выбрал цвет для отображения монеток. Добавил обработку монетки в методе Game.Move(). Создал метод GetRandom() в структуре Coord. Создал метод Level.FindRandom() поиска случайного субъекта на поле. Поиграл в игру и собрал 10 монеток. Извлёк два метода MoveUser() и EatMoney(). 
Сложности: Делать подсчёт и отображение очков 
22 3. Тестирование. Тестовый прогон 00:10:10
26 чел. ★ 5 Done
  Мы приступаем к очередному этапу созданию программы - написание unit-тестов.
На этом слайде мы создадим класс тестирования для структуры Coord.
Отчёт отправил: 18783. Andrew Выполнено за 1 час. 45 мин. [Показать отчёт]
Научился: Создал новый проект LibraryGameTest. Переименовал класс тестирования в CoordTests. Создал метод CoordTest(). Сделал тестирование создания координаты. Выполнил процесс отладки кода теста. 
Сложности: Создавать тесты для других методов. 
23 Тест обратной стороны Луны 00:08:20
26 чел. ★ 5 Done
  На этом слайде мы напишем тесты для методов InSize() и OnSide().
Отчёт отправил: 18783. Andrew Выполнено за 11 час. 54 мин. [Показать отчёт]
Научился: Создал методы InSizeTest(), OnSideTest(). Исправил ошибку в методе Coord.OnSide(). 
Сложности: Всё ОК. 
24 Случайное тестирование 00:06:55
25 чел. ★ 5 Done
  На этом слайде мы напишем тест для методов Coord.YieldCoords() и Coord.GetRandom()
Отчёт отправил: 18783. Andrew Выполнено за 21 мин. [Показать отчёт]
Научился: Создал метод YieldCoordsTest(), написал цикл для проверки, определил массив координат для их сравнения в цикле. Написал метод GetRandomTest(), увеличил время работы этого метода. 
Сложности: Всё ОК. 
25 Лабиринты тестирования 00:09:41
1 тест
25 чел. ★ 5 Done
  На этом слайде мы создадим тест для класса Level
Отчёт отправил: 18783. Andrew Выполнено за 32 мин. [Показать отчёт]
Научился: Создал новый класс для тестирования через генератор тестов. Нарисовал в комментариях лабиринтик Написал проверки в методе LevelTest() 
Сложности: Всё ОК 
26 Поиск монеток на поле Дураков 00:08:51
25 чел. ★ 5 Done
  На этом слайде мы закончим создание тестов для класса Level
Отчёт отправил: 18783. Andrew Выполнено за 26 мин. [Показать отчёт]
Научился: Исправил namespace для теста в классе CoordTest. Создал методы тестирования FindFirstTest(), FindRandomTest() и SetSubjectTest(). 
Сложности: Всё ОК 
27 Внутренний мир Субъекта 00:03:26
24 чел. ★ 5 Done
  На этом слайде мы изменим модификатор доступа для метода Level.SetSubject()
Отчёт отправил: 18783. Andrew Выполнено за 9 мин. [Показать отчёт]
Научился: Изменил модификатор доступа Level.SetSubject() на internal. Убрал тест SetSubjectTest(). 
Сложности: Всё ОК. 
28 Прогулка за ручку 00:12:10
22 чел. ★ 5 Done
  На этом слайде мы протестируем самый главнный класс Game в нашей библиотеке.
Отчёт отправил: 18783. Andrew Выполнено за 52 мин. [Показать отчёт]
Научился: Поиграл в лабиринте размера 5 на 3. Создал класс GameTests и метод StartTest, создал фиктивное представление Выполнил несколько возможных и невозможных шагов с проверками. 
Сложности: Тесты надо создавать не во время разработки, а до нее) Только на практике это не очень реально 
  Итого:   28 видеоуроков 3 час. 23 мин.
18 тестов
22 чел. ★ 4.98  
  Финалисты:   Trira,   Александр,   Слава,   Дмитрий Че,   Иван Воронин,   Andrew,   Дмитрий,   DimanDOS,   Chip,   Tekashnik,   Александр,   vip,   Алексей В.,   Максим Лапшинов,   Александр Балбашов,   Никита,   Yefim,   Max,   Николай Денисов,   Дмитрий,   MaxB,   Alina .

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





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

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

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

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


Научился: Мухи отдельно, котлеты отдельно. Все параметры по умолчанию передаются в методы по значению, то есть, проще говоря, копируются. При передаче по значению метод получает не саму переменную, а ее копию. При передаче параметра по ссылке метод получает адрес переменной в памяти.



Научился: Устанавливать англоязычный интерфейс для VStudio и создавать пустое решение из windowsForms)
Трудности: У меня при выборе проекта нет такого варианта как BlankSolution)) Уж чего я только ни сделал, чтобы его найти - и английский интерфейс докачал и еще какое-то средство разработки VS, но увы. В итоге создал проект windowsForms и удалил его содержимое. Получилось так же и все работает - "кто бы мог подумать"))