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