如何防止两个画布对象出现在同一位置

时间:2018-06-24 23:31:36

标签: javascript oop canvas

我正在构建一个Snake街机游戏,尽管该游戏正常运行,但我仍在尝试进行调整,以使苹果永远不会出现在与蛇群之一相同的位置(对于那些不喜欢蛇的人)不知道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));
  };
};

在我看来,这一切都很正确,但是我仍然是一个新手,还是OOP的新手。我不确定是否正确编写了Apple.prototype.move方法,以便它永远不会将苹果放在蛇的身体的某个部位。发生这种情况的可能性很低,因此为了确定我将不得不坐下来玩几个小时。任何输入将不胜感激。

注意:使用以下代码将游戏区域划分为由10x10像素区域组成的行和列的网格系统:

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

谢谢。

1 个答案:

答案 0 :(得分:1)

在检查苹果位置是否与蛇形段冲突时,您在Apple.prototype.move函数中似乎有一个错误。

您正在计算苹果位置(randomColrandomRow),但是在检查每个蛇形段时不使用这些值。

此外,如果您希望遇到冲突,请致电this.move()。但是,在该函数返回之后,您将继续完成上一个for循环中所有剩余的迭代。

可以通过以下更改来解决这些问题:

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