Javascript 贪吃蛇游戏(食物生成位置)

标签 javascript html canvas

假设我有一个 20 乘 20 的“网格”。我随机生成食物的方式是使用以下公式:

Math.floor(Math.random() * ((max - min) / 20) + 1) + 20 * min;

这基本上确保了食物会在一个网格单元内整齐地生成。

我想避免在蛇的 body 上产卵。我还没有找到在保持分布式随机性的同时做到这一点的最佳方法。

不太有效的解决方案:

我见过一些人这样做,但它不起作用,因为它不能保证食物永远不会在蛇身上生成,它只是降低了这种可能性。 getRandomPoint() 可能仍然会在蛇上得到一个随机点。

for (let i = 0; i < snake.length; i++) {
    if (foodPosition.x === snake[i].x && foodPosition.y === snake[i].y) {
        foodPosition.x = getRandomPoint();
        foodPosition.y = getRandomPoint();
    }
}

下一个也不起作用,因为食物仍然可以在蛇的任何尚未检查的细胞上生成。例如,当 i = 0 时,它仅检查 foodPosition.x 和 foodPosition.y 是否等于 Snake[0].x 和 Snake[0].y。在循环的迭代中,当 i = 0 时,食物仍然可以在 Snake[2].x、snake[2].y 占据的单元格上生成(我认为?)。

for (let i = 0; i < snake.length; i++) {
    while (foodPosition.x === snake[i].x && foodPosition.y === snake[i].y) {
        foodPosition.x = getRandomPoint();
        foodPosition.y = getRandomPoint();
    }
}

我还尝试过其他一些方法,但我就到此为止。做我想做的事情的好方法是什么?

最佳答案

我会生成一个允许食物产卵的可能位置列表。类似于所有位置的集合减去蛇 body 位置的集合。

我在 JavaScript 和 p5.js 中对扫雷做了类似的事情。两个地雷不能占据同一个单元。当我生成地雷时,我从可能位置列表中删除了它们的位置。

let numRows = 20;
let numColumns = 20;

let possibleFoodLocations = [];

for (let row = 0; row < numRows; row++) {
    for (let column = 0; column < numColumns; column++) {
        let isLocationValid = snake.every(bodyPart => {
            return row !== bodyPart.y || column !== bodyPart.x;
        });

        if (isLocationValid) {
            possibleFoodLocations.push({ x: column, y: row });
        }
    }
}

请注意,这将需要 numRows * numColumns * Snake.length * 2 操作,因此当这些值中的任何一个很大时,重复执行将会变得低效。我认为最好的方法是当这些值很大时将其结合起来,当这些值很小时选择一个随机点。

关于Javascript 贪吃蛇游戏(食物生成位置),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47103792/

相关文章:

javascript - 从不同域中的父窗口获取 iframe 中的 javascript 变量

javascript - Bootstrap4 .col 始终采用 100% 并垂直堆叠( Bootstrap 网格不工作)

javascript - 为了获得良好的性能,是否需要在 HTML5 中清除 Canvas [ 2D Context ]?

node.js - 在 ubuntu 14 上使用 npm 安装 Canvas

html - 不同操作系统/不同机器的字体不一致

javascript - 为什么html5 canvas标签用pi值画圆?

javascript - `$scope` 数据未渲染

javascript - 禁用文本框更改事件

c# - 如何使 JQuery 屏蔽输入插件在 asp.net Ajax 更新面板中的 AsyncPostback 之后工作?

javascript - HTML 按钮 onclick 函数无法使用 jQuery 变量作为参数