/
anya155
/
Bingo
Обзор
Документация
Войти
/
anya155
/
Bingo
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Data/HighScoreTable.cs
281 строка
11 KB
Ksenia Rozhkina
добавление комментариев
20 дек 2025, 12:10
20 дек 2025, 12:10
21fd118
Код
Авторство
О чём код?
using System.Text.Json; namespace LotoGame.Data { /// <summary> /// Запись в таблице рекордов. /// </summary> public class HighScoreEntry { /// <summary> /// Получает или задает имя игрока. /// </summary> public string PlayerName { get; set; } = string.Empty; /// <summary> /// Получает или задает количество очков. /// </summary> public int Score { get; set; } /// <summary> /// Получает или задает количество ходов. /// </summary> public int Turns { get; set; } /// <summary> /// Получает или задает дату игры. /// </summary> public DateTime Date { get; set; } /// <summary> /// Получает или задает режим игры. /// </summary> public string GameMode { get; set; } = string.Empty; /// <summary> /// Преобразует запись в строковое представление. /// </summary> /// <returns>Форматированная строка.</returns> public override string ToString() { return $"{PlayerName,-15} | {Score,5} | {Turns,5} | {Date:dd.MM.yyyy}"; } } /// <summary> /// Таблица рекордов игры. /// </summary> public class HighScoreTable { private const string HighscoresFile = "highscores.json"; private List<HighScoreEntry> _entries; /// <summary> /// Инициализирует новый экземпляр класса <see cref="HighScoreTable"/>. /// </summary> public HighScoreTable() { _entries = LoadHighScores(); } private List<HighScoreEntry> LoadHighScores() { try { if (File.Exists(HighscoresFile)) { string fileContent = File.ReadAllText(HighscoresFile); return JsonSerializer.Deserialize<List<HighScoreEntry>>(fileContent) ?? new List<HighScoreEntry>(); } } catch { // Если файл поврежден или не существует, начинаем заново } return new List<HighScoreEntry>(); } private void SaveHighScores() { try { var options = new JsonSerializerOptions { WriteIndented = true }; string fileContent = JsonSerializer.Serialize(_entries, options); File.WriteAllText(HighscoresFile, fileContent); } catch (Exception ex) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine($"❌ Ошибка при сохранении таблицы рекордов: {ex.Message}"); Console.ResetColor(); } } /// <summary> /// Добавляет новую запись в таблицу рекордов. /// </summary> /// <param name="playerName">Имя игрока.</param> /// <param name="score">Количество очков.</param> /// <param name="turns">Количество ходов.</param> /// <param name="gameMode">Режим игры.</param> public void AddEntry(string playerName, int score, int turns, string gameMode) { var entry = new HighScoreEntry { PlayerName = playerName, Score = score, Turns = turns, Date = DateTime.Now, GameMode = gameMode }; _entries.Add(entry); _entries = _entries.OrderByDescending(e => e.Score) .ThenBy(e => e.Turns) .ToList(); SaveHighScores(); } /// <summary> /// Получает топ рекордов для указанного режима. /// </summary> /// <param name="gameMode">Режим игры.</param> /// <param name="count">Количество записей.</param> /// <returns>Список записей.</returns> public List<HighScoreEntry> GetTopScoresForMode(string gameMode, int count = 5) { return _entries.Where(e => e.GameMode == gameMode) .OrderByDescending(e => e.Score) .ThenBy(e => e.Turns) .Take(count) .ToList(); } /// <summary> /// Получает все записи для указанного режима. /// </summary> /// <param name="gameMode">Режим игры.</param> /// <returns>Список записей.</returns> public List<HighScoreEntry> GetAllScoresForMode(string gameMode) { return _entries.Where(e => e.GameMode == gameMode) .OrderByDescending(e => e.Score) .ThenBy(e => e.Turns) .ToList(); } /// <summary> /// Отображает таблицы рекордов. /// </summary> public void DisplayTopScores() { Console.Clear(); Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine(new string('═', 60)); Console.WriteLine(" 🏆 ТАБЛИЦЫ РЕКОРДОВ 🏆 "); Console.WriteLine(new string('═', 60)); Console.ResetColor(); Console.WriteLine(); DisplayModeTable("Любая строка", ConsoleColor.Blue, "📊"); Console.WriteLine("\n" + new string('─', 60) + "\n"); DisplayModeTable("Полный дом", ConsoleColor.Green, "🏠"); Console.WriteLine(); Console.ForegroundColor = ConsoleColor.DarkGray; Console.WriteLine("💡 Каждая таблица показывает топ-5 результатов для своего режима"); Console.ResetColor(); } private void DisplayModeTable(string modeName, ConsoleColor color, string icon) { var modeScores = GetTopScoresForMode(modeName, 5); Console.ForegroundColor = color; Console.WriteLine($"{icon} РЕЖИМ: {modeName.ToUpper()} {icon}"); Console.WriteLine(new string('═', 48)); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("Игрок | Очки | Ходы | Дата"); Console.WriteLine(new string('─', 48)); Console.ResetColor(); if (modeScores.Count == 0) { Console.ForegroundColor = ConsoleColor.DarkGray; Console.WriteLine($" Пока нет рекордов в режиме '{modeName}'"); Console.ResetColor(); } else { for (int i = 0; i < modeScores.Count; i++) { if (i == 0) { Console.ForegroundColor = ConsoleColor.Yellow; } else if (i == 1) { Console.ForegroundColor = ConsoleColor.Gray; } else if (i == 2) { Console.ForegroundColor = ConsoleColor.DarkYellow; } else { Console.ForegroundColor = ConsoleColor.White; } Console.Write($"{i + 1}. "); Console.WriteLine(modeScores[i]); } Console.ResetColor(); } Console.ForegroundColor = color; Console.WriteLine(new string('═', 48)); Console.ResetColor(); int totalEntries = GetAllScoresForMode(modeName).Count; if (totalEntries > 0) { Console.ForegroundColor = ConsoleColor.DarkGray; Console.WriteLine($" Всего записей в режиме: {totalEntries}"); Console.ResetColor(); } } /// <summary> /// Отображает детальную статистику по режиму. /// </summary> /// <param name="modeName">Режим игры.</param> public void DisplayDetailedStatsForMode(string modeName) { var allScores = GetAllScoresForMode(modeName); if (allScores.Count == 0) { Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine($"📭 В режиме '{modeName}' пока нет рекордов"); Console.ResetColor(); return; } Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine($"\n📊 Детальная статистика режима: {modeName}"); Console.WriteLine(new string('─', 60)); Console.ResetColor(); Console.WriteLine($"Всего игр сыграно: {allScores.Count}"); if (allScores.Count > 0) { double avgScore = allScores.Average(e => e.Score); double avgTurns = allScores.Average(e => e.Turns); int maxScore = allScores.Max(e => e.Score); int minTurns = allScores.Min(e => e.Turns); Console.WriteLine($"Среднее количество очков: {avgScore:F1}"); Console.WriteLine($"Среднее количество ходов: {avgTurns:F1}"); Console.WriteLine($"Лучший результат (очки): {maxScore}"); Console.WriteLine($"Самая быстрая победа (ходов): {minTurns}"); var topPlayer = allScores .GroupBy(e => e.PlayerName) .Select(g => new { Name = g.Key, Count = g.Count() }) .OrderByDescending(x => x.Count) .FirstOrDefault(); if (topPlayer != null) { Console.WriteLine($"Самый активный игрок: {topPlayer.Name} ({topPlayer.Count} игр)"); } } } } }