/
anstyfil
/
Minesweeper
Обзор
Документация
Войти
/
anstyfil
/
Minesweeper
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Storage/HighScoreManager.cs
103 строки
4 KB
anstyfil
reorganize code into 3 abstraction levels (UI, Game, Storage)
12 дек 2025, 01:10
12 дек 2025, 01:10
99b8539
Код
Авторство
О чём код?
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.Json; using Minesweeper.Game; namespace Minesweeper.Storage { /// <summary> /// Статический класс для работы с таблицей рекордов: сохранение, загрузка, получение топ-N. /// </summary> public static class HighScoreManager { private const string FilePath = "highscores.json"; /// <summary> /// Сохраняет новый рекорд в файл таблицы рекордов. /// </summary> /// <param name="record">Рекорд для сохранения</param> /// <exception cref="ArgumentNullException">Если record равен null</exception> public static void SaveRecord(HighScoreRecord record) { if (record == null) { throw new ArgumentNullException(nameof(record)); } // Загружаем все существующие рекорды List<HighScoreRecord> records = LoadRecords(); // Добавляем новый рекорд records.Add(record); // Сортируем по счету по убыванию и ограничиваем до 100 рекордов records = records.OrderByDescending(r => r.Score).Take(100).ToList(); // Сериализуем в JSON var options = new JsonSerializerOptions { WriteIndented = true, Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; string json = JsonSerializer.Serialize(records, options); // Сохраняем в файл File.WriteAllText(FilePath, json); } /// <summary> /// Загружает все рекорды из файла. /// </summary> /// <returns>Список всех рекордов. Если файл не существует или поврежден, возвращает пустой список.</returns> public static List<HighScoreRecord> LoadRecords() { if (!File.Exists(FilePath)) { return new List<HighScoreRecord>(); } try { string json = File.ReadAllText(FilePath); List<HighScoreRecord>? records = JsonSerializer.Deserialize<List<HighScoreRecord>>(json); if (records == null) { return new List<HighScoreRecord>(); } return records; } catch (JsonException) { // Поврежденный JSON - возвращаем пустой список return new List<HighScoreRecord>(); } catch (Exception) { // Другие ошибки (например, нет прав на чтение) - возвращаем пустой список return new List<HighScoreRecord>(); } } /// <summary> /// Получает топ-N рекордов (отсортированные по счету по убыванию). /// </summary> /// <param name="n">Количество рекордов для получения</param> /// <returns>Список топ-N рекордов. Если n <= 0, возвращает пустой список.</returns> public static List<HighScoreRecord> GetTopN(int n) { if (n <= 0) { return new List<HighScoreRecord>(); } List<HighScoreRecord> records = LoadRecords(); return records.OrderByDescending(r => r.Score).Take(n).ToList(); } } }