我正在编写与在网格内移动的流动站相关的代码。
在网格中有障碍物和另一个漫游车。 如果流动站遇到障碍,我已经在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的最后一个位置,即漫游者与另一个碰撞的位置坐标?谢谢您的帮助!