/
d4nil
/
Konenkov_2413_Course_Work
Обзор
Документация
Войти
/
d4nil
/
Konenkov_2413_Course_Work
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
Game
TapTapDash.Core/Models/GameOverModel.cs
221 строка
7 KB
Konenkov Daniel
feat: добавить предпреждения при вводе пустого имени
09 янв 2026, 22:58
09 янв 2026, 22:58
878b9a0
Код
Авторство
О чём код?
using TapTapDash.Core.Services; namespace TapTapDash.Core.Models; /// <summary> /// Модель окна поражения /// Хранит информацию о результате игры и управляет вводом имени для топ-10 /// </summary> public class GameOverModel { private readonly HighScoresService _service; /// <summary> /// Счет игрока /// </summary> public int Score { get; private set; } /// <summary> /// Попадает ли счет в топ-10 /// </summary> public bool IsTopTen { get; private set; } /// <summary> /// Имя игрока (для топ-10) /// </summary> public string PlayerName { get; set; } /// <summary> /// Состояние окна поражения /// </summary> public GameOverState State { get; set; } /// <summary> /// Сообщение об ошибке (если имя пустое или неуникальное) /// </summary> public string? ErrorMessage { get; set; } /// <summary> /// Список пунктов меню поражения /// </summary> public List<string> MenuItems { get; private set; } /// <summary> /// Индекс выбранного пункта меню /// </summary> private int _selectedIndex; /// <summary> /// Индекс выбранного пункта меню /// </summary> public int SelectedIndex { get => _selectedIndex; set { // Проверяем границы if (value < 0) { _selectedIndex = 0; } else if (value >= MenuItems.Count) { _selectedIndex = MenuItems.Count - 1; } else { _selectedIndex = value; } } } /// <summary> /// Текст выбранного пункта меню /// </summary> public string SelectedMenuItem => MenuItems[SelectedIndex]; /// <summary> /// Конструктор модели окна поражения /// </summary> /// <param name="score">Счет игрока</param> public GameOverModel(int score) { _service = new HighScoresService(); Score = score; IsTopTen = _service.IsTopTen(score); PlayerName = ""; State = IsTopTen ? GameOverState.EnteringName : GameOverState.ShowingResult; ErrorMessage = null; // Инициализируем пункты меню в зависимости от того, в топ-10 ли игрок MenuItems = new List<string>(); if (IsTopTen) { MenuItems.Add("Сохранить результат"); MenuItems.Add("Главное меню"); } else { MenuItems.Add("Главное меню"); } // По умолчанию выбран первый пункт _selectedIndex = 0; } /// <summary> /// Перемещение выбора вверх /// </summary> public void MoveUp() { SelectedIndex--; } /// <summary> /// Перемещение выбора вниз /// </summary> public void MoveDown() { SelectedIndex++; } /// <summary> /// Проверка, является ли имя валидным для сохранения /// </summary> public bool IsNameValid() { // Проверяем, что имя не пустое if (string.IsNullOrWhiteSpace(PlayerName)) { ErrorMessage = "Пустое имя"; return false; } // Проверяем, что имя уникально (нет записи с таким же именем и счетом) var results = _service.LoadHighScores(); if (results.Any(r => r.Name.Equals(PlayerName, StringComparison.OrdinalIgnoreCase) && r.Score == Score)) { ErrorMessage = "Имя с таким счетом уже существует!"; return false; } ErrorMessage = null; return true; } /// <summary> /// Сохранение результата в топ-10 /// </summary> public bool SaveResult() { if (!IsTopTen) { return false; } // Проверяем валидность имени if (!IsNameValid()) { return false; // Имя невалидно, предупреждение уже установлено } _service.AddHighScore(PlayerName, Score); State = GameOverState.ResultSaved; // После сохранения обновляем меню - оставляем только "Главное меню" MenuItems = new List<string> { "Главное меню" }; _selectedIndex = 0; ErrorMessage = null; return true; } /// <summary> /// Обработка ввода символа для имени /// </summary> public void HandleCharacterInput(char character) { if (State == GameOverState.EnteringName && SelectedMenuItem == "Сохранить результат") { // Проверяем, что символ является буквой, цифрой или пробелом и длина имени не превышает 20 if (PlayerName.Length < 20 && (char.IsLetterOrDigit(character) || character == ' ')) { PlayerName += character; // Очищаем сообщение об ошибке при вводе ErrorMessage = null; } } } /// <summary> /// Обработка удаления символа из имени /// </summary> public void HandleBackspace() { if (State == GameOverState.EnteringName && SelectedMenuItem == "Сохранить результат" && PlayerName.Length > 0) { PlayerName = PlayerName.Substring(0, PlayerName.Length - 1); // Очищаем сообщение об ошибке при удалении ErrorMessage = null; } } } /// <summary> /// Состояние окна поражения /// </summary> public enum GameOverState { /// <summary> /// Показ результата (для не топ-10) /// </summary> ShowingResult, /// <summary> /// Ввод имени (для топ-10) /// </summary> EnteringName, /// <summary> /// Результат сохранен /// </summary> ResultSaved }