/
puma
/
ppa
Обзор
Документация
Войти
/
puma
/
ppa
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Battle/BattleMenuHandler.cs
152 строки
7 KB
Margarita
new
29 май 2026, 17:05
29 май 2026, 17:05
cc969a9
Код
Авторство
О чём код?
using System; /// <summary> /// Отображает интерактивное меню битвы и маршрутизирует выбор пользователя /// в соответствующие команды через <see cref="CommandInvoker"/>. /// </summary> public class BattleMenuHandler { private readonly GameManager _gameManager; private readonly SaveManager _saveManager; private readonly CommandInvoker _invoker; private bool _gameSavedDuringBattle; public bool WasGameSavedDuringBattle => _gameSavedDuringBattle; public BattleMenuHandler(GameManager gameManager, SaveManager? saveManager = null) { _gameManager = gameManager ?? throw new ArgumentNullException(nameof(gameManager)); _saveManager = saveManager ?? gameManager.GetSaveManager(); _invoker = new CommandInvoker(); _gameSavedDuringBattle = false; } /// <summary> /// Командное меню битвы — все действия обёрнуты в команды. /// Возвращает BattleMenuResult: Continue / BattleOver / Draw / Exit. /// </summary> public BattleMenuResult ShowCommandMenu(Player player1, Player player2, Battle battle) { while (true) { string undoLabel = _invoker.CanUndo ? "↩ Отменить" : "(Отмена недоступна)"; string redoLabel = _invoker.CanRedo ? "↪ Повторить" : "(Повтор недоступен)"; Console.WriteLine("\n╔══════════════════════════════════════╗"); Console.WriteLine("║ МЕНЮ БИТВЫ ║"); Console.WriteLine("╠══════════════════════════════════════╣"); Console.WriteLine("║ 1. Сделать ход ║"); Console.WriteLine("║ 2. Сделать ход до конца ║"); Console.WriteLine("║ 3. Перестроить армию ║"); Console.WriteLine($"║ 4. {undoLabel + " [Ctrl+X]",-34}║"); Console.WriteLine($"║ 5. {redoLabel + " [Ctrl+Z]",-34}║"); Console.WriteLine("║ 6. Сохранить ║"); Console.WriteLine("║ 7. Сохранить и выйти ║"); Console.WriteLine("║ 8. Выйти без сохранения ║"); Console.WriteLine("╚══════════════════════════════════════╝"); Console.Write("\nВыберите: "); var keyInfo = Console.ReadKey(intercept: true); Console.WriteLine(); string input; if (keyInfo.Modifiers.HasFlag(ConsoleModifiers.Control) && keyInfo.Key == ConsoleKey.X) input = "4"; else if (keyInfo.Modifiers.HasFlag(ConsoleModifiers.Control) && keyInfo.Key == ConsoleKey.Z) input = "5"; else input = keyInfo.KeyChar.ToString(); switch (input) { case "1": { var cmd = new MakeRoundCommand(battle); _invoker.Execute(cmd); if (cmd.IsDraw) return BattleMenuResult.Draw; if (cmd.BattleEnded) return BattleMenuResult.GameOver(cmd.Winner!); return BattleMenuResult.Continue; } case "2": { var cmd = new PlayToEndCommand(battle); _invoker.Execute(cmd); if (cmd.IsDraw) return BattleMenuResult.Draw; if (cmd.BattleEnded) return BattleMenuResult.GameOver(cmd.Winner!); return BattleMenuResult.Continue; } case "3": { var cmd = new ChangeFormationCommand(battle); _invoker.Execute(cmd); return BattleMenuResult.Continue; } case "4": { if (!_invoker.CanUndo) { Console.WriteLine("Нет действий для отмены."); continue; } _invoker.Undo(); Console.WriteLine("↩ Действие отменено."); return BattleMenuResult.Continue; } case "5": { if (!_invoker.CanRedo) { Console.WriteLine("Нет действий для повтора."); continue; } var redone = _invoker.Redo(); if (redone is MakeRoundCommand makeCmd) { if (makeCmd.IsDraw) return BattleMenuResult.Draw; if (makeCmd.BattleEnded) return BattleMenuResult.GameOver(makeCmd.Winner!); } else if (redone is PlayToEndCommand playCmd) { if (playCmd.IsDraw) return BattleMenuResult.Draw; if (playCmd.BattleEnded) return BattleMenuResult.GameOver(playCmd.Winner!); } return BattleMenuResult.Continue; } case "6": SaveGame(player1, player2, battle.CurrentPlayer, battle.CurrentRound, battle.GetFormationName()); continue; case "7": SaveGame(player1, player2, battle.CurrentPlayer, battle.CurrentRound, battle.GetFormationName()); return BattleMenuResult.Exit; case "8": Console.WriteLine("\nИгра завершена без сохранения."); return BattleMenuResult.Exit; default: Console.WriteLine("Неверный выбор!"); continue; } } } /// <summary>Запрашивает имя сохранения и записывает текущее состояние игры через SaveManager.</summary> private void SaveGame(Player player1, Player player2, Player currentPlayer, int roundNumber, string gameMode) { Console.Write("\nВведите имя для сохранения (оставьте пусто для автосохранения): "); string saveName = Console.ReadLine() ?? ""; if (string.IsNullOrWhiteSpace(saveName)) saveName = $"{player1.Name}_vs_{player2.Name}_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}"; try { var saveData = _gameManager.CreateSaveData(player1, player2, currentPlayer, roundNumber, gameMode); _saveManager.SaveGame(saveData, saveName); Console.WriteLine($"✓ Игра сохранена: {saveName}"); _gameSavedDuringBattle = true; } catch (Exception ex) { Console.WriteLine($"✗ Ошибка при сохранении: {ex.Message}"); } } }