-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSerializationTask.txt
More file actions
145 lines (113 loc) · 9.25 KB
/
SerializationTask.txt
File metadata and controls
145 lines (113 loc) · 9.25 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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
Название задачи: "Система сохранения и загрузки прогресса в RPG игре (Save/Load System)"
Контекст:
Мы разрабатываем RPG игру. Игрок путешествует по миру, собирает предметы, сражается.
Нам нужна полноценная система сохранения/загрузки.
Геймдизайнер хочет, чтобы игрок мог сохраняться в любой момент (кроме боя) и загружаться.
Данные должны храниться в JSON формате (это стандарт для игр),
чтобы при необходимости дизайнеры могли подкручивать значения вручную.
Что нужно сделать:
Часть 1. Создание игровой модели (классы)
1. Класс Player:
- string Name (имя игрока)
- int Level (уровень)
- int Experience (опыт)
- int Health (текущее здоровье)
- int MaxHealth (максимальное здоровье)
- int Mana (мана)
- int MaxMana
- float Gold (золото)
- List<Item> Inventory (инвентарь - используй класс Item из предыдущего задания)
2. Класс GameState:
- Это "контейнер" для всего состояния игры.
- Player CurrentPlayer (текущий игрок)
- string CurrentLocation (текущая локация, например "Лес", "Горы", "Деревня")
- DateTime SaveTime (время сохранения)
- int PlayTimeInMinutes (время, проведенное в игре)
- Dictionary<string, bool> QuestProgress (прогресс заданий: ключ — ID квеста, значение — выполнено/нет)
- List<string> UnlockedLocations (открытые локации)
Часть 2. Класс SaveSystem (ядро задания)
Создай класс SaveSystem, который будет отвечать за сохранение и загрузку.
У него должны быть методы:
1. SaveGame(GameState gameState, string saveFileName)
- Сохраняет состояние игры в JSON файл.
- Добавляет к имени файла расширение .json (или .sav, если хочешь).
- Важно: При сохранении нужно добавить временную метку (SaveTime) — когда было сделано сохранение.
2. GameState LoadGame(string saveFileName)
- Загружает состояние игры из JSON файла.
- Если файл не найден — выбрасывает понятное исключение (обработай его в Main).
3. List<string> GetAllSaveFiles(string saveDirectory)
- Возвращает список всех файлов сохранений в папке Saves.
- Используй System.IO для поиска файлов.
4. void DeleteSave(string saveFileName)
- Удаляет файл сохранения.
- Обработай случай, если файла нет.
Часть 3. Игровой цикл (класс Game или Program.Main)
Создай простой игровой цикл, который позволит протестировать систему:
1. Создание персонажа:
- При первом запуске игрок вводит имя.
- Создается новый Player (уровень 1, здоровье 100, мана 50, золото 10).
- В инвентарь добавь стартовые предметы (например, "Ржавый меч", "Малое зелье лечения").
2. Игровой процесс (симуляция):
- Простой текстовый интерфейс с командами (цифры или буквы):
1 - Идти в следующую локацию
2 - Найти предмет (случайный предмет добавляется в инвентарь)
3 - Получить опыт (+10 опыта)
4 - Сохранить игру
5 - Загрузить игру
6 - Показать статус
7 - Список сохранений
8 - Выйти
- Команда "Идти в локацию" меняет CurrentLocation и, возможно, открывает новую локацию
(добавляет в UnlockedLocations).
- Команда "Найти предмет" создает случайный предмет (используй Random и enum ItemType) и добавляет в инвентарь.
- При накоплении опыта (например, 100) уровень повышается, растет здоровье/мана.
3. Тестирование сохранений:
- Поиграй немного, измени состояние (найди предметы, получи опыт, открой локации).
- Сохрани игру (команда 4).
- Выйди из игры.
- Запусти заново, загрузи сохранение (команда 5 + выбор файла из списка).
- Проверь, что все данные восстановились: уровень, здоровье, инвентарь, открытые локации.
Технические требования и подсказки:
1. Для JSON: Используй System.Text.Json (встроен в современный C#) или Newtonsoft.Json (если привычнее).
В консольном проекте .NET 5+ уже есть System.Text.Json.
using System.Text.Json;
- Сохранение
string json = JsonSerializer.Serialize(gameState, new JsonSerializerOptions { WriteIndented = true });
File.WriteAllText(filePath, json);
- Загрузка
string json = File.ReadAllText(filePath);
GameState gameState = JsonSerializer.Deserialize<GameState>(json);
2. Работа с файлами:
- Создай папку Saves рядом с exe-файлом (или в Environment.CurrentDirectory).
- Используй Path.Combine() для создания путей.
- Directory.CreateDirectory() создаст папку, если её нет.
- Directory.GetFiles() для поиска всех сохранений.
- File.Delete() для удаления.
3. Обработка ошибок:
- Оберни загрузку в try-catch. Если файл поврежден или не найден — сообщи игроку и не краши программу.
- При сохранении тоже может быть ошибка (диск заполнен, нет прав) — обработай.
4. Работа с временем:
- Используй DateTime.Now для SaveTime
- Для подсчета времени в игре можно запоминать DateTime startTime при запуске и вычислять разницу.
5. LINQ пригодится:
- Для поиска предметов в инвентаре (например, при добавлении опыта).
- Для сортировки списка сохранений по дате.
Дополнительные задания (если будет легко):
1. Автосохранение:
При переходе в новую локацию или получении уровня делай автосохранение в отдельный файл autosave.json.
2. "Продолжить игру":
Добавь команду, которая автоматически загружает последнее сохранение (самое свежее по дате).
3. Бэкапы:
При сохранении делай копию старого файла с расширением .backup
или переименовывай старый файл в filename_old.json перед записью нового.
4. Валидация:
При загрузке проверяй, что у игрока здоровье не отрицательное и не больше максимума,
инвентарь не null и т.д. Исправляй, если что-то пошло не так
(на случай, если дизайнер вручную испортил файл).
Критерии успешного выполнения:
- Программа сохраняет и загружает ВСЕ состояние игры: игрок, инвентарь, локации, прогресс квестов.
- JSON файл читается человеком (с отступами).
- При загрузке корректно восстанавливаются все коллекции (List, Dictionary).
- Обрабатываются ошибки (файл не найден, поврежденный JSON).
- Интерфейс понятный, можно поиграть и протестировать.
- Код чистый, классы разделены по ответственности.