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)) {