Example #1
0
        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;
            }
        }