-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPolymorphismTask.txt
More file actions
92 lines (75 loc) · 6.77 KB
/
PolymorphismTask.txt
File metadata and controls
92 lines (75 loc) · 6.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
Прототип системы квестов (Quests) для RPG:
Контекст задачи
Геймдизайнер принес описание: в игре будут разные типы заданий.
Система должна быть гибкой, чтобы в будущем можно было легко добавлять новые типы квестов.
Нужно реализовать логику проверки выполнения условий.
Техническое задание (ТЗ)
1. Базовый класс Quest
Создай абстрактный класс Quest.
В нем должны быть:
- Поля (поля, не свойства, для простоты):
- public string QuestName (название квеста).
- public bool IsCompleted (выполнен ли квест?).
- public int RewardGold (награда).
- Методы:
- public abstract void CheckProgress() — абстрактный метод.
В нем будет логика проверки, выполнил ли игрок условия.
Если условия выполнены, устанавливаем IsCompleted = true и пишем в консоль:
"Квест '{QuestName}' выполнен! Получено {RewardGold} золота!".
2. Классы-наследники (Типы квестов)
Создай несколько типов квестов, которые наследуются от Quest.
- KillQuest (Задание на убийство)
- Добавь поля: string targetEnemyType (например, "Гоблин") и int requiredKills, int currentKills.
- Конструктор: принимает название, награду, тип врага и требуемое количество убийств.
currentKills начинается с 0.
- Метод public void EnemyKilled(string enemyType) — этот метод будет вызываться игровой системой,
когда игрок убивает врага. Если enemyType совпадает с targetEnemyType и квест еще не выполнен,
увеличивай currentKills на 1 и выводи в консоль прогресс (например: *"Убито гоблинов: 1/10"*).
- Переопределение CheckProgress(): здесь нужно проверить, достиг ли currentKills значения requiredKills.
Если да — вызываем базовую логику завершения (вывод о награде).
- CollectQuest (Задание на сбор предметов)
- Добавь поля: string itemName, int requiredItems, int currentItems.
- Конструктор: аналогично, принимает название, награду, предмет и количество.
- Метод public void ItemCollected(string itemName).
Если название предмета совпадает и квест не выполнен — currentItems++, вывод прогресса.
- Переопределение CheckProgress(): проверка currentItems >= requiredItems.
- ExplorationQuest (Задание на исследование локации)
- Добавь поля: string targetLocation.
- Конструктор: принимает название, награду и название локации.
- Метод public void LocationReached(string locationName).
Если локация совпадает с целевой и квест не выполнен, устанавливай bool locationVisited на true.
- Переопределение CheckProgress(): если локация посещена — квест выполнен.
3. Класс QuestJournal (Журнал квестов)
Этот класс будет управлять нашими квестами.
- Поле: public List<Quest> Quests (вот тут и пригодится полиморфизм!).
- Метод public void AddQuest(Quest quest) — добавить квест в журнал.
- Метод public void UpdateAllQuests() — этот метод должен вызываться для проверки состояния всех активных квестов.
Внутри него нужно пробежаться по списку Quests и для каждого квеста вызвать метод CheckProgress().
4. Класс GameSimulator
Это простая консольная программа, которая симулирует игровые события.
Алгоритм работы Main:
1. Создай объект QuestJournal.
2. Создай несколько квестов:
- KillQuest "Охота на гоблинов" (награда 100, враг "Гоблин", нужно 3 убийства).
- CollectQuest "Сбор ресурсов" (награда 50, предмет "Трава", нужно 2 шт).
- ExplorationQuest "Разведка" (награда 75, локация "Темный лес").
3. Добавь все квесты в журнал через AddQuest().
4. Создай бесконечный цикл (while (true)), который будет имитировать действия игрока.
5. В цикле выводи меню:
1. Убить врага
2. Найти предмет
3. Посетить локацию
4. Выйти из игры
6. В зависимости от выбора пользователя (используй Console.ReadLine() и switch), "генерируй" событие:
- Если выбран пункт 1 — спроси, какой враг убит (введи "Гоблин" или "Волк")
и вызови у соответствующих квестов метод EnemyKilled().
- Важно: Как найти нужный квест в списке Quests?
Нужно пробежаться по списку журнала, проверить,
является ли текущий квест типом KillQuest (используй is или as),
и если да — вызвать его метод EnemyKilled().
- Пункт 2 — аналогично для предметов (вызов ItemCollected).
- Пункт 3 — аналогично для локаций (вызов LocationReached).
7. После каждого действия игрока вызывай journal.UpdateAllQuests(),
чтобы проверить, не завершились ли квесты (и выдать награду).
Бонус-усложнение:
Задача: Добавить квест "Убить 3 гоблинов И собрать 5 трав"