/
Vagabond132
/
TerrariaCourse
Обзор
Документация
Войти
/
Vagabond132
/
TerrariaCourse
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
Windows
Model/Utils/ScoreManager.cs
123 строки
4 KB
Vagabond132
Соглашение
13 янв 2025, 13:34
13 янв 2025, 13:34
8528b00
Код
Авторство
О чём код?
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.Json; namespace Model.Utils { /// <summary> /// Мэнеджер рекордов /// </summary> public class ScoreManager { /// <summary> /// Единственный экземпляр /// </summary> private static ScoreManager _instance; /// <summary> /// Объект для блокировки /// </summary> private static readonly object _lock = new object(); /// <summary> /// Имя файла для рекордов /// </summary> private readonly string _fileName = Environment.CurrentDirectory + "\\..\\..\\..\\..\\Model\\Utils\\records.txt"; /// <summary> /// Максимальное количество записей рекордов /// </summary> private const int _maxRecords = 10; /// <summary> /// Приватный конструктор для предотвращения создания экземпляров извне. /// </summary> private ScoreManager() { } /// <summary> /// Единственный экземпляр класса. /// </summary> public static ScoreManager Instance { get { if (_instance == null) { lock (_lock) // Блокировка для обеспечения потокобезопасности { if (_instance == null) { _instance = Nested.instance; } } } return _instance; } } /// <summary> /// Приватный класс для реализации синглтона /// </summary> private class Nested { internal static readonly ScoreManager instance = new ScoreManager(); } /// <summary> /// Сериализует список рекордов и сохраняет его в файл. /// </summary> /// <param name="parRecords">Список рекордов.</param> private void SaveScores(List<PlayerScore> parRecords) { string json = JsonSerializer.Serialize(parRecords, new JsonSerializerOptions { WriteIndented = true }); File.WriteAllText(_fileName, json); } /// <summary> /// Загружает список рекордов из файла. /// </summary> /// <returns>Список рекордов.</returns> private List<PlayerScore> LoadScores() { if (!File.Exists(_fileName)) return new List<PlayerScore>(); string json = File.ReadAllText(_fileName); return JsonSerializer.Deserialize<List<PlayerScore>>(json) ?? new List<PlayerScore>(); } /// <summary> /// Добавляет новый рекорд в список, если он подходит по условиям. /// </summary> /// <param name="parPlayerName">Имя игрока.</param> /// <param name="parScore">Количество очков.</param> public void AddScore(string parPlayerName, int parScore) { var scores = LoadScores(); // Если меньше 10 записей, просто добавляем новый рекорд. if (scores.Count < _maxRecords || parScore > scores.Min(s => s.Score)) { if (scores.Count == _maxRecords) { // Удаляем наименьший рекорд, если список заполнен. scores.Remove(scores.OrderBy(s => s.Score).First()); } // Добавляем новый рекорд и сортируем список. scores.Add(new PlayerScore { Name = parPlayerName, Score = parScore }); scores = scores.OrderByDescending(s => s.Score).ToList(); SaveScores(scores); } } /// <summary> /// Возвращает список рекордов, отсортированный по количеству очков. /// </summary> /// <returns>Список рекордов.</returns> public List<PlayerScore> GetTopScores() { return LoadScores().OrderByDescending(s => s.Score).ToList(); } } }