【问题标题】:Why is this coodinate-returning function sometimes returning a coordinate outside its supposed restrictions?为什么这个坐标返回函数有时会返回超出其假定限制的坐标?
【发布时间】:2019-05-26 11:11:13
【问题描述】:

作为练习,我正在构建经典 Nibbles/Snake 游戏的克隆。

游戏区域由一个二维数组(行和列)组成,玩家蛇由另一个二维数组组成,其中包含蛇当前占据的游戏区域中每个单元格的坐标。

然后我有一个函数来创建蛇应该吃的苹果。此函数返回一个简单的数组,其中包含一个 x 坐标和一个 y 坐标,用于指定放置苹果的游戏区域单元格。当然,这个单元格不应该是玩家蛇在创建苹果时占用的单元格之一。

但是,我构建的函数有时会在玩家蛇当前占用的单元格中创建一个苹果。

谁能发现这个错误?

这是相关代码:

const rows = 20;
const cols = 26;

const cells = createCells(rows, cols);
let player = [[1,1], [1,2], [1,3], [1,4]];
let apple = createApple(cells, player);

function createCells(rows, cols) {
    let cells = new Array(rows);
    for (let r = 0; r < cells.length; r++) {
        cells[r] = new Array(cols);
    }
    return cells;
}

function createApple(cells, player) {
    let positions = new Array();
    for (let r = 0; r < cells.length; r++) {
        for (let c = 0; c < cells[r].length; c++) {
            for (let p = 0; p < player.length; p++) {
                if (!(player[p][0] === r && player[p][1] === c)) {
                    positions.push([r, c]);
                }
            }
        }
    }
    let random = Math.floor(Math.random() * positions.length - 1);
    let apple = positions[random];
    return apple;
}

【问题讨论】:

    标签: javascript arrays random


    【解决方案1】:

    错误在这部分代码中:

            for (let p = 0; p < player.length; p++) {
                if (!(player[p][0] === r && player[p][1] === c)) {
                    positions.push([r, c]);
                }
            }
    

    即使是被蛇占据的单元格,你也要推动它们 (player.length - 1) 次。因此,对于 player.length 为 4 的初始设置,您将每个未占用的单元格推 4 次,每个已占用的单元格推 3 次。您现在看到错误了吗?

    您应该在代码中进行哪些更改?对于给定的单元格 (r,c),您必须使用玩家的所有单元格检查它,并且仅在与其中任何一个单元格都不匹配时将其推送到位置。花一些时间,尝试自己编写代码,不要在下面看到更多内容。

            bool free=true;
            for (let p = 0; p < player.length; p++) {
                if (player[p][0] === r && player[p][1] === c) {
                    free = false;
                    break;
                }
            }
            if (free) {
                positions.push([r, c]);
            }
    

    【讨论】:

    • 非常感谢@Turbo。我仍然真的真的不知道我的代码是如何产生你所说的结果的,但我想我必须一直盯着它直到我得到它(或者直到我发疯)。
    • 尝试添加调试语句,尤其是在将单元格推送到位置数组的地方。它应该有助于理解代码的行为方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    相关资源
    最近更新 更多