Пример #1
0
  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;
  }
Пример #2
0
  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;
  }