Си шарп с нуля

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

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

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

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

После взноса  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
  Дорога длиной в тысячу миль начинается с первого шага.

На этом уроке мы поговорим о предстоящем путешествии и сделаем наш первый шаг - создадим консольное приложение.
Отчёт отправил: 11019. Trira Выполнено за 25 мин. [Показать отчёт]
Научился: Создано пустое решение, в котором создано консольное приложение с приветствием. Очень своевременный и полезный для прокачки навыков программирования на C# курс.  Хочу с помощью этого курса создать сетевую игру Го 
Сложности: на этом этапе все просто.  
2 Марионетка 00:06:01
43 чел. ★ 5 Done
  На этом слайде мы сделаем управление символом с клавиатуры.
Отчёт отправил: 11019. Trira Выполнено за 11 час. 4 мин. [Показать отчёт]
Научился: Научилась: 1. Создавать и определять координаты объекта.   2. Вывести символ в указанных координатах.   3. Считать с клавиатуры нажатую клавишу.   4. Изменить координату в зависимости от направления.   5. Организовать бесконечный цикл.   6. Выполнить затирание символа при перемещении.   7. Закончить игру по нажатию клавиши Escape. 
Сложности: Если следовать указаниям лектора - то все предельно ясно. 
3 Представление выделяется 00:04:02
2 теста
43 чел. ★ 5 Done
  Show must go on!
На этом слайде мы вынесем команды для работы с экранам в отдельный класс View.
Отчёт отправил: 11019. Trira Выполнено за 8 час. 41 мин. [Показать отчёт]
Научился: Научилась: 1. Извлекать методы из кода программы 2. Создавать новый класс и переносить туда эти методы. 3. Сделать эти методы публичными и не-статичными. 4. Вносить соответствующие изменения в новые методы, вызывая их как методы нового класса. Кроме сделанных изменений, в метод Show можно добавить еще одну переменную, определяющую инструмент, действующий на точку (например, вместо курсора - касание пальцем к сенсорному экрану) 
Сложности: все предельно просто 
4 Модель игры 00:06:57
40 чел. ★ 5 Done
  На этом слайде мы выделим логику, модель в отдельный класс Game.
Отчёт отправил: 11019. Trira Выполнено за 1 час. 1 мин. [Показать отчёт]
Научился: Научилась: 1. Выделять модель логики игры из программы   -- Создан класс Game, добавлено поле view , которое затем было установлено через конструктор.   -- Добавлены поля для координат и установлено их значения в методе Start().   -- Создан метод Move (int sx, int sy) для перемещения объекта.   -- Изменен код в операторе switch() на использование метода Move(). Работа программы не изменилась. 
Сложности: В начале описания класса Game пропустила описание переменных x,y . VS ругался до тех пор, пока не внесла необходимую строчку в код. 
5 Контроллер не спешит 00:06:43
1 тест
39 чел. ★ 4.9 Done
  На этом слайде мы сформулируем задачи контроллера и выделим его в отдельный класс.
Отчёт отправил: 11019. Trira Выполнено за 3 час. 12 мин. [Показать отчёт]
Научился: Этап создания объектов был перенесен в метод Main(). Создан класс Controller, в котором определены поле для хранения Game и конструктор для его инициализации: метод Run(), содержащий в себе все, что было раньше в методе Start(). Новый Controller вызывается из метода Main(). MVC  («Модель-Представление-Контроллер», «Модель-Вид-Контроллер») — схема разделения данных приложения, пользовательского интерфейса и управляющей логики на три отдельных компонента: модель, представление и контроллер — таким образом, что модификация каждого компонента может осуществляться независимо. В частности, ---  Модель (Model) предоставляет данные и реагирует на команды контроллера, изменяя своё состояние. ---  Представление (View) отвечает за отображение данных модели пользователю, реагируя на изменения модели. ---  Контроллер (Controller) интерпретирует действия пользователя, оповещая модель о необходимости изменений. В случае работы на сервере модель MVC видоизменяется так, что контроллер не только получает команды и отправляет их в модель, но и управляет представлениями модели, поскольку осуществить связь модель-представление в случае работы с сервером можно только через контроллер. 
Сложности: Выполнить задание со звездочкой. Этот пункт не выполнен - пока нет идей, а время поджимает-)) 
6 Цветной телевизор 00:03:50
1 тест
38 чел. ★ 4.9 Done
  На этом слайде мы создадим ещё одно представление и задействуем его в программе.
Отчёт отправил: 11019. Trira Выполнено за 40 мин. [Показать отчёт]
Научился: Научилась создавать новые представления для классов. Переключать представления было бы проще так, как это делается в меню на веб-странице (выпадающий список - реализуется в виде формы специального вида) 
Сложности: Сложности были в именовании поля у представления ViewColor 
7 Видный интерфейс 00:04:45
2 теста
37 чел. ★ 4.9 Done
  На этом слайде мы создадим интерфейс IView и задействуем его в классе Game.
Класс Game теперь не зависит от конкретной реализации его представления.
Попробуйте сделать то же самое через абстрактный класс.
Отчёт отправил: 11019. Trira Выполнено за 1 день 22 час. 32 мин. [Показать отчёт]
Научился: Научилась: создавать интерфейс IView с заголовками двух методов ViewBasic и ViewColor. Наследовать новые методы ViewBasic и ViewColor от IView, использовать IView внутри класса Game. 
Сложности: Создать еще один класс, например, для другого сочетания цветов - просто, но включить его в проект без ошибок оказалось сложнее, чем могло показаться сначала. Пока нет идей, как реализовать несколько видов экранов в интерфейсе. 
8 Игра в библиотеке 00:05:01
37 чел. ★ 4.9 Done
  На этом слайде мы выделим логику игру в отдельную библиотеку.
Отчёт отправил: 11019. Trira Выполнено за 21 час. 10 мин. [Показать отчёт]
Научился: Создана библиотека LibraryGame в проекте OnlineGame, в которую перенесены классы с логикой игры и интерфейсом. Библиотека откомпилирована и связана с проектом. В классах игры добавлена директива using 
Сложности: --- успеть сдать отчет до полуночи 
9 2. Рефакторинг. Перечисление субъектов 00:05:24
31 чел. ★ 4.9 Done
  Приступаем к рефакторингу.
На этом слайде мы составим список "главных героев", которые могут быть отображены на экране.
Отчёт отправил: 11019. Trira Выполнено за 13 мин. [Показать отчёт]
Научился: Выполнен рефакторинг кода - создан enum-класс Subject . Каждому значению класса приписан отдельный элемент. 
Сложности: все просто 
10 Показ героя на экране 00:06:31
28 чел. ★ 5 Done
  На этом слайде мы задействуем перечисление субъектов в интерфейсе представления и во всех его реализациях.
Отчёт отправил: 11019. Trira Выполнено за 30 мин. [Показать отчёт]
Научился: Изменила описание метода в интерфейсе IView. Добавила недостающий метод "переходник" в класс ViewColor, отказалась от "переходника" и оставила один метод Show(). Внесла изменения в класс ViewBasic. Проверила работу программы - все работает 
Сложности: все предельно просто и ясно 
11 Координатная структура 00:10:25
28 чел. ★ 5 Done
  На этом слайде мы создадим структуру Coord для хранения координат объекта на карте.
Отчёт отправил: 11019. Trira Выполнено за 22 час. 0 мин. [Показать отчёт]
Научился: Создала публичную структуру Coord, описала публичные поля х, у и добавила конструктор. Изменила сигнатуру метода Show в интерфейсе IView. В классе Game изменила два поля х, у на один userCoord. Внесла остальные изменения в класс Game для использования Coord. Изменить реализации метода Show в представлениях ViewColor, ViewBasic 
Сложности: Не сразу поняла, как выбирается последовательность действий при рефакторинге метода Move 
12 Карта сокровищ 00:06:43
28 чел. ★ 5 Done
  На этом слайде мы создадим класс Level, в котором будет храниться карта уровня.
Благодаря этому классы мы сможем узнать, что в какой клетке поля находится.
Отчёт отправил: 11019. Trira Выполнено за 6 дней 23 час. 38 мин. [Показать отчёт]
Научился: 1. Создан публичный класс Level   2. Описано поле размера поля size   3. Описан двумерный массив map   4. Создан конструктор public Level(Coord size)   5. Добавлены методы GetSubject() и SetSubject() с очевидной реализацией 
Сложности: ... 
13 Шаги по карте 00:05:31
1 тест
28 чел. ★ 5 Done
  На этом слайде мы задействуем класс Level в классе логики Game
Отчёт отправил: 11019. Trira Выполнено за 1 час. 59 мин. [Показать отчёт]
Научился: Создан объект Level , который затем внедрен в класс Game. В методе Controller.Run() определены size и level, которые передаются в Game. Параметры, указанные во  view.Show( , ) , можно также объединить в отдельный объект (класс), чтобы затем его можно было просто внедрять на каждый новый уровень 
Сложности: после явного задания размера поля начало появляться исключение в игре, при переходе курсора за пределы границы Coord 
14 Генерация лабиринта 00:07:29
1 тест
28 чел. ★ 5 Done
  На этом слайде мы сгенерируем лабиринт и отобразим его на экране.
Отчёт отправил: 11019. Trira Выполнено за 1 день 18 час. 36 мин. [Показать отчёт]
Научился: Создала метод Level.Init() и вызвала его из конструктора. Написала два вложенных цикла и сгенерировала стенки по краям уровня. В методе Game.Start() разместила отображение всего уровня. 
Сложности: ... 
15 Координатный перебор 00:06:51
1 тест
28 чел. ★ 5 Done
  На этом слайде мы создадим в структуре Coord метод для перебора всех координат, ограниченных указанным размером
Отчёт отправил: 11019. Trira Выполнено за 30 мин. [Показать отчёт]
Научился: Создан метод YieldCoords() в структуре Coord, в котором реализован перебор всех координат до указанной позиции. Этот метод задействован для генерации стен лабиринта в методе Game.Start(). 
Сложности: не поняла, почему задание коорд. первого игрока командой  userCoord = new Coord(level.size.x / 2, level.size.y / 2);  - неверно 
16 Подходящий размер! 00:04:50
28 чел. ★ 5 Done
  На этом слайде мы добавим проверки размеров нашего уровня.
Для этого мы добавим в структуру Coord ещё один метод Coord.InSize().
Отчёт отправил: 11019. Trira Выполнено за 6 час. 21 мин. [Показать отчёт]
Научился: Добавлен метод Coord.InSize(Coord size), проверки на корректные координаты в методах GetSubject() / SetSubject(), а также добавлена проверка на возможность перемещения в метод Game.Move(). Программа компилируется, запускается и корректно работает. 
Сложности: все просто 
17 Правила игры 00:10:18
1 тест
27 чел. ★ 5 Done
  На этом слайде мы добавим проверку правил игры, чтобы главный герой не мог забираться на стенки.
Отчёт отправил: 11019. Trira Выполнено за 9 час. 40 мин. [Показать отчёт]
Научился: Добавила проверки в метод Game.Move(). Спрятала курсор (в реализациях).  Убрала отображение символов при вызове ReadKey() 
Сложности: при уменьшении размера окна консоли курсор опять появляется на экране. Почему? 
18 Дорога из жёлтого кирпича 00:01:42
1 тест
27 чел. ★ 5 Done
  На этом слайде мы разукрасим уровень - установим разные цвета для разных субъектов
Отчёт отправил: 11019. Trira Выполнено за 26 мин. [Показать отчёт]
Научился: научилась устанавливать цвета для субъектов 
Сложности: все просто 
19 Ищи ветра в поле 00:06:36
1 тест
26 чел. ★ 5 Done
  На этом слайде мы напишем метод, который найдёт месторасположение субъекта на карте.
Воспользуемся этим методом для инициализации первоначальных координат игрока.
Отчёт отправил: 11019. Trira Выполнено за 26 мин. [Показать отчёт]
Научился: Создаy метод Level.FindFirst() для поиска субъекта. В структуре Coord задано статическое поле для несуществующей координаты. FindFirst() вызван из метода Game.Start() для определения начальных координат Subject.user1 
Сложности: --- 
20 Координатный рефакторинг 00:10:17
1 тест
26 чел. ★ 5 Done
  На этом слайде мы добавим в структуру Coord операторы == и !=,
а также добавим метод проверки нахождения координат на краю поля.
Отчёт отправил: 11019. Trira Выполнено за 2 дня 1 час. 23 мин. [Показать отчёт]
Научился: Добавила в класс Game  проверку координат в метод Start(), добавила два оператора в структуру Coord. Убрала размещение игрока и проверила, что выпадает исключение. Добавила метод OnSide() в структуру Coord. Использовала её при создании стен лабиринта. Добавить метод Equals() и GetHashCode() и завернуть их в регион Equality. Тестирование - один из обязательных этапов разработки ПО 
21 Собери монетки 00:17:17
1 тест
26 чел. ★ 5 Done
  На этом слайде мы добавим в игру монетки,
научимся их собирать и при этом добавлять новые.
Отчёт отправил: 11019. Trira Выполнено за 1 день 23 час. 53 мин. [Показать отчёт]
Научился: Добавлена первая монетка: в классе Level определен размер массива ее координат, в представлении ViewColor монетка раскрашена красным. В Game добавлена обработка монеток в методе Game.move(). Создан метод Level.FindRandom() для поиска случайного субъекта на игровом поле. При запуске игры с данными изменениями монетки исчезают при попадании на них курсора (user1). Выполнено выделение двух методов MoveUser() и EatMoney() из кода Game. На подсчет и отображение очков уже не хватило сил... 
Сложности: видео просмотрено более 2х раз, причем в 4 подхода. Очень сложно сразу уследить за последовательностью изменений в коде. Пришлось конспектировать, чтобы разобраться в этом уроке. 
22 3. Тестирование. Тестовый прогон 00:10:10
26 чел. ★ 5 Done
  Мы приступаем к очередному этапу созданию программы - написание unit-тестов.
На этом слайде мы создадим класс тестирования для структуры Coord.
Отчёт отправил: 11019. Trira Выполнено за 23 час. 30 мин. [Показать отчёт]
Научился: Создан новый проект LibraryGameTest. Переименован класс тестирования в CoordTests. Создан метод CoordTest(). Сделано тестирование создания координаты. 
Сложности: --- 
23 Тест обратной стороны Луны 00:08:20
26 чел. ★ 5 Done
  На этом слайде мы напишем тесты для методов InSize() и OnSide().
Отчёт отправил: 11019. Trira Выполнено за 21 час. 41 мин. [Показать отчёт]
Научился: Созданы тесты методов InSize() и OnSide(). Последние выявили ошибку в методе Coord.OnSide(), которая была устранена 
Сложности: запомнить, как запускать тест; и еще по директивам тестировщика понять, где ошибка. 
24 Случайное тестирование 00:06:55
25 чел. ★ 5 Done
  На этом слайде мы напишем тест для методов Coord.YieldCoords() и Coord.GetRandom()
Отчёт отправил: 11019. Trira Выполнено за 27 мин. [Показать отчёт]
Научился: Создан метод YieldCoordsTest(). Написан цикл для проверки. Определен массив координат для их сравнения в цикле. Написан метод GetRandomTest(). Спровоцировала увеличение времени работы этого метода увеличив количество шагов до 10*12. 
Сложности: теперь все норм. Сама нашла опечатку в тесте и исправила ее 
25 Лабиринты тестирования 00:09:41
1 тест
25 чел. ★ 5 Done
  На этом слайде мы создадим тест для класса Level
Отчёт отправил: 11019. Trira Выполнено за 11 час. 5 мин. [Показать отчёт]
Научился: Создаy новый класс для тестирования через генератор тестов. В комментариях нарисован лабиринтик с тестовым уровнем. Написаны все проверки в методе LevelTest() 
Сложности: все понятно.  
26 Поиск монеток на поле Дураков 00:08:51
25 чел. ★ 5 Done
  На этом слайде мы закончим создание тестов для класса Level
Отчёт отправил: 11019. Trira Выполнено за 11 час. 35 мин. [Показать отчёт]
Научился: Исправлено namespace для теста в классе CoordTest. Создан метод тестирования FindFirstTest().  Создан метод тестирования FindRandomTest(). Создан тест SetSubjectTest(). Все тесты отработали нормально 
Сложности: Пока могу только повторять все за Игромистром. Своих идей нет. 
27 Внутренний мир Субъекта 00:03:26
24 чел. ★ 5 Done
  На этом слайде мы изменим модификатор доступа для метода Level.SetSubject()
Отчёт отправил: 11019. Trira Выполнено за 15 час. 20 мин. [Показать отчёт]
Научился: Изменен модификатор доступа Level.SetSubject() на internal . Убрала тест SetSubjectTest() из проекта 
Сложности: --- 
28 Прогулка за ручку 00:12:10
22 чел. ★ 5 Done
  На этом слайде мы протестируем самый главнный класс Game в нашей библиотеке.
Отчёт отправил: 11019. Trira Выполнено за 1 день 26 мин. [Показать отчёт]
Научился: Поиграла в лабиринте размера 5 на 3. Создан класс GameTests и метод StartTest. Создано фиктивное представление. Выполнено несколько возможных и невозможных шагов с проверками метода Start класса Game. Считается, что тестирование программ - это отдельная подзадача в ходе создания софта. Поэтому данную часть работы можно поручить разработчику, не писавшему исходную программу. Теоретически - это оправдано. Поскольку у автора кода часто "глаз замыливается" , то есть свои очевидные ошибки автору кода трудно заметить. А сторонний прогер, тем более, имеющий опыт в написании тестов, быстрее определит ошибки и баги кода.  Однако по моему убеждению, ошибки лучше находить самому. Это, во-первых, повышает качество написания кода, во-вторых, дает программисту дополнительный вектор развития как профессионалу. Вывод - написание тестов к собственному коду - очень полезное занятие для программиста-)) 
Сложности: было много ошибок при создании теста. Устранение этих ошибок заняло времени больше, чем я планировала. Но поиск и устранение этих ляпов повысили мою собственную самооценку-)) 
  Итого:   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 и удалил его содержимое. Получилось так же и все работает - "кто бы мог подумать"))