Когда я запускаю игру, то понимаю, что змейка просто проползает СКВОЗЬ яблоко. Яблоко не пропадает, змейка не увеличивается. У меня есть метод, который при "Яблоко не живое" создает новое и увеличивает змейку. Есть метод, который проверяет столкновение змейки с яблоком (т.е. яблоко съедено и стало не живым). Однако змейка НЕ ЕСТ ЯБЛОКИ.
У меня есть только 1 идея: я не нашел в программе, в какой момент у меня именно проверяется, что ЗМЕЙКА СТОЛКНУЛАСЬ С ЯБЛОКОМ. Но даже если я нашел проблему, то не знаю, как ее исправить - в каком месте нужно сделать, чтобы checkCollision(apple) проверяло столкновение с яблоком. ПОМОГИТЕ!!!
Методы OnTurn, createGame, drawScene, OnKeyPress и createNewApple класса SnakeGame:
@Override
public void onTurn(int step){
snake.move(apple);
if (!apple.isAlive) {
score += 5;
setScore(score);
turnDelay -= 10;
setTurnTimer(turnDelay);
createNewApple();
}
if (!snake.isAlive) {
gameOver();
}
if (snake.getLength() > GOAL) {
win();
}
drawScene();
}
// Метод, отвечающий за действия в начале игры
private void createGame () {
snake = new Snake(WIDTH/2, HEIGHT/2);
turnDelay = 300;
setTurnTimer(turnDelay);
createNewApple();
isGameStopped = false;
score = 0;
setScore(score);
drawScene();
}
// Метод, который отрисовывает игровое поле
private void drawScene () {
for (int x = 0; x < WIDTH; x++) {
for (int y = 0; y < HEIGHT; y++) { // Проходимся по всем клеткам поля
setCellValueEx(x, y, Color.LIGHTGREEN, ""); // Перекрашиваем в светло-зеленый
}
}
snake.draw(this);
apple.draw(this);
}
@Override
public void onKeyPress(Key key) {
switch (key) {
case DOWN:
snake.setDirection(Direction.DOWN);
break;
case UP:
snake.setDirection(Direction.UP);
break;
case RIGHT:
snake.setDirection(Direction.RIGHT);
break;
case LEFT:
snake.setDirection(Direction.LEFT);
break;
case SPACE:
if (isGameStopped)
createGame();
}
}
private void createNewApple() {
do {
apple = new Apple(getRandomNumber(WIDTH), getRandomNumber(HEIGHT));
} while (snake.checkCollision(apple));
}
Класс змейки:
package com.javarush.games.snake;
import java.util.ArrayList;
import java.util.List;
import com.javarush.engine.cell.*;
public class Snake {
private List<GameObject> snakeParts = new ArrayList<>();
private static final String HEAD_SIGN = "\uD83D\uDC7E";
private static final String BODY_SIGN = "\u26AB";
public boolean isAlive = true;
private Apple apple;
public Snake(int x, int y){
GameObject first = new GameObject(x, y);
GameObject second= new GameObject(x + 1, y);
GameObject third = new GameObject(x + 2, y);
snakeParts.add(first);
snakeParts.add(second);
snakeParts.add(third);
}
public void draw (Game game){
Color snakeColor;
if (isAlive) snakeColor = Color.GREEN;
else snakeColor = Color.RED;
game.setCellValueEx(snakeParts.get(0).x, snakeParts.get(0).y, Color.NONE, HEAD_SIGN, snakeColor, 75);
for (int i = 1; i != snakeParts.size(); i++) {
game.setCellValueEx(snakeParts.get(i).x, snakeParts.get(i).y, Color.NONE, BODY_SIGN, snakeColor, 75);
}
}
private Direction direction = Direction.LEFT;
public void setDirection(Direction direction) {
switch (this.direction) {
case LEFT:
case RIGHT:
if (snakeParts.get(0).x == snakeParts.get(1).x) return;
break;
case UP:
case DOWN:
if (snakeParts.get(0).y == snakeParts.get(1).y) return;
break;
}
this.direction = direction;
}
public void move(Apple apple) {
GameObject head = createNewHead();
if (checkCollision(head)) {
isAlive = false;
if (head.x < 0 && head.y < 0 || head.x >= SnakeGame.WIDTH && head.y >= SnakeGame.HEIGHT) {
isAlive = false;
}
}
else {
snakeParts.add(0, head);
removeTail();
}
}
public GameObject createNewHead () {
int HeadX = snakeParts.get(0).x, HeadY = snakeParts.get(0).y;
GameObject newElem;
if (direction == Direction.LEFT) {
newElem = new GameObject(HeadX-1, HeadY);
}
else if (direction == Direction.RIGHT) {
newElem = new GameObject(HeadX+1, HeadY);
}
else if (direction == Direction.DOWN) {
newElem = new GameObject(HeadX, HeadY+1);
}
else {
newElem = new GameObject(HeadX, HeadY-1);
}
return newElem;
}
public void removeTail () {
snakeParts.remove(snakeParts.size() - 1);
}
public boolean checkCollision(GameObject obj){
for(int i = 0; i < snakeParts.size(); i++){
if(snakeParts.get(i).x == obj.x && snakeParts.get(i).y == obj.y){
return true;
}
}
return false;
}
public int getLength() {
return snakeParts.size();
}
}
Класс яблока:
package com.javarush.games.snake;
import com.javarush.engine.cell.*;
public class Apple extends GameObject {
private static final String APPLE_SIGN = "\uD83C\uDF4E";
public boolean isAlive = true;
public Apple(int x, int y) {
super(x, y);
}
public void draw (Game game) {
game.setCellValueEx(x, y, Color.NONE, APPLE_SIGN, Color.GREEN, 75);
}
}
Очень жду вашей помощи. Заранее спасибо!!!