Змейка на Android: Пошаговое руководство по созданию классической игры - страница 9

Шрифт
Интервал


private int score; private int width;

private int height; private boolean isGameOver;

public SnakeGame(int width, int height)

{ this.width = width;

this.height = height;

this.snake = new Snake();

this.food = new Food();

this.score = 0;

this.isGameOver = false;

spawnFood();

} public void spawnFood()

{ food.spawn(width, height, snake.getBody());

} public void update(Direction direction)

{ if (!isGameOver) {

snake.move(direction);

checkCollision(); } }

private void checkCollision() {

if (snake.hasCollidedWithWall(width, height) || snake.hasCollidedWithItself())

{ isGameOver = true;

} else if (snake.headEquals(food.getPosition())) {

score++;

snake.grow();

spawnFood(); } } public boolean isGameOver() { return isGameOver; } public int getScore() {

return score; } }

В этом классе мы объявляем ряд переменных, которые будут использоваться для отслеживания состояния игры, включая ширину и высоту игрового поля, объект змейки, еду и текущий счет. Как только класс инициализируется, мы предоставляем ему размер игрового экрана и создаем начальные состояния, включая саму змейку и еду.

Метод spawnFood отвечает за генерацию еды на случайной позиции, которая не пересекается с телом змейки. Для этого мы можем использовать метод, определенный в классе Food, который принимает размеры игрового поля и текущее состояние змейки, чтобы избежать наложений. Метод update является сердцем игровой логики.

Он принимает направление изменения движения змейки и загружает новую позицию в каждом кадре игрового цикла. В методе checkCollision происходит проверка на столкновения со стенами поля или самим собой. Если змейка сталкивается с целью, увеличивается счет и вызывается генерация новой еды.

Теперь давайте более подробно рассмотрим методы hasCollidedWithWall, hasCollidedWithItself и headEquals, которые смогут помочь в проверке столкновений.

В классе Snake, метод hasCollidedWithWall может выглядеть следующим образом:

public boolean hasCollidedWithWall(int width, int height) {

Point head = body.get(0);

return head.x < 0 || head.x >= width || head.y < 0 || head.y >= height; }

А метод hasCollidedWithItself будет проверять соприкосновение головы с телом змейки: public boolean hasCollidedWithItself()

{ Point head = body.get(0);

for (int i = 1; i < body.size(); i++) {

if (body.get(i).equals(head)) {