javascript - 为什么包含在我的 javascript 蛇游戏中不工作

标签 javascript arrays array.includes

我是一名 javascripot 初学者,正在学习 CSS 和 HTML。和许多人一样,我正在通过创建贪吃蛇游戏进行练习,但我没有遵循教程。所以我知道我的代码可能很糟糕并且没有遵循良好的实践,但我这样做只是为了好玩。

let playerXpos =0;
let playerYpos =0;

let coordArray = [[playerXpos, playerYpos]];

//player movement
document.addEventListener('keydown', (e) => playerMove(e.key));
function playerMove (key) {
    clearInterval(playerRightInterval);
    clearInterval(playerLeftInterval);
    clearInterval(playerUpInterval);
    clearInterval(playerDownInterval);
    switch(key) {
        case "ArrowRight":
            playerRightInterval = setInterval(function () {
                if (playerXpos > 67.5) {deathFunction();} else {
                    playerXpos += 1.5;
                    playerGrowth();
                }
            }, 90);
        break;     
        case "ArrowLeft":
            playerLeftInterval = setInterval(function () {
                if (playerXpos <= 0) {deathFunction();} else {
                    playerXpos -= 1.5;
                    playerGrowth();
                }
            }, 90);
        break;
        case "ArrowDown":
            playerDownInterval = setInterval(function () {
                if (playerYpos > 57.5) {deathFunction();} else {
                    playerYpos += 1.5;
                    playerGrowth();
                }
            }, 90);
            break;
        case "ArrowUp":
            playerUpInterval = setInterval(function () {
                if (playerYpos <= 0) {deathFunction();} else {
                    playerYpos -= 1.5;
                    playerGrowth();
                }
            }, 90);
            break;
    }
}

//player growing & more moving
function playerGrowth () {
    if (coordArray.includes([playerXpos, playerYpos])) {
        console.log("ya dead lol");
    }
    coordArray.unshift([playerXpos, playerYpos]);
    if (playerXpos == appleX && playerYpos == appleY) {
        playerArray.push(document.createElement("div"));
        playerArray[playerArray.length-1].className = "player";
        wholeSnake.appendChild(playerArray[playerArray.length-1]);
        playerArray[playerArray.length-1].style.backgroundColor = colourArray[(playerArray.length -1)-(Math.floor((playerArray.length -1)/6)*6)];
        appleMove();
    } else {
        coordArray.pop();
    }
    for (let i=0; i < coordArray.length; i++) {
        playerArray[i].style.marginLeft = coordArray[i][0] + "vh";
        playerArray[i].style.marginTop = coordArray[i][1] + "vh";
    }
}

我将“蛇 block ”的位置存储在一个数组中,该数组使用 .unshift 和 .pop 来更新蛇移动时的位置。我想检查蛇是否击中自己,我可以检查坐标数组是否包含蛇的下一个位置,如果包含,则运行死亡函数,但由于某种原因它无法工作。

我正在谈论的那句话就在评论标题“玩家成长和更加感动”下方

我被这个问题困扰了好久了,请帮忙!

最佳答案

if (coordArray.includes([playerXpos,playerYpos])) {

在 JavaScript 中,变量基本上可以保存两种类型的值。其中一些,如数字和字符串,被称为“基元”。其他 - 对象、函数和数组 - 是引用值。这里的关键区别在于,如果您尝试比较两个引用值,即使它们包含相同的数据,它们也不会看起来相同。

3 === 3; // true
[3] === [3]; // false

将数组和对象视为存储一个值可能会有所帮助,该值是内存中保存数据的位置的标签。

因此,在您的情况下, includes 不起作用,因为您正在构建一个新数组,尽管它包含与您正在查找的数据相同的数据,但实际上它并不是一样的。

为了解决这个问题,您本质上需要编写自己的函数来确定您的坐标信息是否相同。您可以使用不同的数组函数 find ,执行此操作。

例如:

if (coordArray.find(
  (coords) => 
    coords[0] === playerXpos &&
    coords[1] === playerYpos
) {

这样,您的代码将比较 x 和 y 坐标(它们是数字,因此可以直接比较),而不是比较两个数组,因此它应该能够找到您需要的内容。

find 函数与 includes 略有不同,因为它不返回 truefalse ,而是返回它找到的元素(如果找到)或 undefined。在这种情况下,这在您的 if 条件下也同样有效,因为如果它找到了 truthy 的内容。 ,而未定义falsy .


编辑: 或者,您可以使用 some方法,其工作方式与 find 类似,但返回 truefalse

关于javascript - 为什么包含在我的 javascript 蛇游戏中不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76633923/

相关文章:

javascript - 输入的隐藏值不适用于 VUE JS

c++ - C++ 中的函数指针数组

javascript - 如果我只在数组中设置一个高索引,它会浪费内存吗?

java - 试图在数组中找到最小值

javascript - 为什么 localStorage 不保存我的变量?

javascript - 许多js XMLHttpRequest同时运行导致其中一个返回空字符串?

javascript - 实现 Redux-Persist 时使用 AnyAction react Redux Typescript 错误