/// <summary> /// Event that defines what happens on each game tick. /// </summary> public void tick(Object sender, EventArgs e) { prevdirectionX = directionX; prevdirectionY = directionY; int snakeX = snake.getX(); int snakeY = snake.getY(); // Check snake collision with borders, food, or itself if (snakeX > board.ActualWidth || snakeX < 0 || snakeY < 0 || snakeY > board.ActualHeight) { // Game over timer.Stop(); } if (snakeX == food.getX() && snakeY == food.getY()) { snake.addBody(); food.newLocation(); } int snakeSize = snake.body.Count; for (int i = 0; i < snakeSize; i++) { int bodyX = snake.body[i].Item1; int bodyY = snake.body[i].Item2; if (snakeX == bodyX && snakeY == bodyY) { // Game over timer.Stop(); } } // Update the snake body starting with the tail for (int i = snakeSize - 1; i > 0; i--) { int forwardX = snake.body[i - 1].Item1; int forwardY = snake.body[i - 1].Item2; snake.body[i] = new Tuple <int, int>(forwardX, forwardY); } snake.body[0] = new Tuple <int, int>(snakeX, snakeY); // Update the snake head int newX = snakeX + directionX; int newY = snakeY + directionY; snake.setX(newX); snake.setY(newY); render(); }