Добрый день! Перепробовал все уже возможные и невозможные способы. Просмотрел все варианты, размещенные в сети. Но задачу так и не принимают. Может кто подскажет?
package com.javarush.task.task23.task2312;

import java.util.ArrayList;

/**
 * Класс змея
 */
public class Snake {
    //Направление движения змеи
    private SnakeDirection direction;
    //Состояние - жива змея или нет.
    private boolean isAlive;
    //Список кусочков змеи.
    private ArrayList<SnakeSection> sections;

    public Snake(int x, int y) {
        sections = new ArrayList<SnakeSection>();
        sections.add(new SnakeSection(x, y));
        isAlive = true;
    }

    public boolean isAlive() {
        return isAlive;
    }

    public int getX() {
        return sections.get(0).getX();
    }

    public int getY() {
        return sections.get(0).getY();
    }

    public SnakeDirection getDirection() {
        return direction;
    }

    public void setDirection(SnakeDirection direction) {
        this.direction = direction;
    }

    public ArrayList<SnakeSection> getSections() {
        return this.sections;
    }

    /**
     * Метод перемещает змею на один ход.
     * Направление перемещения задано переменной direction.
     */
    public void move() {
        if (!isAlive) return;

        if (direction == SnakeDirection.UP)
            move(0, -1);
        else if (direction == SnakeDirection.RIGHT)
            move(1, 0);
        else if (direction == SnakeDirection.DOWN)
            move(0, 1);
        else if (direction == SnakeDirection.LEFT)
            move(-1, 0);
    }

    /**
     * Метод перемещает змею в соседнюю клетку.
     * Координаты клетки заданы относительно текущей головы с помощью переменных (dx, dy).
     */
    private void move(int dx, int dy) {
        //Создаем новую голову - новый "кусочек змеи".
        //SnakeSection head = sections.get(0);
        //head = new SnakeSection(head.getX() + dx, head.getY() + dy);

        //Проверяем - не вылезла ли голова за границу комнаты
        checkBorders(new SnakeSection(sections.get(0).getX() + dx, sections.get(0).getY() + dy));
        //if (!isAlive) return;

        //Проверяем - не пересекает ли змея  саму себя
        checkBody(new SnakeSection(sections.get(0).getX() + dx, sections.get(0).getY() + dy));
        //if (!isAlive) return;

        //Проверяем - не съела ли змея мышь.
        //Mouse mouse = Room.game.getMouse();
        sections.add(0, new SnakeSection(sections.get(0).getX() + dx, sections.get(0).getY() + dy));                  //Добавили новую голову
        if (sections.get(0).getX() == Room.game.getMouse().getX() && sections.get(0).getY() == Room.game.getMouse().getY()) //съела
        {
            //sections.add(0, head);                  //Добавили новую голову
            Room.game.eatMouse();                   //Хвот не удаляем, но создаем новую мышь.
        } else //просто движется
        {
            //sections.add(0, head);                  //добавили новую голову
            sections.remove(sections.size() - 1);   //удалили последний элемент с хвоста
        }
    }

    /**
     * Метод проверяет - находится ли новая голова в пределах комнаты
     */
    private void checkBorders(SnakeSection head) {
        if ((head.getX() < 0 || head.getX() >= Room.game.getWidth()) || head.getY() < 0 || head.getY() >= Room.game.getHeight()) {
            isAlive = false;
        }
    }

    /**
     * Метод проверяет - не совпадает ли голова с каким-нибудь участком тела змеи.
     */
    private void checkBody(SnakeSection head) {
        if (sections.contains(head)) {
            isAlive = false;
        }
    }
}