public void Move(Directions direction) { int xPosIncrement = 0, yPosIncrement = 0; switch (direction) { case Directions.Up: --yPosIncrement; break; case Directions.Right: ++xPosIncrement; break; case Directions.Down: ++yPosIncrement; break; case Directions.Left: --xPosIncrement; break; } ISnakeBodyPart currentBodyPart = BodyParts.First(); int previousSnakeBodyPartXPosition = currentBodyPart.XPos; int previousSnakeBodyPartYPosition = currentBodyPart.YPos; currentBodyPart.SetPosition(currentBodyPart.XPos + xPosIncrement, currentBodyPart.YPos + yPosIncrement); for (int i = 1; i < BodyParts.Count; ++i) { currentBodyPart = BodyParts[i]; currentBodyPart.SetPosition(previousSnakeBodyPartXPosition, previousSnakeBodyPartYPosition); previousSnakeBodyPartXPosition = currentBodyPart.XPos; previousSnakeBodyPartYPosition = currentBodyPart.YPos; } }
internal SnakeBodyPart(int xPos, int yPos, bool isSnakeHead, ISnakeBodyPart nextBodyPart) { XPos = xPos; YPos = yPos; IsSnakeHead = isSnakeHead; NextBodyPart = nextBodyPart; }
public static ISnake GenerateSnake(int startingXpos, int startingYPos, int length) { ExceptionHelper.ThrowArgumentOutOfRangeIfZeroOrLower(nameof(length), length); ISnakeBodyPart[] snakeBodyParts = new ISnakeBodyPart[length]; ISnakeBodyPart nextBodyPart = null; for (int i = length - 1; i >= 0; --i) { ISnakeBodyPart currentSnakeBodyPart = new SnakeBodyPart(startingXpos, startingYPos, i == 0, nextBodyPart); snakeBodyParts[i] = currentSnakeBodyPart; nextBodyPart = currentSnakeBodyPart; } return(new Snake(snakeBodyParts)); }
public void NextTurnTest_DirectionDown() { const int Width = 10; const int Height = 10; const int startingXPos = 5; const int startingYPos = 5; const int startingSnakeLength = 1; SnakeGameHandler gameHandler = new SnakeGameHandler(); gameHandler.SetupGame(Width, Height, startingXPos, startingYPos, startingSnakeLength); const int expectedXPosition = startingXPos; const int expectedYPosition = startingYPos + 1; gameHandler.NextTurn(Enums.Directions.Down); ISnakeBodyPart snakeHead = gameHandler.Snake.BodyParts.First(bodyPart => bodyPart.IsSnakeHead); Assert.AreEqual(expectedXPosition, snakeHead.XPos); Assert.AreEqual(expectedYPosition, snakeHead.YPos); }
public bool IsGameOver() { ISnakeBodyPart headBodyPart = Snake.BodyParts.First(bodypart => bodypart.IsSnakeHead); return(Snake.BodyParts .Any(bodyPart // Any Bodypart out of Borders => bodyPart.XPos >= GameWidth || bodyPart.XPos < 0 || bodyPart.YPos >= GameHeight || bodyPart.YPos < 0) || ( Snake.BodyParts // Snakehead hitting other bodypart .Any(bodyPart => bodyPart.XPos == headBodyPart.XPos && bodyPart.YPos == headBodyPart.YPos) && Snake.BodyParts // Not all bodyparts are in the same position .Count(bodyPart => bodyPart.XPos == headBodyPart.XPos && bodyPart.YPos == headBodyPart.YPos) != Snake.BodyParts.Count )); }