基于2D网格的碰撞

时间:2020-01-24 18:29:51

标签: javascript multidimensional-array collision-detection

我正在编写与在网格内移动的流动站相关的代码。

在网格中有障碍物和另一个漫游车。 如果流动站遇到障碍,我已经在moveForward(rover,rover2)(和moveBackward)函数中编写了一个条件,使其返回到先前的位置。

两个流动车之间发生碰撞时,我有一个问题。这是代码:

  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;

当我在moveForward(rover,rover2)中调用函数collide(rover,rover2)时。

您是否有任何建议/解决方法,以便仅剪切rover.travelLog的最后一个位置,即漫游者与另一个碰撞的位置坐标?谢谢您的帮助!

0 个答案:

没有答案
相关问题