
Курс по теории объектно-ориентированного программирования (ООП).
С нуля создаётся проект по рисованию различных геометрических фигур, которые потом объединяются в спрайты, взаимодействуют друг с другом. Во время создания проекта постоянно применяется рефакторинг кода, При этом демонстрируются приёмы объектно-ориентированного программирования.
Во второй части курса мы проработаем понятие Интерфейса.
* Суть курса достаточно полно описана в отчёте Ларисы, который был составлен ею по завершению данного курса. Выдержку из данного отчета можно увидеть в прикреплённом файле.
Самостоятельное задание:
Написать своими словами, что такое «Инкапсуляция».
Прикрепить любую картинку на тему Инкапсуляции.
Создать проект и настроить форму.
Обязательно прикрепить иконку.
На этом уроке мы нарисуем домик из двух линий и прямоугольника.
Самостоятельное задание:
Разместить на форму визуальный компонент PictureBox.
Создать Bitmap, Graphics, Pen.
Нарисовать две линии.
Нарисовать прямоугольник.
На этом уроке мы создадим первый класс - Line, и перепишем программу, чтобы она работала точно так же.
Самостоятельное задание:
Создать класс Line в новом файле Line.cs.
Описать поля и создать конструктор.
В основном классе создать функцию Init.
Оформить используемые переменные полями основного класса.
Переписать программу, чтобы она работала с классом Line.
На этом уроке мы создадим второй вспомогательный класс - Box, а также порассуждаем на тему "наследования" и переделаем программу.
Самостоятельное задание:
Создать класс Box в файле Box.cs
Добавить поля width и height.
Переделать программу с использованием класса Box.
Подготовить скриншот с раскрытым деревом классов.
Создадим класс для описания окружности - Circle. Нарисуем окружность в центре домика.
Самостоятельное задание:
Добавить класс Circle в файле Circle.cs.
Добавить поля width и height.
Нарисовать окружность в центре домика.
Убрать неиспользуемые строки using.
Приложить скриншот созданной программы на фоне дерева классов.
Создадим структуру для задания координат пикселя и перепишем классы и программу с её использованием.
Почитать об отличии класса от структуры можно дополнительно по ссылке (см. ниже)
Самостоятельное задание:
Создать структуру Pixel.
Описать и определить точки домика A, B, C, D, E, O.
Создать дополнительный конструктор в каждом классе.
Переписать создание экземпляров через наши пиксели.
Приложить скриншот запущенной программы и дерева классов.
На этом дополнительном уроке наглядно демонстрируются главные отличия между struct и class в языке C#.
Самостоятельное задание:
Набросать маленькую программку с "одинаковыми" структурой и классом.
Добавить две функции, которые меняют значения переданных параметров.
Убедиться в том, что структура и класс обрабатываются по-разному.
Приложить скриншот в режиме отладки.
На этом уроке мы продолжим внедрение структуры Pixel в наши классы. Будем её использовать для хранения координат внутри класса, а также избавимся от повторяемого кода внутри конструкторов.
Самостоятельное задание:
В классе каждой фигуры для хранения координат использовать структуру Pixel.
Убрать повторяемый код из конструкторов, используя вызов через : this ().
Изменить функции Draw для рисования фигур так, чтобы они работали.
Как вычислить расстояние между двумя пикселями? Есть специальная формула, которую можно разместить в структуру Pixel. Теперь мы сможем создать ещё один конструктор окружности по центру и любой точке на окружности.
Самостоятельное задание:
Добавить в структуру Pixel метод distance.
Создать ещё один конструктор для Circle.
Выводить в программе две разные окружности.
Возьмём цветные карандаши, чтобы раскрасить наш домик. Создаём новые классы для цветных линий, окружностей и прямоугольников.
Самостоятельное задание:
Создать класс ColorLine, ColorCircle, ColorBox.
Добавить в каждый новый класс поле для цветного карандаша Pen.
В основную программу добавить экземпляры цветных линий, круга и боксика.
На этом уроке мы создадим ... Снеговика (спрайт) — более сложную фигуру, которая состоит из других фигур. В дальнейшем мы будем работать с такими спрайтами, перемещать их, поворачивать, масштабировать, а пока ... мы просто нарисуем Снеговика.
Самостоятельное задание:
Нарисовать снеговика на листе в клеточку или в Paint.
Проставить все точки и выписать их координаты.
Создать экземпляры всех базовых фигур.
Приложить скриншот Снеговика!
На этом уроке мы создадим второй спрайт — ещё одного снеговика, но разноцветного.
Вопрос для перехода к следующему уроку:
Что нужно изменить в этой программе, чтобы мы могли:
а) перемещать снеговика;
б) поворачивать снеговика;
в) изменять размер снеговика.
Самостоятельное задание:
Нарисовать разноцветного снеговика рядом с первым.
Написать в отчёте ответы на три вопроса.
* Сделать перемещение и/или масштабирование.
Наконец-таки мы возьмёмся за наследование. Убираем повторяющийся код из цветных классов. Осмысливаем значение термина «наследование».
Самостоятельное задание:
Использовать наследование в разноцветных классах.
Убрать повторяющийся код и вызывать родительский конструктор.
Написать определение «наследования» своими словами.
Очень хочется все элементы снеговика поместить в один массив. Сейчас это сделать нельзя — придётся делать три массива: для кругов, для линий и для боксиков...
Решение гениальное — создаём базовый класс фигуры Shape, создаём массив фигур, и все фигуры помещаем в этот массив! После размещения фигур в массив можно видеть, что каждая фигура в нём хранится не как фигура, а под своим типом. А все под одной крышей они могут находится потому, что все они — фигуры, так как унаследованы от Shape.
Самостоятельное задание:
Создать пустой базовый класс Shape.
Все фигуры унаследовать от класса Shape.
Поместить все части снеговика в один массив.
Сократить функцию Draw() для рисования снеговиков.
Ответить в отчёте на вопрос — как реализовать функцию Draw (Shape shape).
На этом уроке мы реализуем метод Draw (Shape shape) через серию условных операторов, а также создадим функцию для рисования целевого спрайта (снеговика) — Draw (Shape [ ] shapes).
Результат работы программы не изменяется, а вот содержимое кода всё более и более облагораживается.
Самостоятельное задание:
Реализовать функцию Draw (Shape shape).
Реализовать функцию Draw (Shape [ ] shapes).
Для чего нам понадобится переменная Shape.position?
На этом уроке мы начнём переносить функции для рисования фигур из основной программы в классы.
Самостоятельное задание:
Добавить в класс Circle метод Draw().
Добавить в класс Circle поля graph и pen.
Создать инициализаторы этих полей SetGraphics() и SetPen().
Убрать из основной программы метод Draw (Circle circle).
Изменить метод Draw(Shape shape) для вызова Circle.Draw().
На этом уроке мы напишем функции для рисования фигур во всех остальных классах.
Самостоятельное задание:
Перенести поля Graph и Pen из класса Circle в базовый класс Shape.
Перенести методы SetGraphics() и SetPen() из класса Circle в базовый класс Shape.
Переделать вызов этих методов — вызывать в цикле для всех фигур каждого снеговика.
Перенести методы Draw() из основной программы в классы Line и Box.
Убрать метод SetPen, добавив инициализацию карандаша в соотв. конструкторы.
На этом уроке мы создадим в базовом классе функцию Draw(), и при её вызове через механизм полиморфизма будет запускаться созвучный метод нужного класса.
Самостоятельное задание:
Создать метод Draw() в базовом классе Shape.
Используя слово override подключить механизм полиморфизма.
Убрать из основной программы метод Draw (Shape shape), заменив его очевидным вызовом.
Выполнить алгоритм рисования снеговиков пошагово и порадоваться силе полиморфизма.
На этом уроке мы создадим новый класс — Sprite, в котором будет хранится список всех фигур, из которых строится графический объект, для того чтобы в основной программе мы могли оперировать сразу спрайтами, а не их составными элементами.
Самостоятельное задание:
Создать класс Sprite.
Описать список фигур через коллекцию List<Shape>.
Создать методы AddShape () и Clear ().
Создать перегруженный метод Draw ().
В основной программе описать снеговиков типом Sprite и переделать инициализацию.
Укоротить функцию Draw() основной программы и удалить оттуда всё лишнее.
На этом уроке мы начнём реализовывать идею перемещения спрайтов.
Начнём, как обычно, с простого. Научимся перемещать один кружок.
Самостоятельное задание:
Создать метод Move() в базовом классе.
Нарисовать кружок в отдельной функции основной программы.
Добавить кнопку для перемещения кружка.
Изменить метод Circle.Draw(), чтобы кружок перемещался.
Уяснить отличие координат кружка от координаты position.
Убедиться, что кружок перемещается при нажатии на кнопочку.
На этом уроке мы переделаем метод Draw() для остальных фигур — Line и Box(). Наша программа теперь по нажатию кнопочки будет перемещать сразу три фигурки.
Самостоятельное задание:
Нарисовать в Paint фигуру из трёх фигур - линия + круг + боксик.
Нарисовать такую же фигуру в функции Demo ().
Переписать методы Line.Draw() и Box.Draw().
Сделать, чтобы фигурка перемещалась по нажатию кнопочки.
На этом уроке мы научим перемещаться целых снеговиков. Для этого нам не нужно будет менять метод Draw(), мы воспользуемся полиморфизмом!
Самостоятельное задание:
Создать перегруженный метод Sprite.Move ().
Вернуть отображение снеговиков.
Избавиться от переменной delta при инициализации snowman2.
Сделать перемещение снеговиков по нажатию кнопочки.
На этом уроке я объясню своими словами, что такое интерфейс. Мы поговорим об игре "Голя" или "Сифа" или "Вода", о том, кто в неё может играть, и что делать тем, кто не знает правила игры. В конце урока мы создадим наш интерфейс.
Правила игры:
Выбирается ведущий.
Его цель - догнать и дотронуться до кого-либо из участников.
Цель остальных - не допустить этого.
Когда ведущий дотронется до кого-либо (заголит), ведущим становится новый участник.
Самостоятельное задание:
Создать файл с интерфейсом Игрок.cs
Написать своими словами определение Интерфейса.
На этом уроке мы поговорим о правилах игры в догоняшки. На прошлом уроке мы выясняли, что должны уметь делать игроки. На этом уроке мы начнём писать класс, в котором опишем конкретные правила нашей игры.
Самостоятельное задание:
Создать класс GameCatch.
Описать поля gamers и leader.
Создать конструктор.
Создать публичные методы AddGamer(Игрок), Step() и RunAll().
Написать словесный алгоритм метода FindNewLeader().
Написать словесный алгоритм метода SetNewLeader().
Приложить скриншот созданного класса.
На этом уроке мы допишем класс GameCatch. Напишем реализацию методов FindNewLeader() и SetNewLeader().
Ваша задача - подумать и написать, что нужно ещё сделать, чтобы можно было начать играть в эту игру.
Самостоятельное задание:
Написать метод FindNewLeader().
Написать метод SetNewLeader().
Что ещё нужно сделать, чтобы начать играть в игру?
На этом уроке мы создадим объект для нашей игры - Кружок! У кружочка есть координаты центра, радиус и цвет.
Цель урока - создать класс Circle.cs
Самостоятельное задание:
Создать класс Circle.cs .
Описать три поля - center, radius, color.
Создать конструктор Circle (x, y, r).
Написать в комментариях, что и как нужно сделать дальше.
На этом уроке мы начнём создавать класс Arena, который создаст поле для игры и реализует методы для отображения объектов на экране.
Самостоятельное задание:
Создать класс Arena.cs .
Описать статичные поля Range и random.
Описать приватные поля picture и graphics.
Создать конструктор.
Создать метод Clear ().
Написать своими словами, зачем нужен класс Arena.
На этом уроке мы допишем класс Arena, реализуем методы Show(Circle), Refresh(), static NewCircle(). Всё готово к созданию кода для отображения кружка из класса Form1.cs!
Самостоятельное задание:
Создать метод Show(Circle).
Создать метод Refresh().
Создать метод static new Circle().
Попробовать самостоятельно это всё запустить.
К отчёту приложить скриншот проекта с раскрытыми классами.
На этом уроке мы настроим нашу форму, напишем несколько волшебных строчек, и ... программа заработает!!! У нас будет много-много кружков на экране -))
Самостоятельное задание:
Настроить форму: Text, BorderStyle, StartPosition, MaximizeBox.
Приделать иконку к форме и к исполняемому файлу.
Разместить визуальный компонент PictureBox на форму.
Установить для него Dock и BackColor.
Разместить кнопку и сгенерировать событие для неё.
Написать код для создания кружков.
Протестировать работу программы и порадоваться :)
Приложить скриншот результата.
На этом уроке мы унаследуем кружок от интерфейса Игрок. Теперь для запуска программы нам придётся реализовать методы из его интерфейса. В этом уроке мы реализуем методы Голя() и НеГоля().
Самостоятельное задание:
Наследовать Circle от Игрок.
Выписать заголовки всех новых методов.
Реализовать методы Голя() и НеГоля() через color.
Приложить скриншот этих методов.
Описать словами содержимое методов Беги() и Поймал().
На этом уроке мы допишем методы Игрока в классе Circle. Реализуем метод Беги() и Поймал(), и даже исправим недочёты в описании интерфейса (!!). В конце урока я ответил на многочисленные вопросы участников.
Самостоятельное задание:
Реализовать метод Беги().
Реализовать метод Поймал().
Разобраться в новых функциях Cross() и Distance().
Написать словами, что нужно для запуска игры.
На этом уроке мы добавим в форму класс GameCatch, разместим таймер и наконец-таки запустим нашу игру. Шарики начнут гоняться друг за другом!
Самостоятельное задание:
Добавить в форму класс game.
Изменить метод buttonAddGamer_Click ().
Разместить на форму таймер и создать его метод.
Реализовать метод timer_Tick ().
Не забыть включить таймер.
Доработать Arena.NewCircle() для задания начального направления.
Исправить ошибку в Arena.FindNewLeader().
Написать словами, как исправить недочет с переголением.
На этом уроке мы добавим в правила игры задержку после получения Голи. Ведущий будет считать до 10 и только потом сможет голить других.
Твоя задача - придумать новую игру, в которую смогут играть Игроки, то есть объекты, которые умеют делать то, что описано в интерфейсе Игрок.
Самостоятельное задание:
Добавить поле leaderSkipSteps и константу MaxSkipTests.
Добавить задержку после получения сифы, SetNewLeader().
Добавить ограничение на заголивание, FindNewLeader().
Протестировать игру по новым правилам.
Придумать свои правила новой игры и описать её в комментариях.
Приложить красивый скриншот шариков.
На этом уроке мы начнём делать новую игру - Вирус. Смысл игры подробно рассказан на видео.
Цель урока: создать класс GameVirus и реализовать методы GameViurs(), AddGamer(), Step(), RunAll().
Также нужно придумать и написать словами алгоритм методов SetNewVirus(Игрок) и FindNewVirus().
Самостоятельное задание:
Понять правила новой игры.
Создать класс GameVirus.cs
Добавить поля List<Игрок> gamers и virused.
Реализовать конструктор GameViurs().
Реализовать методы AddGamer(), Step(), RunAll().
Описать словами работу метода SetNewVirus(Игрок).
Описать словами работу метода FindNewVirus().
На этом уроке мы допишем последние две функции и надолго залипнем в экран, наблюдая за новой игрой для наших кружков, как вирусная эстафета может быстро передаваться, особенно, когда игроков очень много. В комментариях написать свой отзыв об этой серии уроков.
Следующие уроки не обязательны для выполнения.
Какой курс ты будешь проходить следующим?
Самостоятельное задание:
Реализовать метод SetNewVirus(Игрок).
Реализовать метод FindNewVirus().
Запустить новую игру, сменив в FormGame - GameCatch на GameVirus.
Попробовать обездвижить заражённых игроков.
Написать в комментариях отзыв об этой серии уроков.
Какой курс ты будешь проходить следующим?
На этом уроке мы создадим новый класс Box. Квадратики тоже хотят играть в эту игру, и просят их научить. Пока они ещё не умеют ловить, но уже смогут отображаться и передвигаться.
Полезные ссылки для написания функции Поймал:
http://xdan.ru/how-to-check-intersect-two-rectangles.html
http://stackoverflow.com/questions/306316/determine-if-two-rectangles-overlap-each-other
Самостоятельное задание:
Создать класс Box.
Создать нужные поля и конструктор.
Расширить класс до Box : Игрок.
Создать все необходимые поля и методы.
Попробовать реализовать метод Поймал().
На этом уроке мы допишем метод Box.Поймал() и запустим игру с квадратиками. Потом попробуем подружить квадратики с кружками, увидим, что это не так просто, да собственно и не нужно. Но возможно.
Самостоятельное задание:
Дописать метод Box.Поймал()
Сделать метод Arena.Show (Box box).
Сделать добавление в игру и кружков и квадратиков.
Сделать метод Arena.Show (Игрок obj).
На этом уроке мы создадим "универсальный" класс Crosser, который сможет проверять на возможное столкновение "любых" двух Игроков. Конечно не любых, а только двух наших Box и Circle. Это яркий пример способа добавления класса, который лучше не применять (по возможности) в программах. Потому что такой способ не добавляет универсальности, так как при объявлении новых объектов придётся дописывать кучу новых функций на сравнение.
Самостоятельное задание:
Создать класс Crosser.
Изменить классы Box и Circle на использование Crosser.
Записать видеообзор своего проекта и рассказать, что такое Interface.
На этом курсе мы с нуля создаём программу рисованию геометрических фигур, которые потом объединяются в спрайты, взаимодействуют друг с другом.
Мы постоянно применяем рефакторинг кода, демонстрируем приёмы Объектно-ориентированного программирования. Вы сможете на собственном примере увидеть обоснованность и необходимость использования Инкапсуляции, Наследования и Полиморфизма.
Во второй части курса мы проработаем понятие Интерфейса на примере создания простой анимационной игры. Использование интерфейса позволит нам легко создавать новые правила игры не изменяя визуальной части.
Объектно-ориентированное программирование — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определённого класса, а классы образуют иерархию наследования.
Идеологически ООП — подход к программированию как к моделированию информационных объектов, решающий на новом уровне основную задачу структурного программирования: структурирование информации с точки зрения управляемости, что существенно улучшает управляемость самим процессом моделирования, что, в свою очередь, особенно важно при реализации крупных проектов.
В этом курсе мы познакомимся с теорией Объектно ориентированного программирования на практических примерах.
Мы постоянно применяем рефакторинг кода, демонстрируем приёмы Объектно-ориентированного программирования. Вы сможете на собственном примере увидеть обоснованность и необходимость использования Инкапсуляции, Наследования и Полиморфизма.
Во второй части курса мы проработаем понятие Интерфейса на примере создания простой анимационной игры. Использование интерфейса позволит нам легко создавать новые правила игры не изменяя визуальной части.
Продолжительность каждого урока 10 минут.