Столкновение на основе 2D-сетки - PullRequest
0 голосов
/ 24 января 2020

Я пишу этот код, связанный с движущимся внутри сетки ровером.

В сетке есть препятствия и другой ровер. Если ровер идет против препятствия, я уже написал условие в функции moveForward (rover, rover2) (и moveBackward), чтобы он go вернулся в предыдущую позицию.

У меня есть проблема в случае столкновение между 2 роверами. Вот код:

  let rover= {
  direction: "N",
  x: 0,
  y: 0,
  travelLog: ["x=0, y=0"],
};

let rover2= {
  direction: "N",
  x: 4,
  y: 0,
  travelLog: ["x=4, y=0"],
};

let grid = [
  [null,null,null,null,null,null,null,null,null,null,],
  [null,null,"obs",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,null,],
  [null,null,null,null,null,null,null,null,null,null,],
  [null,null,null,null,null,"obs",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,null,null,null,null,null,null,null,"obs",],
  [null,null,null,null,null,null,null,null,null,null,],];

 var tempX = rover.x;
  var tempY = rover.y;

let obsList= [];  
function obstacle (grid) {
for (i=0; i< grid.length; i++) {
    for(let j = 0; j < grid[i].length; j++) {
      if(grid[i][j] !== null) {
        obsList.push("x=" + i + " y=" + j);
      }
    }
  }
 //console.log(obsList);
}
obstacle (grid);


function turnLeft(rover,rover2) {
    switch (rover.direction) {
    case "N":
    rover.direction = "W";
      break;
      case "W":
       rover.direction = "S";
      break;
      case "S":
      rover.direction = "E";
      break;
       case "E":
        rover.direction = "N";
      break;      
  }
   console.log(`turnLeft was called!Rover direction is:${rover.direction}`); 
   }

 function turnRight(rover, rover2){
  switch (rover.direction) {
    case "N":
     rover.direction = "E";
      break;
      case "E":
       rover.direction = "S";
      break;
    case "S":
     rover.direction = "W";
      break;
       case "W":
        rover.direction = "N";
      break;      
  }
  console.log(`turnRight was called!Rover direction is:${rover.direction}`);
   }

function moveForward(rover, rover2) {
  console.log("move Forward was called");
  var tempX = rover.x;
  var tempY = rover.y;
  
  switch(rover.direction) {
   case "N":
  if (rover.y> 0) {
    rover.y--;
  } else {
console.log("Can't get out of the grid");
  }
  break;
   case  "W":
  if (rover.x> 0) {
    rover.x--;
  } else {
console.log("Can't get out of the grid");
  }
  break;
  case "E":
  if (rover.x <9) {
    rover.x++;
    } else {
console.log("Can't get out of the grid");
    }  
 break;
case "S":
  if (rover.y < 9) {
    rover.y++;
  } else {
console.log("Can't get out of the grid");
  }
break;
}


if(collide(rover, rover2)) {
  rover.x = tempX;
  rover.y = tempY; 
  } else {
    rover.travelLog.push("x=" +rover.x + " y=" +rover.y);
  }

for(a=0; a<rover.travelLog.length; a++) {
  for(o=0; o<obsList.length; o++) {
    if(rover.travelLog[a] == obsList[o]) {
      console.log("Obstacle!");
      rover.travelLog.splice(rover.travelLog.length-1,1);
      if (rover.x == obsList.x) {
        rover.x++;
      } else {
        rover.y++;
    }
  }
}
}
}

 function moveBackward(rover, rover2) { 
  console.log("move Backward was called");
   switch(rover.direction) {
    case "N":
      if (rover.y < 9) {
        rover.y ++;
      } else {
        console.log("You can't get out of the grid");
      }
      break;
    case "E":
      if (rover.x > 0) {
        rover.x --;
      } else {
        console.log("You can't get out of the grid");
      }
      break;
    case "S":
      if (rover.y > 0) {
        rover.y --;
      } else {
        console.log("You can't get out of the grid");
      }
      break;
    case "W":
      if (rover.x < 9) {
        rover.x ++;
      } else {
        console.log("You can't get out of the grid");
      break;
      }
   }
    rover.travelLog.push("x=" +rover.x + " y=" +rover.y);



for(a=0; a<rover.travelLog.length; a++) {
  for(b=0; b<obsList.length; b++) {
    if(rover.travelLog[a] == obsList[b]) {
      console.log("Obstacle!");
      rover.travelLog.splice(rover.travelLog.length-1,1);
      if (rover.x == obsList.x) {
        rover.x--;
      } else {
        rover.y--;
    }
  }
}
} 
}
function command(rover, rover2, orders){

  for (let i = 0; i < orders.length; i++){
    let order = orders[i];
    switch(order){
      case "l": // left
        turnLeft(rover);
        break;
      case "r": // right
        turnRight(rover);
        break;  
      case "f": // forward
        moveForward(rover, rover2);
        break; 
      case "b": // backward
        moveBackward(rover, rover2);
        break;
      default:
      console.log("Incorrect input! Try with: l,r,f or b!!")
    }
  } 
}
command(rover, rover2, "rf");
console.log(rover.travelLog);

command(rover2, rover, "lffflff");
console.log(rover2.travelLog);


function collide(rover, rover2) {
if (rover.x == rover2.x && rover.y == rover2.y){
console.log("collision detected!");
rover.travelLog.splice(rover.travelLog.length-1,1);
}
}
//collide(rover, rover2);

Проблема в том, что, если я применяю:

rover.travelLog.splice(rover.travelLog.length-1,1);

к:

function collide(rover, rover2) {
if (rover.x == rover2.x && rover.y == rover2.y){
console.log("collision detected!");
rover.travelLog.splice(rover.travelLog.length-1,1);
}
}

, это фактически обрезает второй последний положение, а не последняя позиция ровера. Я полагаю, что это происходит, потому что я считаю временным:

 var tempX = rover.x;
  var tempY = rover.y;

, когда я вызываю функцию столкновения (rover, rover2) в moveForward (rover, rover2).

У вас есть какие-либо предложения / обходные пути, чтобы вырезать только последнюю позицию rover.travelLog, каковы координаты, где ровер сталкивается с другим? Спасибо за любую помощь !!

...