private void PlayGame(Grid playerGrid, Grid enemyGrid) { bool autoTargetShips = RequestBool("Target ships randomly:"); var rand = new Random(); bool playersTurn = rand.NextDouble() > 0.5; string currentPlayer = playersTurn ? "Player" : "Enemy"; Console.WriteLine(); Console.WriteLine($"{currentPlayer} starts."); bool inGame = true; while (inGame) { Console.WriteLine(); Console.WriteLine($"{currentPlayer}'s turn."); Grid targetGrid = playersTurn ? enemyGrid : playerGrid; Console.WriteLine(); DrawGrid(targetGrid, "Targeting"); var validTargets = _gridService.GetValidTargets(targetGrid).ToList(); string selectedTarget = ""; if (autoTargetShips || !playersTurn) { selectedTarget = validTargets[rand.Next(0, validTargets.Count)]; } else { bool validTarget = false; while (!validTarget) { selectedTarget = RequestString("Please enter target coordinates:"); if (validTargets.Contains(selectedTarget)) { validTarget = true; } else { Console.WriteLine(); Console.WriteLine($"{selectedTarget} isn't a valid target"); } } } Console.WriteLine(); Console.WriteLine($"{currentPlayer} attacks {selectedTarget}"); var shipType = _gridService.Attack(targetGrid, selectedTarget); if (shipType is not null) { Console.WriteLine("KABOOM! Attack successful!"); if (_gridService.HasShipBeenSunk(targetGrid, shipType.Value)) { Console.WriteLine($"You sunk my {shipType}!"); } } else { Console.WriteLine("Sploosh. Attack unsuccessful."); } var remainingShipPositions = _gridService.GetShipPositions(targetGrid); if (remainingShipPositions.Any()) { playersTurn = !playersTurn; currentPlayer = playersTurn ? "Player" : "Enemy"; continue; } Console.WriteLine(); Console.WriteLine($"{currentPlayer} wins!"); inGame = false; } }