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