Как предотвратить появление двух объектов холста в одном месте - PullRequest
0 голосов
/ 25 июня 2018

Я строю аркадную игру Snake, и хотя игра запущена и работает хорошо, я пытаюсь настроить игру так, чтобы яблоко никогда не появлялось в том же месте, что и один из сегментов змеи (для тех, кто неНе знаю, Снейк, это классическая аркадная игра, в которой змея скользит по экрану, поедая яблоки, которые появляются случайным образом, стараясь не врезаться в себя или в стену и не увеличиваться в длине каждый раз, когда съедает яблоко).Вот код ниже, который перемещает яблоко по экрану:

Apple.prototype.move = function() {
  var randomCol = Math.floor(Math.random()*(widthInBlocks-2)) +1;
  var randomRow = Math.floor(Math.random()*(heightInBlocks-2)) +1;

  this.position = new Block(randomCol, randomRow);

  for (i = 0; i < Snake.segments; i++) {
    if (this.position === Snake.segments[i].col && Snake.segments[i].row) {
      this.move();
    };
  };
}

Конструктор для змеи выглядит следующим образом:

var Snake = function() {
  this.segments = [
    new Block(7, 5),
    new Block(6, 5),
    new Block(5, 5)
  ];
  this.direction = "right";
  this.nextDirection = "right";
};

А код для рисования змеи выглядит следующим образом:

//function to toggle the colour of the snake's segments
function alternateColour(i) {
  var colours = ["limegreen", "yellow"];
  if (i % 2 === 0) {
    return colours[0];
  } else {
    return colours[1];
  };
};

//draw snake method
Snake.prototype.draw = function() {
  this.segments[0].drawSquare("blue"); //snake head will always be blue
  for (i = 1; i < this.segments.length; i++) {
      this.segments[i].drawSquare(alternateColour(i));
  };
};

Для меня все это выглядит правильно, но я все еще большой новичок и все еще новичок в ООП.Я не уверен, правильно ли я написал метод Apple.prototype.move, чтобы он никогда не поместил яблоко в часть сегмента тела змеи.Вероятность того, что это произойдет, невелика, поэтому, чтобы знать наверняка, мне пришлось бы часами сидеть и играть в игру.Будем благодарны за любые входные данные.

Примечание: игровая зона разделена на сетку из строк и столбцов, состоящих из 10х10 пикселей, с использованием следующего кода:

var blockSize = 10;
var widthInBlocks = width/blockSize;
var heightInBlocks = height/blockSize;

Спасибовы.

1 Ответ

0 голосов
/ 25 июня 2018

Похоже, у вас есть ошибка в функции Apple.prototype.move при проверке, совпадает ли позиция яблока с сегментом змеи.

Вы вычисляете позицию яблока (randomCol, randomRow), но затем не использовать эти значения при проверке каждого сегмента змеи.

Кроме того, вы вызываете this.move(), когда ожидаете столкновения.Но после того, как эта функция вернется, вы продолжите завершать все оставшиеся итерации в предыдущем цикле for.

Эти проблемы могут быть решены с помощью следующих изменений:

for (i = 0; i < Snake.segments; i++) {
    if (randomCol === Snake.segments[i].col && randomRow === Snake.segments[i].row) {
        return this.move();
    };
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...