var map = [
["Blank", "Blank", "Blank"],
["Blank", "Player", "Blank"],
["Blank", "Blank", "Blank"]
];
我在循环数组时遇到问题。这里主要是这个功能。假设在矩阵内将“播放器”向下移动一个。
当玩家位置在顶部时,我尝试“玩家”的所有内容总是会下降到最底行。我也遇到了奇怪的错误问题。有时我根本不会改变代码(或者至少我认为是这样)。然后代码将不会有这个问题,然后它将再次出现。现在我也无法让“玩家”向左移动到中间。我将在最后展示该功能的代码。感谢您的帮助。
function moveDown() {
for (y = map.length - 1; y >= 0 ; y--) {
for (x = map[y].length - 1; x >= 0; x--) {
var posX = map[y].indexOf("Player");
if (posX > -1 && y == 0) {
map[1].splice(posX, 1,"Player");
map[y].splice(posX, 1,"Blank");
return;
} else if (posX > -1 && y == 1) {
map[2].splice(posX, 1,"Player");
map[y].splice(posX, 1,"Blank");
return;
} else if (posX > -1 && y == 2) {
return;
}
}
}
}
这是我的所有代码。如果你没有时间,请不要全部阅读。我现在的主要问题是使用moveDown()函数。 (我认为)
var map = [
["Blank", "Blank", "Blank"],
["Blank", "Player", "Blank"],
["Blank", "Blank", "Blank"]
];
var run = true;
menu();
printLoop(map);
while (run) {
var input = prompt();
if (input == "left") {
movePlayer("left");
} else if (input == "right") {
movePlayer("right");
} else if (input == "up") {
movePlayer("up");
} else if (input == "down") {
movePlayer("down");
}
switch (input) {
case "menu":
menu(); break;
case "quit":
run = false; break;
}
menu();
printLoop(map);
}
function movePlayer(direction) {
for (y=0; y<map.length; y++) {
var playerPos = map[y].indexOf("Player");
if (movableRight(playerPos)) {
if (direction == "right") {
map[y].splice(playerPos, 1,"Blank");
map[y].splice(playerPos + 1, 1,"Player");
}
} else if (movableLeft(playerPos)) {
if (direction == "left") {
map[y].splice(playerPos, 1,"Blank");
map[y].splice(playerPos - 1, 1,"Player");
}
}
if (direction == "up") {
moveUp();
} else if (direction == "down") {
moveDown();
}
}
}
/*function getX(obj) {
for (x = 0; x < map.length; x++) {
for (y = 0; y < map[x].length; y++) {
if (map[x][y] == obj) {
return x;
}
}
}
}
function getY(obj) {
for (x = 0; x < map.length; x++) {
for (y = 0; y < map[x].length; y++) {
if (map[x][y] == obj) {
return y;
}
}
}
}*/
function movableLeft(pos) {
if (pos <= 0) {
console.log(pos + "<= 0");
return false;
} else if (pos > map.length - 1) {
console.log(pos + "> map.length - 1");
return false;
} else {
console.log(pos + "true");
return true;
}
}
function movableRight(pos) {
if (pos < 0) {
return false;
} else if (pos >= map.length - 1) {
return false;
} else {
return true;
}
}
function moveUp() {
for (y = 0; y < map.length; y++) {
for (x = 0; x < map[y].length; x++) {
var posX = map[y].indexOf("Player");
if(posX > -1) {
switch (y) {
case 1:
map[0].splice(posX, 1,"Player");
map[y].splice(posX, 1,"Blank");
break;
case 2:
map[1].splice(posX, 1,"Player");
map[y].splice(posX, 1,"Blank");
}
}
}
}
}
function moveDown() {
for (y = map.length - 1; y >= 0 ; y--) {
for (x = map[y].length - 1; x >= 0; x--) {
var posX = map[y].indexOf("Player");
if (posX > -1 && y == 0) {
map[1].splice(posX, 1,"Player");
map[y].splice(posX, 1,"Blank");
return;
} else if (posX > -1 && y == 1) {
map[2].splice(posX, 1,"Player");
map[y].splice(posX, 1,"Blank");
return;
} else if (posX > -1 && y == 2) {
return;
}
}
}
}
function printLoop(array) {
var line0 = "";
var line1 = "";
var line2 = "";
for (y = 0; y < array.length; y++) {
for (x = 0; x < array[y].length; x++) {
switch (y) {
case 0:
line0 += array[y][x] + ", "; break;
case 1:
line1 += array[y][x] + ", "; break;
case 2:
line2 += array[y][x] + ", "; break;
}
}
}
console.log(" ");
console.log(line0);
console.log(line1);
console.log(line2);
console.log(" ");
}
function menu() {
console.log("===============================");
console.log("up - down - right - left - quit");
console.log("===============================");
}
答案 0 :(得分:2)
除非我误解你的问题,否则你的事情过于复杂。这就是你所需要的:
function moveDown() {
for (y = 0; y < map.length; y++) {
var posX = map[y].indexOf("Player");
if (posX < 0) continue;
if ( y == map.length-1 ) break;
map[y][posX] = "Blank";
map[y+1][posX] = "Player";
break;
}
}
遍历顶级数组,直到找到包含播放器的行。然后,一旦你找到了玩家,如果它已经在底部你已经完成了。否则,使用"Blank"
覆盖它,并使用"Player"
覆盖下一行中的相应位置。