public boolean move(Direction d) { // Логика перемещения проста. // Берём последний сегмент змеи, меняем его координаты // и ставим в голову змеи в соответствии с направлением. // Так же, если последний сегмент оказывается "покормленным", // тогда нужно добавить в конец новый сегмент. Segment first = this.segments.getFirst(); Segment last = this.segments.pollLast(); // Если покормлен, забываем об этом и добавляем в конец новый сегмент if (last.feeded) { last.feeded = false; this.segments.addLast(new Segment(last.x, last.y)); } else { // Если не покормлен, то его больше там нет this.occupied[last.x][last.y] = false; } last.x = first.x; last.y = first.y; last.move(d); boolean isOccupied = this.occupied[last.x][last.y]; this.occupied[last.x][last.y] = true; this.segments.addFirst(last); return isOccupied; }
public Snake(int x, int y, Direction d) { // Сегменты змеи this.segments = new ArrayDeque<Segment>(); this.segments.add(new Segment(x, y)); Segment tail = new Segment(x, y); tail.move(d); this.segments.addLast(tail); // Будем хранить массив, в котором будем запоминать, // занята ли эта клетка сегментом змеи. // Он нужен для проверки, не врезалась ли змея в саму себя. this.occupied = new boolean[28][22]; this.occupied[x][y] = true; }