为什么此coodinate-returning函数有时会返回超出其预期限制的坐标?

时间:2019-05-26 11:11:13

标签: javascript arrays random

作为练习,我将克隆经典的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;
}

1 个答案:

答案 0 :(得分: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]);
        }