8.56M
Category: programmingprogramming

Основы алгоритмизации и программирование. Индивидуальный проект

1.

Основы алгоритмизации и программирование
КЭИ УлГТУ 1 курс
Власенко Олег Федосович
SimbirSoft
Индивидуальный проект
Создание (простой) игры
ИП1. Выбор варианта игры. Отрисовка всех объектов.
ИП2. Перенос всего в функции. Режимы и Экраны.
ИП3. Управление героями.
ИП4. Делаем персонажей много. Сохранение/загрузка
состояния.

2.

Что такое «Индивидуальный проект» и зачем он вам?
Чтобы стать ИТ специалистом, необходимо не только изучить основы основ, но
и получить опыт работы на достаточно больших проектах.
Поэтому в рамках курса «Основ программирования» кроме простых
лабораторных работ (и усложненных задач к этим лабораторным работам) есть
еще Сквозной проект, в котором в течение семестра каждый студент может
получить опыт длительной разработки достаточно объемного проекта.
Сквозной проект выполняется СТРОГО ПО ЭТАПАМ.
В рамках Индивидуального проекта каждый студент будет делать свой
собственный (уникальный!!!) вариант ИГРЫ.

3.

Какой вариант игры уже сделан для демонстрации?
Название игры: «Жизнь ёжика»
Объекты (Персонажи и предметы): Ёжик, грибы (его еда), яблоки (его
лекарства), лиса (его враг), нож (его оружие)
Сценарий основной: Ёжик должен собрать все яблоки на уровне – тогда он
победил.
Сценарии другие: Есть лиса - враг ёжика. Если он встретился с ней больше раз,
чем следовало – игра проиграна. После встреч с лисой ёжик может
подлечиться, если будет есть яблоки. Если ёжик обзаведется ножом, то при
встрече с лисой не поздоровиться уже лисе.
Управление: Ёжик передвигается при нажатии клавиш – влево/вправо,
вверх/вниз. Лиса перемещается автоматически – случайно.

4.

Какой вариант игры должен выбрать и реализовать
студент?
Вам предстоит в самом начале выбрать идею для своей игры.
Эта идея должна быть
А) отличной от идей всех ваших одногруппников
Б) Всё, что будет сделано в игре, вы либо уже знаете как сделать на момент начала
работы над игрой, либо вы изучите всё необходимое в рамках курса «Основы
программирования»
В) Всю игру вы должны сделать в достаточной степени самостоятельно. Допустимо
консультироваться или заимствовать код, но
1) любая строчка кода вами понята и может быть легко (и быстро) объяснена
2) более 50% строк кода написано вами индивидуально без какой-либо
помощи и заимствований.
Если вы придумываете свой собственный вариант, то вы обязаны его согласовать с
вашим преподавателем по лаб работам. Если он его одобрит – лишь после этого вы
можете приступать к реализации.
В случае наличия списка с вариантами, вы можете выбрать вариант из предоставленного
списка игр. В этом случае гарантируется, что вы в состоянии будет реализовать эту игру в
рамках этого семестра, и что все нужные для проекта знания включены в темы лекций и
лаб работ.

5.

Какие требования к Индивидуальному проекту?
1) Проект выполняется на Си в среде Microsoft Visual Studio
2) Проект выполняется персонально. Кода, написанного лично, должно быть
не менее 50%
3) Каждая строка позаимствованного кода (в том числе и сгенерированного
VS, созданного в кооперации с консультантами, найденного в интернете и
т.п.) должна быть понятна сдающему. (Понятность проверяется как
опросом, так и заданием что-то в этом коде изменить)
4) Сквозной проект выполняется четко по этапам. Можно - с опережением
этапов. В случае если идет отставание от сроков сдачи этапа – то это
штрафуется снятыми баллами (Итоговая оценка за Индивидуальный проект
понижается!)

6.

Варианты игры
Подход 1. Изучите реализованную игру «Жизнь ёжика». Подумайте, какие герои
могут быть в вашей версии игры? Какой сценарий будет у вас? Например,
можно сделать игру (по аналогии с «Жизнью ёжика») где «Девочка» собирает
«Цветы», чтобы сплести «Венок». Объект «Крапива» представляет для нее
определенную угрозу. А если она догонит «Бабочку», то получает бонус.
После того как придумаете игру, опишите все объекты и сценарии в виде текста.
И согласуйте вариант вашей игры с преподавателем, ведущим лаб работы.
Подход 2. Выберите готовый вариант из списка
(СПИСОК В РАЗРАБОТКЕ. В настоящий момент он недоступен для выбора
вариантов!)

7.

Вопрос – а когда заниматься Индивидуальным
проектом? И когда показывать этапы преподавателю?
Когда им заниматься?
Индивидуальный проект – обязательная часть программы.
Он выполняется в рамках вашей самостоятельной работы по дисциплине.
Когда сдавать?
Периодически (ориентировочно 1 раз в 3 недели) будет специальное занятие, на
котором вы обязаны продемонстрировать ваши наработки преподавателю,
ведущему лаб работы.
Если у вас наработки будут раньше – можете продемонстрировать их раньше – на
очередных практических занятиях.
А если будут вопросы?
Вопросы можно задавать как на лекциях, так и на практических занятиях.

8.

9.

Индивидуальный проект – этап 1
(ИП1)
Выбор варианта игры.
Отрисовка всех объектов.
(Статическая картинка).
Презентация итогов этапа 1 преподавателю.

10.

Задачи ЭТАПА 1
Задача 1. Выбор темы игры
Задача 2. Утверждение темы игры
Задача 3. Рисуем все персонажи и предметы в виде картинки (в компьютере
или на бумаге)
Задача 4. Создать приложение, содержащее все объекты из игры
Задача 5. Презентация (демонстрация с объяснениями) преподавателю
получившегося приложения на занятии

11.

Задача 1. Выбор темы игры
Вам необходимо выбрать или придумать тему для игры и оформить ее в виде
текста. В описание вашего варианта рекомендуется придерживаться следующей
структуры (Образец описания игры ниже):
Название игры: «Жизнь ёжика»
Объекты (Персонажи и предметы): Ёжик, грибы (его еда), яблоки (его лекарства),
лиса (его враг), нож (его оружие)
Сценарий основной: Ёжик должен собрать все яблоки на этом уровне – тогда он
переходит на следующий. Если он прошел все уровни – он победил.
Сценарии другие: Есть лиса - враг ёжика. Если он встретился с ней больше раз,
чем следовало – игра проиграна. После встреч с лисой ёжик может подлечиться,
если будет есть яблоки. Если ёжик обзаведется ножом, то при встрече с лисой
не поздоровиться уже лисе.
Управление: Ёжик передвигается при нажатии клавиш – влево/вправо,
вверх/вниз. Лиса перемещается автоматически – в сторону к ежику или
случайно.

12.

Задача 2. Утверждение темы игры
После выбора темы вам необходимо утвердить её у вашего преподавателя,
ведущего лабораторные работы.
До утверждения темы не рекомендуется начинать кодирование.
Сразу после утверждения вы можете выполнять Задачу 3 и далее.

13.

Задача 3. Рисуем все персонажи и предметы в виде
картинки (в компьютере или на бумаге)

14.

Задача 4. Создать приложение, содержащее все
объекты из игры

15.

Шаг 1. Создаем проект

16.

Шаг 2. Запускаем приложение

17.

Шаг 3. Ищем WndProc

18.

Шаг 4. Ищем “case WM_PAINT:”

19.

Основной шаг: Добавляем код, рисующий все
объекты! (1)

20.

Основной шаг: Добавляем код, рисующий все
объекты! (2)

21.

Получившееся приложение со всеми объектами игры

22.

Задача 5. Презентация преподавателю получившегося
приложения на занятии
Вам необходимо показывать ваши наработки по игре преподавателю после
выполнения КАЖДОГО ЭТАПА проекта!

23.

ИТОГО по этапу 1
1.
2.
3.
4.
5.
Вы выбрали вариант игры и согласовали его с преподавателем
Описали игру – объекты и сценарии
Создали картинку (на бумаге или в компьютере) с объектами
Создали программу отрисовывающую все объекты
Продемонстрировали программу и картинку преподавателю
У вас есть всё, чтобы идти дальше и реализовать сценарии игры!

24.

25.

Индивидуальный проект – этап 2
(ИП2)
Объекты игры распределяются по отдельным
функциям.
Создание несколько экранов игры – Экран Старта,
Экран Победы, Экран Проигрыша, Финальный экран.
Презентация итогов этапа 2 преподавателю.

26.

Задачи ЭТАПА 2
Задача 1. Для каждого объекта создать свою собственную функцию
Задача 2. Отрисовка «игровой» ситуации при помощи функций из Задачи 1.
Задача 3. Отрисовка Экрана Старта.
Задача 4. Отрисовка Экрана Победы.
Задача 5. Отрисовка Экрана Проигрыша.
Задача 6. Отрисовка Экрана Финиша.
Задача 7. Организация переключения различных экранов.
Задача 8. Презентация преподавателю получившегося приложения на занятии

27.

Задача 1. Для каждого объекта создать свою
собственную функцию
Для каждого объекта нужно создать функцию вида
void DrawMushroom(HDC hdc, int cx, int cy) {
...
}
void DrawKnife(HDC hdc, int cx, int cy) ...
void DrawApple(HDC hdc, int cx, int cy) ...
void DrawHedgehog(HDC hdc, int cx, int cy) ...
void DrawFox(HDC hdc, int cx, int cy) ...
в которые нужно перенести весь код отрисовки соответствующих объектов.
Сделать тестовую отрисовку 3 объектов каждого типа

28.

Задача 1. Суть решения (1)
// Гриб
// Шляпка гриба
HPEN hPenMushroom1 = CreatePen(PS_SOLID, 3, RGB(136, 0, 21));
SelectObject(hdc, hPenMushroom1);
Chord(hdc, 155, 20, 185, 50, 185, 35, 155, 35);
DeleteObject(hPenMushroom1);
// Ножка гриба
HPEN hPenMushroom2 = CreatePen(PS_SOLID, 3, RGB(127, 127, 127));
SelectObject(hdc, hPenMushroom2);
Rectangle(hdc, 165, 35, 175, 50);
DeleteObject(hPenMushroom2);

29.

Задача 1. Суть решения (2)

30.

Задача 1. Суть решения (3)
void DrawMushroom(HDC hdc, int cx, int cy) {
//const int dx = -170, dy = -35
// Гриб
// Шляпка гриба
HPEN hPenMushroom1 = CreatePen(PS_SOLID, 3, RGB(136, 0, 21));
SelectObject(hdc, hPenMushroom1);
Chord(hdc, 155 - 170 + cx , 20 - 35 + cy, 185 - 170 + cx, 50 - 35 + cy,
185 - 170 + cx, 35 - 35 + cy, 155 - 170 + cx, 35 - 35 + cy);
DeleteObject(hPenMushroom1);
// Ножка гриба
HPEN hPenMushroom2 = CreatePen(PS_SOLID, 3, RGB(127, 127, 127));
SelectObject(hdc, hPenMushroom2);
Rectangle(hdc, 165 - 170 + cx, 35 - 35 + cy, 175 - 170 + cx, 50 - 35 + cy);
DeleteObject(hPenMushroom2);
}

31.

Задача 1. Суть решения (4)
void DrawMushroom(HDC hdc, int cx, int cy) {
// dx = -170, dy = -35
// Гриб
// Шляпка гриба
HPEN hPenMushroom1 = CreatePen(PS_SOLID, 3, RGB(136, 0, 21));
SelectObject(hdc, hPenMushroom1);
Chord(hdc, 155 - 170 + cx , 20 - 35 + cy, 185 - 170 + cx, 50 - 35 + cy,
185 - 170 + cx, 35 - 35 + cy, 155 - 170 + cx, 35 - 35 + cy);
DeleteObject(hPenMushroom1);
// Ножка гриба
HPEN hPenMushroom2 = CreatePen(PS_SOLID, 3, RGB(127, 127, 127));
SelectObject(hdc, hPenMushroom2);
Rectangle(hdc, 165 - 170 + cx, 35 - 35 + cy, 175 - 170 + cx, 50 - 35 + cy);
DeleteObject(hPenMushroom2);
}

32.

Задача 1. Суть решения (5)
void DrawMushroom(HDC hdc, int cx, int cy) {
// dx = -170, dy = -35
// Гриб
// Шляпка гриба
HPEN hPenMushroom1 = CreatePen(PS_SOLID, 3, RGB(136, 0, 21));
SelectObject(hdc, hPenMushroom1);
Chord(hdc, 155 - 170 + cx , 20 - 35 + cy, 185 - 170 + cx, 50 - 35 + cy,
185 - 170 + cx, 35 - 35 + cy, 155 - 170 + cx, 35 - 35 + cy);
DeleteObject(hPenMushroom1);
// Ножка гриба
HPEN hPenMushroom2 = CreatePen(PS_SOLID, 3, RGB(127, 127, 127));
SelectObject(hdc, hPenMushroom2);
Rectangle(hdc, 165 - 170 + cx, 35 - 35 + cy, 175 - 170 + cx, 50 - 35 + cy);
DeleteObject(hPenMushroom2);
}

33.

Задача 1. Суть решения (6)
void DrawMushroom(HDC hdc, int cx, int cy) {
// dx = -170, dy = -35
// Гриб
// Шляпка гриба
HPEN hPenMushroom1 = CreatePen(PS_SOLID, 3, RGB(136, 0, 21));
SelectObject(hdc, hPenMushroom1);
Chord(hdc, 155 - 170 + cx , 20 - 35 + cy, 185 - 170 + cx, 50 - 35 + cy,
185 - 170 + cx, 35 - 35 + cy, 155 - 170 + cx, 35 - 35 + cy);
DeleteObject(hPenMushroom1);
// Ножка гриба
HPEN hPenMushroom2 = CreatePen(PS_SOLID, 3, RGB(127, 127, 127));
SelectObject(hdc, hPenMushroom2);
Rectangle(hdc, 165 - 170 + cx, 35 - 35 + cy, 175 - 170 + cx, 50 - 35 + cy);
DeleteObject(hPenMushroom2);
}

34.

Задача 1. Суть решения (7)
void DrawMushroom(HDC hdc, int cx, int cy) {
// dx = -170, dy = -35
// Гриб
// Шляпка гриба
HPEN hPenMushroom1 = CreatePen(PS_SOLID, 3, RGB(136, 0, 21));
SelectObject(hdc, hPenMushroom1);
Chord(hdc, 155 - 170 + cx , 20 - 35 + cy, 185 - 170 + cx, 50 - 35 + cy,
185 - 170 + cx, 35 - 35 + cy, 155 - 170 + cx, 35 - 35 + cy);
DeleteObject(hPenMushroom1);
// Ножка гриба
HPEN hPenMushroom2 = CreatePen(PS_SOLID, 3, RGB(127, 127, 127));
SelectObject(hdc, hPenMushroom2);
Rectangle(hdc, 165 - 170 + cx, 35 - 35 + cy, 175 - 170 + cx, 50 - 35 + cy);
DeleteObject(hPenMushroom2);
}

35.

Задача 1. Реализация в игре «Жизнь ёжика» (1)

36.

Задача 1. Реализация в игре «Жизнь ёжика» (2)

37.

Задача 1. Реализация в игре «Жизнь ёжика» (3)

38.

Задача 1. Реализация в игре «Жизнь ёжика» (4)

39.

Задача 1. Реализация в игре «Жизнь ёжика» (5)

40.

Задача 1. Реализация в игре «Жизнь ёжика» (6)

41.

Задача 1. Работающее приложение

42.

Задача 2. Отрисовка «игровой» ситуации
Отрисовка «игровой» ситуации при помощи функций из Задачи 1.

43.

Задача 2. Отрисовка «игровой» ситуации
Отрисовка «игровой» ситуации при помощи функций из Задачи 1.
void DrawMode0(HDC hdc) {
// Герои рисуются по тем же позициям
// как в ИП1 были нарисованы изначально
DrawMushroom(hdc, 170, 35);
DrawKnife(hdc, 140, 85);
DrawApple(hdc, 170, 128);
DrawHedgehog(hdc, 56, 35);
DrawFox(hdc, 60, 125);
}

44.

Задача 3. Отрисовка Экрана Старта
Нужно создать рисунок из всех героев игры. Используя несколько последовательных
циклов для отрисовки каждого из героев.

45.

Задача 3. Отрисовка Экрана Старта. Пример реализации

46.

Задача 3. Отрисовка Экрана Старта. Пример реализации

47.

Задача 3. Отрисовка Экрана Старта. Пример реализации

48.

Задача 3. Отрисовка Экрана Старта. Пример реализации

49.

Задача 3. Отрисовка Экрана Старта. Пример реализации

50.

Задача 4. Отрисовка Экрана Победы
Нужно создать рисунок из множества изображений Главного героя.
Нужно использовать несколько циклов, в том числе вложенных.

51.

Задача 4. Отрисовка Экрана Победы. Пример реализации

52.

Задача 4. Отрисовка Экрана Победы. Пример реализации

53.

Задача 5. Отрисовка Экрана Поражения
Нужно создать рисунок из множества изображений Главного врага.
Нужно использовать несколько циклов, в том числе вложенных.

54.

Задача 5. Отрисовка Экрана Поражения. Пример
реализации

55.

Задача 5. Отрисовка Экрана Поражения. Пример
реализации

56.

Задача 6. Отрисовка Экрана Финала
Нужно создать рисунок из множества изображений всех героев.
Для каждого героя нужно использовать несколько циклов, в том числе вложенных.
Нужно вывести текст с ФИО, названием группы автора игры.

57.

Задача 6. Отрисовка Экрана Финала . Пример реализации

58.

Задача 6. Отрисовка Экрана Финала . Пример реализации

59.

Задача 6. Отрисовка Экрана Финала . Пример реализации

60.

Задача 6. Отрисовка Экрана Финала . Пример реализации

61.

Задача 7. Переключение экранов
Организация переключения различных экранов.

62.

Задача 7. Переключение экранов. Реализация
// Глобальная переменная, хранящая номер режима
int mode = 0;

63.

Задача 7. Переключение экранов. Реализация
// Глобальная переменная, хранящая номер режима
int mode = 0;

64.

Задача 8. Презентация преподавателю получившегося
приложения на занятии
Вам необходимо показывать ваши наработки по игре преподавателю после
выполнения КАЖДОГО ЭТАПА проекта!

65.

ИТОГО по этапу 2
1. Вы создали для отрисовки каждого героя отдельную функцию.
2. При помощи этих функций вы нарисовали несколько экранов –
экраны старта, победы, поражения и финала.
3. Вы добавили в программу возможность переключения при
помощи клавиатуры экранов.
4. Продемонстрировали получившуюся программу
преподавателю
У вас есть всё, чтобы идти дальше!

66.

67.

68.

69.

Индивидуальный проект – этап 3
(ИП3)
Управление героями.
Реализация всех проверок пересечений объектов.
Реализация всех сценариев с одним объектом каждого
типа.
Презентация итогов этапа 3 преподавателю.

70.

Задачи ЭТАПА 3
Задача 0. Уточнить сценарий, в части управления героем и алгоритмов
взаимодействия героев и объектов друг с другом
Задача 1. Для каждого объекта создать DEBUG версию отрисовки
Задача 2. Реализовать управление Героем и переключение режимов
Задача 3. Реализовать подбор Героем Целевого объекта и реализовать
окончания игры в связи с выигрышем
Задача 4. Реализовать автоматическое перемещение Врага
Задача 5. Реализовать проверку съедания Врагом Героя и проверку окончания
игры в связи с проигрышем
Задача 6. Реализовать взятие Героем Оружия
Задача 7. Реализовать бросок оружия Героем
Задача 8. Реализовать проверку попадания Оружия во Врага
Задача 9. Реализовать взятие Героем Лекарства
Задача 10. Реализовать вывод статуса Игры
Задача 11. Демонстрация наработок вашему преподавателю

71.

Задача 0. Уточнить сценарий, в части управления героем и
алгоритмов взаимодействия героев и объектов друг с другом
Варианты управления Героем:
Возможны разные варианты реализации управления Героем – можно управлять его движением пошагово –
для каждого следующего шага нажимая соответствующую клавишу. Можно через нажатие клавиш задавать
направление, и герой будет двигаться автоматически (по таймеру) в заданную сторону до тех пор, пока
направление не будет изменено на другое (через нажатие заданной клавиши).
Варианты использования и поведения Оружия:
Возможно различные варианты поведения Оружия. Например, можно брать Оружие с собой и Герой с
Оружием становится неуязвим. Можно метать Оружие в какую-то сторону. Можно задавать направление куда
нужно метнуть оружие. Можно использовать «Самонаводящееся Оружие» которое будет само выбирать
направление движения в сторону к ближайшему врагу.
Варианты поведения Врага:
Возможно различные варианты поведения Врага.
Враг может быть «туповатым» и перемещаться хаотично (каждый шаг – случайность, или зигзагом, или как-то
еще). Враг может быть «агрессивным» и всегда двигаться в сторону к Герою. Враг может быть умным и
перемещаться к Герою только тогда, когда тот не вооружен, а если Герой вооружен – то «удирать» от Героя.
Варианты взаимодействия Объектов игры друг с другом:
Варианты могут быть разными. Может быть (как в примерах ниже) у всех объектов одна и та же зона захвата.
Может быть у каждого Активного объект своя собственная зона захвата. Например, у Героя зона захвата с
Оружием может быть значительно больше, чем зона захвата когда он не вооружен.
Дополнительные возможности:
В игре можно предусмотреть не только Героя, Врага, Оружие, Лекарство и Цель (как в примерах ниже), но и
Абсолютную защиту (например, Щит, который действует 30 секунд после активации), Плохую еду (которая в
отличии от Врага исчезает после того, как Герой ее съедает, но при этом Герой теряет единицу здоровья), и др.

72.

Задача 1. Для каждого объекта создать DEBUG версию
отрисовки
// Если макрос DEBUG_GAME определен, то будет показана зона
захвата каждого героя
#define DEBUG_GAME
// Если макрос DEBUG_GAME определен, то будет показана зона
захвата каждого героя
//#define DEBUG_GAME

73.

Задача 1. Для каждого объекта создать DEBUG версию
отрисовки
void DrawApple(HDC hdc, int cx, int cy) {
// dx = -170, dy = -128
// Яблоко
// Само яблоко
HPEN hPenApple1 = CreatePen(PS_SOLID, 3, RGB(237, 28, 36));
SelectObject(hdc, hPenApple1);
Ellipse(hdc, 155 - 170 + cx, 115 - 128 + cy, 185 - 170 + cx, 140 - 128 + cy);
DeleteObject(hPenApple1);
// Хвостик яблока
HPEN hPenApple2 = CreatePen(PS_SOLID, 3, RGB(185, 122, 87));
SelectObject(hdc, hPenApple2);
MoveToEx(hdc, 173 - 170 + cx, 120 - 128 + cy, NULL);
LineTo(hdc, 178 - 170 + cx, 111 - 128 + cy);
DeleteObject(hPenApple2);
#ifdef DEBUG_GAME
// Зона захвата
HPEN hPenZone = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
SelectObject(hdc, hPenZone);
SelectObject(hdc, GetStockObject(NULL_BRUSH));
Rectangle(hdc, cx - 20, cy - 20, cx + 20, cy + 20);
MoveToEx(hdc, cx - 40, cy, NULL);
LineTo(hdc, cx + 40, cy);
MoveToEx(hdc, cx, cy - 40, NULL);
LineTo(hdc, cx, cy + 40);
DeleteObject(hPenZone);
#endif
}

74.

Задача 1. Для каждого объекта создать DEBUG версию
отрисовки
void DrawApple(HDC hdc, int cx, int cy) {
// dx = -170, dy = -128
// Яблоко
// Само яблоко
HPEN hPenApple1 = CreatePen(PS_SOLID, 3, RGB(237, 28, 36));
SelectObject(hdc, hPenApple1);
Ellipse(hdc, 155 - 170 + cx, 115 - 128 + cy, 185 - 170 + cx, 140 - 128 + cy);
DeleteObject(hPenApple1);
// Хвостик яблока
HPEN hPenApple2 = CreatePen(PS_SOLID, 3, RGB(185, 122, 87));
SelectObject(hdc, hPenApple2);
MoveToEx(hdc, 173 - 170 + cx, 120 - 128 + cy, NULL);
LineTo(hdc, 178 - 170 + cx, 111 - 128 + cy);
DeleteObject(hPenApple2);
#ifdef DEBUG_GAME
// Зона захвата
HPEN hPenZone = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
SelectObject(hdc, hPenZone);
SelectObject(hdc, GetStockObject(NULL_BRUSH));
Rectangle(hdc, cx - 20, cy - 20, cx + 20, cy + 20);
MoveToEx(hdc, cx - 40, cy, NULL);
LineTo(hdc, cx + 40, cy);
MoveToEx(hdc, cx, cy - 40, NULL);
LineTo(hdc, cx, cy + 40);
DeleteObject(hPenZone);
#endif
}

75.

76.

Задача 2. Реализовать управление Героем и
переключение режимов

77.

Задача 2. Реализовать управление Героем и
переключение режимов

78.

Задача 2. Реализовать управление Героем и
переключение режимов

79.

Задача 2. Реализовать управление Героем и
переключение режимов

80.

Задача 2. Реализовать управление Героем и
переключение режимов

81.

Задача 2. Реализовать управление Героем и
переключение режимов

82.

83.

Задача 3. Реализовать подбор Героем Целевого объекта и
реализовать окончания игры в связи с выигрышем

84.

Задача 3. Реализовать подбор Героем Целевого объекта и
реализовать окончания игры в связи с выигрышем

85.

Задача 3. Реализовать подбор Героем Целевого объекта и
реализовать окончания игры в связи с выигрышем

86.

Задача 3. Реализовать подбор Героем Целевого объекта и
реализовать окончания игры в связи с выигрышем

87.

Задача 3. Реализовать подбор Героем Целевого объекта и
реализовать окончания игры в связи с выигрышем

88.

89.

Задача 4. Реализовать автоматическое перемещение
Врага

90.

Задача 4. Реализовать автоматическое перемещение
Врага

91.

Задача 4. Реализовать автоматическое перемещение
Врага

92.

Задача 4. Реализовать автоматическое перемещение
Врага

93.

94.

Задача 5. Реализовать проверку съедания Врагом Героя
и проверку окончания игры в связи с проигрышем

95.

Задача 5. Реализовать проверку съедания Врагом Героя
и проверку окончания игры в связи с проигрышем

96.

Задача 5. Реализовать проверку съедания Врагом Героя
и проверку окончания игры в связи с проигрышем

97.

98.

Задача 6. Реализовать взятие Героем Оружия

99.

Задача 6. Реализовать взятие Героем Оружия

100.

Задача 6. Реализовать взятие Героем Оружия

101.

Задача 6. Реализовать взятие Героем Оружия

102.

103.

Задача 7. Реализовать бросок оружия Героем

104.

Задача 7. Реализовать бросок оружия Героем

105.

Задача 7. Реализовать бросок оружия Героем

106.

Задача 7. Реализовать бросок оружия Героем

107.

Задача 7. Реализовать бросок оружия Героем

108.

109.

Задача 8. Реализовать проверку попадания Оружия во
Врага

110.

Задача 8. Реализовать проверку попадания Оружия во
Врага

111.

Задача 8. Реализовать проверку попадания Оружия во
Врага

112.

113.

Задача 9. Реализовать взятие Героем Лекарства

114.

Задача 9. Реализовать взятие Героем Лекарства

115.

Задача 9. Реализовать взятие Героем Лекарства

116.

Задача 9. Реализовать взятие Героем Лекарства

117.

118.

Задача 10. Реализовать вывод статуса Игры

119.

Задача 10. Реализовать вывод статуса Игры
// Отображаем статус игры
void DrawStatus(HDC hdc) {
HFONT hFont = CreateFont(16, 0, 0, 0, 0, 0, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, L"Courier New");
SelectObject(hdc, hFont);
SetTextColor(hdc, RGB(0, 0, 128));
char str[180];
sprintf_s(str, "HedgehogHelth = %d, HedgehogHasKnife = %s",
Hedgehog.Helth,
Hedgehog.HasKnife ? "YES" : "NO");
TCHAR strT[180];
OemToCharBuff(str, strT, 180);
TextOut(hdc, 0, 0, (LPCWSTR)strT, _tcslen(strT));
DeleteObject(hFont);
}

120.

121.

Задача 11. Демонстрация наработок вашему
преподавателю
Вам необходимо показывать ваши наработки по игре преподавателю после
выполнения КАЖДОГО ЭТАПА проекта!

122.

ИТОГО по этапу 3
1. Каждый герой отображается в DEBUG режиме – видна его
«зона поражения»
2. Каждый герой движется так, как вы задумали в вашем
сценарии – кто-то управляется клавиатурой, кто-то двигается
автоматически, кто-то неподвижно ждет своей участи
3. При пересечении героев происходит то, что вы задумали в
вашем сценарии – кто-то кого-то поедает
4. Игра заканчивается согласно вашему сценарию
5. Вы продемонстрировали получившуюся программу вашему
преподавателю
У вас есть всё, чтобы идти дальше!

123.

124.

125.

126.

Индивидуальный проект – этап 4
(ИП4)
Делаем персонажей много.
Сохранение/загрузка состояния.
Презентация итогов этапа 4 преподавателю.

127.

Задачи ЭТАПА 4
Задача 1. Сделать много яблок.
Задача 2. Сделать много ножей.
Задача 3. Сделать много лис.
Задача 4. Сделать много грибов.
Задача 5. Реализовать сохранение состояния.
Задача 6. Реализовать загрузку (восстановление) состояния.
Задача 7. Сделать экран поражения динамическим.
Задача 8. Сделать экран победы динамическим.
Задача 9. Демонстрация наработок вашему преподавателю
Задача A1. Доделки после замечаний преподавателя
Задача A2. Подготовка к презентации для комиссии
Задача A3. Презентация для комиссии

128.

129.

Задача 1. Сделать много яблок.
// Объект игры - гриб, яблоко, нож, и т.п.
typedef struct GameObject {
// координаты
int X;
int Y;
// виден ли объект?
int Visible;
} GAMEOBJECT;
//// Яблоко
//GAMEOBJECT Apple = { 170, 128, 1 };
// Яблоки
// количество яблок
#define NUM_APPLES 3
// Яблоки
GAMEOBJECT Apples[NUM_APPLES] = {
{ 170, 128, 1 },
{ 270, 128, 1 },
{ 270, 228, 1 }
};

130.

Задача 1. Сделать много яблок.
void DrawGame(HDC hdc) {
...
//if (Apple.Visible) {
//
DrawApple(hdc, Apple.X, Apple.Y);
//}
// Просматриваем все яблоки по очереди
for (int i = 0; i < NUM_APPLES; i++) {
if (Apples[i].Visible) {
DrawApple(hdc, Apples[i].X, Apples[i].Y);
}
}
...

131.

Задача 1. Сделать много яблок.
void TryToEatApple() {
// Просматриваем все яблоки по очереди
for (int i = 0; i < NUM_APPLES; i++) {
// если яблоко видно
if (Apples[i].Visible) {
// если ежик может съесть яблоко
if (Hedgehog.X - 20 < Apples[i].X
&& Hedgehog.X + 20 > Apples[i].X
&& Hedgehog.Y - 20 < Apples[i].Y
&& Hedgehog.Y + 20 > Apples[i].Y) {
// яблоко делаем невидимым - его съели!!!
Apples[i].Visible = 0;
// поправляем здоровье ежика
Hedgehog.Helth += 5;
}
}
}
}

132.

133.

Задача 2. Сделать много ножей.

134.

Задача 2. Сделать много ножей.

135.

Задача 2. Сделать много ножей.

136.

137.

Задача 3. Сделать много лис.

138.

Задача 3. Сделать много лис.

139.

Задача 3. Сделать много лис.

140.

Задача 3. Сделать много лис.

141.

Задача 3. Сделать много лис.

142.

Задача 3. Сделать много лис.

143.

Задача 3. Сделать много лис.

144.

Задача 3. Сделать много лис.

145.

146.

Задача 4. Сделать много грибов.

147.

Задача 4. Сделать много грибов.

148.

Задача 4. Сделать много грибов.

149.

Задача 4. Сделать много грибов.

150.

Задача 4. Сделать много грибов.

151.

Задача 4. Сделать много грибов.

152.

153.

Задача 5. Реализовать сохранение состояния.

154.

Задача 5. Реализовать сохранение состояния.

155.

Задача 5. Реализовать сохранение состояния.

156.

Задача 5. Реализовать сохранение состояния.

157.

Задача 5. Реализовать сохранение состояния.

158.

159.

Задача 6. Реализовать загрузку (восстановление) состояния

160.

Задача 6. Реализовать загрузку (восстановление) состояния

161.

Задача 6. Реализовать загрузку (восстановление) состояния

162.

Задача 6. Реализовать загрузку (восстановление) состояния

163.

164.

Задача 7. Сделать экран поражения динамическим

165.

Задача 7. Сделать экран поражения динамическим

166.

Задача 7. Сделать экран поражения динамическим

167.

168.

Задача 8. Сделать экран победы динамически

169.

Задача 8. Сделать экран победы динамически

170.

Задача 8. Сделать экран победы динамически

171.

172.

Задача 9. Демонстрация наработок вашему
преподавателю
Вам необходимо показывать ваши наработки по игре преподавателю после
выполнения КАЖДОГО ЭТАПА проекта!

173.

ИТОГО по этапу 4
1.
2.
3.
4.
Всех героев стало много (от 0 до N).
Есть возможность сохранить и восстановить состояние игры.
Экраны победы и поражения стали динамическими
Вы продемонстрировали получившуюся программу вашему
преподавателю
Теперь осталось финализироваться –
А1. исправить явные проблемы,
А2. подготовиться к презентации и
А3. сделать презентацию для комиссии.

174.

175.

Источники информации
• Лекции по курсу «Основы
программирования»
• Лабораторные работы по курсу «Основы
программирования»
English     Русский Rules