簡體   English   中英

如何在火星探測器Kata中停止此循環?

[英]How do I stop this loop in Mars Rover Kata?

在此循環中,一旦遇到某種障礙(例如遇到障礙物),我將嘗試停止循環的運行。

這是有問題的代碼:

function moveForward(rover){
  console.log("moveForward was called");
  for(let k = 0; k < obstaclesList.length; k++){
  switch(rover.direction) {
    case "N": if(rover.y <= 0) { 
      console.log("You can't place the rover outside of the 10x10 grid!");
      } else if(rover.y === obstaclesList[k].j) {
      console.log("Obstacle was found!");
      return;
      } else {
      rover.y--;
      console.log("Rover moved up. The position is now " + rover.x + ", " + rover.y);                           
  }
      break;
    case "W": if(rover.x <= 0) { 
      console.log("You can't place the rover outside of the 10x10 grid!");
      } else if(rover.x === obstaclesList[k].i) {
      console.log("Obstacle was found!");
      return;
      } else {
      rover.x--;
      console.log("Rover moved left. The position is now " + rover.x + ", " + rover.y);
  }
      break;
    case "S": if(rover.y >= 10) { 
      console.log("You can't place the rover outside of the 10x10 grid!");
      } else if(rover.y === obstaclesList[k].j) {
      console.log("Obstacle was found!");
      return;
      } else {
      rover.y++;
      console.log("Rover moved down. The position is now " + rover.x + ", " + rover.y);
  }
      break;
    case "E": if(rover.x >= 10) { 
      console.log("You can't place the rover outside of the 10x10 grid!");
      } else if(rover.x === obstaclesList[k].i) {
      console.log("Obstacle was found!");
      return;
      } else {
      rover.x++;
      console.log("Rover moved right. The position is now " + rover.x + ", " + rover.y);         
  }
      break;
  }
  }
  roverMars.travelLog.push("x:" + rover.x + " y:" + rover.y);
}

我在console.log("Obstacle was found!");下的if-else語句中添加了一個return console.log("Obstacle was found!"); 但是它沒有用,它一直在執行我輸入的命令。 我試圖break到位的return ,但也不能工作。 救命?

這是其余的代碼:

 // Rover Object Goes Here // ====================== let roverMars = { direction: "N", x: 0, y: 0, travelLog: ["x:0 y:0"] }; let testBoard = [ [null,"Rock2",null,null,null,null,null,null,null,null], [null,null,null,null,null,null,null,null,null,null], [null,null,null,null,null,null,"Bottle",null,null,null], [null,null,null,null,null,null,null,null,null,null], [null,null,null,null,null,null,null,null,null,null], [null,null,null,"Rock",null,null,null,null,null,null], [null,null,null,null,null,null,null,null,null,null], [null,null,null,null,null,null,null,"Statue",null,null], [null,null,null,null,null,null,null,null,null,null], [null,null,null,null,null,null,null,null,null,null] ]; let obstaclesList = []; for(let i = 0; i < testBoard.length; i++){ for(let j = 0; j < testBoard[i].length; j++) { if(testBoard[i][j] !== null) { obstaclesList.push({i, j}); } } } //console.log(obstaclesList[0].j); // ====================== function turnLeft(rover){ console.log("turnLeft was called!"); switch(rover.direction) { case "N": rover.direction = "W"; console.log("Rover is now facing " + rover.direction); break; case "W": rover.direction = "S"; console.log("Rover is now facing " + rover.direction); break; case "S": rover.direction = "E"; console.log("Rover is now facing " + rover.direction); break; case "E": rover.direction = "N"; console.log("Rover is now facing " + rover.direction); break; } } function turnRight(rover){ console.log("turnRight was called!"); switch(rover.direction) { case "N": rover.direction = "E"; console.log("Rover is now facing " + rover.direction); break; case "W": rover.direction = "N"; console.log("Rover is now facing " + rover.direction); break; case "S": rover.direction = "W"; console.log("Rover is now facing " + rover.direction); break; case "E": rover.direction = "S"; console.log("Rover is now facing " + rover.direction); break; } } function moveForward(rover){ console.log("moveForward was called"); for(let k = 0; k < obstaclesList.length; k++){ switch(rover.direction) { case "N": if(rover.y <= 0) { console.log("You can't place the rover outside of the 10x10 grid!"); } else if(rover.y === obstaclesList[k].j) { console.log("Obstacle was found!"); return; } else { rover.y--; console.log("Rover moved up. The position is now " + rover.x + ", " + rover.y); } break; case "W": if(rover.x <= 0) { console.log("You can't place the rover outside of the 10x10 grid!"); } else if(rover.x === obstaclesList[k].i) { console.log("Obstacle was found!"); return; } else { rover.x--; console.log("Rover moved left. The position is now " + rover.x + ", " + rover.y); } break; case "S": if(rover.y >= 10) { console.log("You can't place the rover outside of the 10x10 grid!"); } else if(rover.y === obstaclesList[k].j) { console.log("Obstacle was found!"); return; } else { rover.y++; console.log("Rover moved down. The position is now " + rover.x + ", " + rover.y); } break; case "E": if(rover.x >= 10) { console.log("You can't place the rover outside of the 10x10 grid!"); } else if(rover.x === obstaclesList[k].i) { console.log("Obstacle was found!"); return; } else { rover.x++; console.log("Rover moved right. The position is now " + rover.x + ", " + rover.y); } break; } } roverMars.travelLog.push("x:" + rover.x + " y:" + rover.y); } function moveBackward(rover){ console.log("moveBackward was called"); switch(rover.direction) { case "N": if(rover.y >= 10) { console.log("You can't place the rover outside of the 10x10 grid!"); } else { rover.y++; console.log("Rover moved down. The position is now " + rover.x + ", " + rover.y); } break; case "W": if(rover.x >= 10) { console.log("You can't place the rover outside of the 10x10 grid!"); } else { rover.x++; console.log("Rover moved right. The position is now " + rover.x + ", " + rover.y); } break; case "S": if(rover.y <= 0) { console.log("You can't place the rover outside of the 10x10 grid!"); } else { rover.y--; console.log("Rover moved up. The position is now " + rover.x + ", " + rover.y); } break; case "E": if(rover.x <= 0) { console.log("You can't place the rover outside of the 10x10 grid!"); } else { rover.x--; console.log("Rover moved left. The position is now " + rover.x + ", " + rover.y); } break; } roverMars.travelLog.push("x:" + rover.x + " y:" + rover.y); } function commandments(roverlist) { let passRegex = /[lrfb]/g; var passResult = roverlist.match(passRegex); for(let i = 0; i < passResult.length; i++) { switch(roverlist[i]) { case "l": turnLeft(roverMars); break; case "r": turnRight(roverMars); break; case "f": moveForward(roverMars); break; case "b": moveBackward(roverMars); break; } } //console.log("passResult: " + passResult); } commandments("rfffr"); //turnLeft(roverMars); //turnRight(roverMars); //moveForward(roverMars); //console.log(roverMars.travelLog); 

在此鏈接上: https : //codepen.io/kikibres/pen/PMaoYO

命名循環並中斷循環

function moveForward(rover) {
  console.log("moveForward was called");
  obstacleListLoop: for (let k = 0; k < obstaclesList.length; k++) {
    switch (rover.direction) {
      case "N":
        if (rover.y <= 0) {
          console.log("You can't place the rover outside of the 10x10 grid!");
        } else if (rover.y === obstaclesList[k].j) {
          console.log("Obstacle was found!");
          break obstacleListLoop;
        } else {
          rover.y--;
          console.log(
            "Rover moved up. The position is now " + rover.x + ", " + rover.y
          );
        }
        break;
      case "W":
        if (rover.x <= 0) {
          console.log("You can't place the rover outside of the 10x10 grid!");
        } else if (rover.x === obstaclesList[k].i) {
          console.log("Obstacle was found!");
          break obstacleListLoop;
        } else {
          rover.x--;
          console.log(
            "Rover moved left. The position is now " + rover.x + ", " + rover.y
          );
        }
        break;
      case "S":
        if (rover.y >= 10) {
          console.log("You can't place the rover outside of the 10x10 grid!");
        } else if (rover.y === obstaclesList[k].j) {
          console.log("Obstacle was found!");
          break obstacleListLoop;
        } else {
          rover.y++;
          console.log(
            "Rover moved down. The position is now " + rover.x + ", " + rover.y
          );
        }
        break;
      case "E":
        if (rover.x >= 10) {
          console.log("You can't place the rover outside of the 10x10 grid!");
        } else if (rover.x === obstaclesList[k].i) {
          console.log("Obstacle was found!");
          break obstacleListLoop;
        } else {
          rover.x++;
          console.log(
            "Rover moved right. The position is now " + rover.x + ", " + rover.y
          );
        }
        break;
    }
  }
  roverMars.travelLog.push("x:" + rover.x + " y:" + rover.y);
}

但是,您的代碼中有錯誤(並且質量還有一定的提高空間)。 moveForward您遍歷障礙物,並為每個障礙物移動一次。 這是moveForward的版本,該版本可以移動一次並具有更好的可讀性,並且更接近於慣用的Javascript。 請注意,我們不再需要脫離嵌套循環。 還要注意, Array.some第一次中斷該方法對某個元素的值為true時(即我們的第一次碰撞)。 我建議您以相同的樣式重寫其他三個move函數,甚至更好地將它們合並為一個函數。 祝好運!

 const roverMars = { direction: "N", x: 1, y: 2, travelLog: ["x:0 y:0"] }; const testBoard = [ [null, "Rock2", null, null, null, null, null, null, null, null], [null, null, null, null, null, null, null, null, null, null], [null, null, null, null, null, null, "Bottle", null, null, null], [null, null, null, null, null, null, null, null, null, null], [null, null, null, null, null, null, null, null, null, null], [null, null, null, "Rock", null, null, null, null, null, null], [null, null, null, null, null, null, null, null, null, null], [null, null, null, null, null, null, null, "Statue", null, null], [null, null, null, null, null, null, null, null, null, null], [null, null, null, null, null, null, null, null, null, null] ]; const obstacleList = testBoard.reduce( (acc, row, y) => acc.concat( row .map((column, x) => (column === null ? null : x)) .filter(x => x !== null) .map(x => ({ x, y })) ), [] ); console.log(`Obstacles: ${obstacleList.map(({ x, y }) => `x: ${x} y: ${y}`).join(', ')}`) function moveForward(rover) { const crashedWithObstacle = ({ x: roverX, y: roverY }) => ({ x, y }) => roverX === x && roverY === y; const newPosition = { x: rover.x, y: rover.y }; let moveDirection; switch (rover.direction) { case "N": newPosition.y--; moveDirection = "up"; break; case "E": newPosition.x++; moveDirection = "right"; break; case "S": newPosition.y++; moveDirection = "down"; break; case "W": newPosition.x--; moveDirection = "left"; break; } if ( newPosition.x < 0 || newPosition.x > 9 || newPosition.y < 0 || newPosition.y > 9 ) { console.log("You can't place the rover outside of the 10x10 grid!"); } else if (obstacleList.some(crashedWithObstacle(newPosition))) { console.log("Obstacle was found!"); } else { rover.x = newPosition.x; rover.y = newPosition.y; console.log( `Rover moved ${moveDirection}. The position is now ${rover.x}, ${rover.y}` ); } roverMars.travelLog.push(`x:${rover.x} y:${rover.y}`); } moveForward(roverMars); moveForward(roverMars); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM