-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDictionaryTask.txt
More file actions
75 lines (63 loc) · 6.52 KB
/
DictionaryTask.txt
File metadata and controls
75 lines (63 loc) · 6.52 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
Задача: Инвентарь и экономика для RPG "Карточная Коллекционка"
Контекст:
Ты — джуниор-разработчик в игровой студии.
Тебе поручили реализовать ядро системы инвентаря для новой карточной RPG.
Игрок может находить сундуки, в которых лежат карты, и затем продавать их.
Данные должны храниться эффективно, чтобы по ID карты можно было быстро получить её название и цену.
Этап 1: Фундамент (Подготовка данных)
Прежде чем игрок начнет получать карты, нужно описать, какие карты вообще существуют в игре.
1. Создай перечисление (enum) Rarity (Обычная, Редкая, Эпическая, Легендарная).
2. Создай класс Card.
- У карты должны быть свойства: int Id, string Name, Rarity CardRarity, int BasePrice.
- Цена карты должна рассчитываться в конструкторе на основе редкости
(например, *Обычная = 10, Редкая = 50, Эпическая = 200, Легендарная = 1000*),
либо ты можешь просто передавать её в конструктор, но для тренировки сделай расчет от редкости.
3. Создай класс Player.
- У игрока должны быть: string Name, int Gold (монеты),
и инвентарь (коллекция карт, которые есть у игрока).
Подумай, какая коллекция лучше всего подойдет для хранения карт, которые игрок уже собрал?
(Пока можешь использовать List<Card>).
Этап 2: Главная механика (Словарь)
Главный дизайнер сказал:
"Мы должны хранить ВСЕ возможные карты в игре в одном месте, чтобы быстро к ним обращаться по ID".
1. Создай статический класс GameData (или просто создай объект Dictionary в методе Main).
2. Главная задача: создать и заполнить Dictionary<int, Card> (где ключ — int Id, значение — объект Card).
- Создай 5-10 карт
(например: 1, "Меч новичка", Rarity.Обычная; 2, "Огненный шар", Rarity.Редкая и т.д.)
и добавь их в словарь.
- Карты должны добавляться в словарь через инициализатор или метод .Add().
Этап 3: Игровые события (Генератор и Логика)
Теперь нужно написать код, который будет использовать этот словарь для выдачи награды игроку.
1. Напиши метод OpenLootbox(Player player, Dictionary<int, Card> allCards).
- Метод должен принимать игрока и словарь всех карт.
- Используя Random, выбери случайный ID карты из существующих ключей словаря.
- Получи объект Card из словаря по этому ID.
- Выведи в консоль сообщение: "Вы открыли сундук и нашли карту: [Имя карты] ([Редкость])!"
- Добавь эту карту в инвентарь игрока (player.Inventory).
2. Напиши метод SellCard(Player player, int cardId, Dictionary<int, Card> allCards).
- Игрок хочет продать карту из своего инвентаря по её ID.
- Проверь, есть ли у игрока в инвентаре карта с таким ID (используй Find или Any у List).
- Если карта есть:
- Удали её из инвентаря игрока.
- Увеличь золото игрока на цену карты (свойство BasePrice у карты, которую ты получаешь из словаря allCards).
- Напиши: "Вы продали [Имя карты] за [Цена] монет. Теперь у вас [Gold] монет."
Этап 4: Интерфейс (Цикл и взаимодействие)
Сделай простую консольную программу, которая работает в цикле и позволяет игроку взаимодействовать с системой.
1. В методе Main:
- Создай словарь cardCatalog (по сути, Dictionary<int, Card>) и заполни его картами.
- Создай игрока.
- Запусти бесконечный цикл while (true).
2. В цикле показывай меню:
- 1 - Показать каталог карт (пройдись по словарю cardCatalog и выведи ID, Название и Цену).
- 2 - Открыть сундук (вызов метода OpenLootbox).
- 3 - Продать карту (спроси у игрока ID карты для продажи и вызови SellCard).
- 4 - Показать инвентарь (выведи все карты, которые сейчас есть у игрока в List<Card>).
- 5 - Выйти.
Дополнительное задание:
Если справишься с базовой частью, усложни механику продажи:
Вместо простого удаления одной карты, реализуй систему количества
(как в террарии или майнкрафте, где предметы могут стакаться).
Для этого тебе придется хранить в инвентаре не просто List<Card>, а Dictionary<int, int>,
где ключ — ID карты, а значение — количество.
Или List<InventorySlot>, где в слоте лежит карта и количество.
Изменение кода будет серьезным, но это очень полезный опыт.