Валидатор не принимает 3 пункт Проверка isAlive() не нужна по логике: в методе run (Room class) есть цикл while (isAlive()), т.е. если checkBorders / checkBody выдаст isAlive = false, то цикл сразу же прекратится, и последующий код не будет выполняться. На форуме прочитал, что не нужно использовать Snake getX() / Snake getY() , т.к. из-за этого не проходит тестирование.
Змейка(17)

Теперь закончим класс Snake.



Змея состоит из кусочков. Давай каждый ход просто добавлять один кусочек со стороны головы,

а самый последний — удалять. Тогда получится, что змея ползет.

Добавлять кусочек нужно рядом с текущей головой (кусочком номер 0).

С какой стороны добавлять зависит от direction (UP, DOWN, LEFT, RIGHT).



Подсказка:

а) Как добавить кусочек змеи в начало списка sections?

sections.add(0, new_section);

б) А как удалить последний?

sections.remove(sections.size()-1);



Необходимо реализовать метод move(int dx, int dy):

а) проверить, не вылезла ли она за границу комнаты (если да, то змея умирает)

б) проверить, не совпадает ли она с уже существующими кусочками змеи (если да, то змея умирает)

в) добавить голову к змее (со стороны головы) и удалить последний кусочек из хвоста.

г) вызвать метод eatMouse у статического объекта game класса Room, если координаты мыши совпадают с координатами головы змеи.

д) если змея поймала мышь (координаты головы совпадают с координатами мыши), то удалять кусок из хвоста не надо.
public void move(int dx, int dy) {
        SnakeSection head = new SnakeSection(getSections().get(0).getX() + dx, getSections().get(0).getY() + dy);

        checkBorders(head);
        checkBody(head);
        sections.add(0, head);

        if (head.getX() == Room.game.getMouse().getX() && head.getY() == Room.game.getMouse().getY()) {
            Room.game.eatMouse();
        } else {
            sections.remove(sections.size() - 1);
        }
    }