public void Start(ISnake snake)
        {
            this.Snake = snake;

            this.SpawnApple();

            this.ResetObstructions();

            while (true)
            {
                if (Console.KeyAvailable)
                {
                    ConsoleKey key = Console.ReadKey(true).Key;

                    switch (key)
                    {
                    case ConsoleKey.LeftArrow:
                        Snake.CurrentDirection = Direction.Left;
                        break;

                    case ConsoleKey.RightArrow:
                        Snake.CurrentDirection = Direction.Right;
                        break;

                    case ConsoleKey.UpArrow:
                        Snake.CurrentDirection = Direction.Up;
                        break;

                    case ConsoleKey.DownArrow:
                        Snake.CurrentDirection = Direction.Down;
                        break;

                    case ConsoleKey.Spacebar:
                        Pause();
                        break;
                    }
                }

                Snake.Move();

                if (Snake.Head.Equals(AppleLocation))
                {
                    SpawnApple();
                    AppleCounter++;
                    Snake.Extend++;

                    ResetObstructions();
                }

                OutputWriter.Draw(this);

                if (Snake.Dead)
                {
                    OutputWriter.DisplayDeathMessage(this);
                    break;
                }

                Thread.Sleep(300);
            }
        }
        public void Start(ISnake snake)
        {
            this.Snake = snake;

            this.SpawnApple();

            while (true)
            {
                if (Console.KeyAvailable)
                {
                    ConsoleKey key = Console.ReadKey(true).Key;

                    switch (key)
                    {
                    case ConsoleKey.LeftArrow:
                        appleDirection = Direction.Left;
                        break;

                    case ConsoleKey.RightArrow:
                        appleDirection = Direction.Right;
                        break;

                    case ConsoleKey.UpArrow:
                        appleDirection = Direction.Up;
                        break;

                    case ConsoleKey.DownArrow:
                        appleDirection = Direction.Down;
                        break;

                    case ConsoleKey.Spacebar:
                        Pause();
                        break;
                    }
                }

                if (random.Next(5) == 0)
                {
                    int nextDirectionId = random.Next(2);

                    if (nextDirectionId == 0)
                    {
                        if (Snake.CurrentDirection == Direction.Up)
                        {
                            Snake.CurrentDirection = Direction.Right;
                        }
                        else if (Snake.CurrentDirection == Direction.Right)
                        {
                            Snake.CurrentDirection = Direction.Down;
                        }
                        else if (Snake.CurrentDirection == Direction.Down)
                        {
                            Snake.CurrentDirection = Direction.Left;
                        }
                        else if (Snake.CurrentDirection == Direction.Left)
                        {
                            Snake.CurrentDirection = Direction.Up;
                        }
                    }
                    else
                    {
                        if (Snake.CurrentDirection == Direction.Up)
                        {
                            Snake.CurrentDirection = Direction.Left;
                        }
                        else if (Snake.CurrentDirection == Direction.Right)
                        {
                            Snake.CurrentDirection = Direction.Up;
                        }
                        else if (Snake.CurrentDirection == Direction.Down)
                        {
                            Snake.CurrentDirection = Direction.Right;
                        }
                        else if (Snake.CurrentDirection == Direction.Left)
                        {
                            Snake.CurrentDirection = Direction.Down;
                        }
                    }
                }

                int currX = AppleLocation.X;
                int currY = AppleLocation.Y;

                int targetX;
                int targetY;

                switch (appleDirection)
                {
                case Direction.Up:
                    targetX = currX;
                    targetY = currY - 1;
                    break;

                case Direction.Down:
                    targetX = currX;
                    targetY = currY + 1;
                    break;

                case Direction.Left:
                    targetX = currX - 1;
                    targetY = currY;
                    break;

                case Direction.Right:
                    targetX = currX + 1;
                    targetY = currY;
                    break;

                default:
                    throw new InvalidOperationException("Invalid direction");
                }

                if (targetX < 0)
                {
                    targetX = Width - 1;
                }
                else if (targetX == Width)
                {
                    targetX = 0;
                }
                else if (targetY < 0)
                {
                    targetY = Height - 1;
                }
                else if (targetY == Height)
                {
                    targetY = 0;
                }

                AppleLocation = new Position(targetX, targetY);

                if (Snake.Head.Equals(AppleLocation))
                {
                    SpawnApple();
                    AppleCounter++;
                    Snake.Extend++;
                }

                OutputWriter.Draw(this);

                if (!Snake.Head.Equals(AppleLocation) && Snake.Positions.Contains(AppleLocation))
                {
                    OutputWriter.DisplayDeathMessage(this);
                    break;
                }

                if (random.Next(2) == 0)
                {
                    Snake.Move();
                }

                Thread.Sleep(300);
            }
        }