2013-04-03 106 views
0
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("==============================="); 
} 

回答

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"覆盖下一行中的相应位置。

+0

问题仍然存在。但这绝对是更简单... –

+1

我不确定那是你的意思。无论你在哪里开始玩家,这都可以正常工作。如果您遇到特定的错误,请在http://jsfiddle.net上重新制作,然后放下链接。 – nbrooks

+0

我从来没有听说过jsfiddle.net,感谢您的链接。我只是想通了,但是...我有一个for循环的movePlayer函数,我不需要。但是,谢谢你,你做得更干净,现在可以工作了! –