/
tryingtothink
/
shogi
Обзор
Документация
Войти
/
tryingtothink
/
shogi
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
UI/ConsoleMenu.cs
185 строк
6 KB
sofixlu
Доработка ошибок
27 дек 2025, 14:16
27 дек 2025, 14:16
eec02f6
Код
Авторство
О чём код?
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using shogi; using shogi.Data; using shogi.Logic; using shogi.UI; namespace shogi.UI { public class ConsoleMenu { private readonly RecordStorage _recordStorage = new("records.txt"); private readonly GameStorage _gameStorage = new("savegame.txt"); public async Task RunAsync() { while (true) { Console.Clear(); Console.WriteLine("1. Новая игра"); Console.WriteLine("2. Загрузить игру"); Console.WriteLine("3. Рекорды"); Console.WriteLine("4. Выход"); Console.Write("Выберите пункт: "); var key = Console.ReadLine(); switch (key) { case "1": StartNewGameAsync(); break; case "2": await LoadGameAsync(); break; case "3": ShowRecords(); break; case "4": return; default: Console.WriteLine("Неверный ввод"); Thread.Sleep(800); break; } } } public async void RunGame(GameEngine engine, Board board, ConsoleRenderer renderer) { while (!engine.IsFinished) { Console.Clear(); renderer.Render(); Console.WriteLine($"\nХод игрока: {engine.CurrentPlayer}"); Console.WriteLine($"Счет: {engine.Score}"); Console.WriteLine("Введите ход (пример: 1 a 1 b) или команду SAVE:"); var input = Console.ReadLine(); if (string.IsNullOrWhiteSpace(input)) continue; if (input.Trim().ToUpper() == "SAVE") { await _gameStorage.SaveAsync(engine); Console.WriteLine("Игра сохранена."); Console.WriteLine("Нажмите любую клавишу для возврата в меню..."); Console.ReadKey(); return; } if (input.Trim().ToUpper() == "SURRENDER") { Console.Clear(); Console.WriteLine($"Игрок {engine.CurrentPlayer} сдался."); Console.WriteLine("Партия завершена."); Console.WriteLine("Нажмите любую клавишу для возврата в меню..."); Console.ReadKey(); return; // выход в главное меню } if (input.Trim().ToUpper() == "HISTORY") { Console.Clear(); if (engine.Steps.Count == 0) { Console.WriteLine("Ходов нет!"); } else { foreach (var step in engine.Steps) { Console.WriteLine(step); } } Console.WriteLine("Нажмите любую кнопку для продолжения..."); Console.ReadKey(); continue; } if (!engine.TryMakeMove(input)) { Console.WriteLine("Неверный ход"); Thread.Sleep(800); } renderer.UpdateBoard(engine.Board); } Console.Clear(); renderer.Render(); Console.WriteLine("Игра завершена!"); Console.Write("Введите имя игрока: "); var name = Console.ReadLine() ?? "Player"; _recordStorage.AddRecord(new RecordEntry(name, engine.Score)); } private void StartNewGameAsync() { var engine = new GameEngine(); engine.Init(); var boardUI = new Board(); boardUI.UpdateFromGameEngine(engine.Board); var renderer = new ConsoleRenderer(boardUI); RunGame(engine, boardUI, renderer); } private async Task LoadGameAsync() { //var engine = await _gameStorage.LoadAsync(); var engine = await Task.Run(_gameStorage.LoadAsync); if (engine == null) { Console.WriteLine("Сохранение не найдено"); Console.ReadKey(); return; } var board = new Board(); board.UpdateFromGameEngine(engine.Board); var renderer = new ConsoleRenderer(board); RunGame(engine, board, renderer); } private void ShowRecords() { var list = _recordStorage.LoadRecords(); Console.Clear(); if (list.Count == 0) { Console.WriteLine("Рекордов пока нет, время поставить свой!"); Console.Write("Нажмите любую кнопку для возвращения в главное меню..."); Console.ReadKey(); return; } Console.WriteLine("Лучшие партии:"); foreach (var r in list.Take(10)) Console.WriteLine($"{r.Name} — {r.Score}"); Console.WriteLine("Нажмите любую клавишу..."); Console.ReadKey(); } } }