public async Task Run(IGameManager gameManager) { // // Select Game // Initialize players // Run Game - Loop // Get Turn Input // Validate Input // Apply Input // Check Game Status // If Finished // Exit Loop // Declare Winner // Console.WriteLine(AppConstant.ApplicationName); var gameDefinition = await SelectGame(gameManager); var playerCount = await SelectPlayerCount(gameDefinition); var gameSessionId = await gameManager.StartGame(gameDefinition.Id, playerCount); DataTable gameBoard; Console.WriteLine($"Starting {gameDefinition.Name}"); bool isGamePlayable; do { gameBoard = await gameManager.GetBoard(gameSessionId); ShowGameBoard(gameBoard); var currentPlayer = await gameManager.GetCurrentPlayer(gameSessionId); if (currentPlayer.IsMachine) { await gameManager.AutoPlayTurn(gameSessionId); } else { var prompt = await gameManager.GetTurnPrompt(gameSessionId); Console.WriteLine($"{prompt} {currentPlayer.Name} ({currentPlayer.GamePiece})."); var userInput = GetStringInput(); var validationResult = await gameManager.ConfirmUsableAddress(gameSessionId, userInput); if (validationResult == ValidationResult.Success) { await gameManager.ApplyTurn(gameSessionId, currentPlayer.Id, userInput); } else { Console.WriteLine($"{validationResult.ErrorMessage}. Please try again."); } } isGamePlayable = await gameManager.IsGamePlayable(gameSessionId); } while (isGamePlayable); gameBoard = await gameManager.GetBoard(gameSessionId); ShowGameBoard(gameBoard); var player = await gameManager.FindWinner(gameSessionId); ShowWinner(player.Name, player.GamePiece); ShowExit(); }