【发布时间】:2019-06-18 11:33:08
【问题描述】:
我正在开发基于文本的漫游车模拟器,目标是让 2 个不同的漫游车获得命令(turnLeft、turnRight、moveForward、moveBackwards)并在 10x10 网格中移动。此外,我想记录每个漫游者的路径,这就是我遇到麻烦的地方。我用两个键 rover1 和 rover2 创建了一个对象 travelLog。每个键的值是一个初始化数组[]。但是,当我尝试向前移动时,我收到错误“TypeError: Cannot read property 'push' of undefined”。
每个命令都接受一个参数(在这种情况下,流动站的名称:rover1 或 rover2)。由于登录发生在 moveForward 和 moveBackwards 函数中,我写了这个:
const rover1 = {
direction: 'N',
x : 0,
y : 0,
};
const rover2 = {
direction: 'N',
x : 5,
y : 7,
};
let travelLog = {
rover1: [],
rover2: [],
}
const obstacles = {
x: [0,1,2,2,4,6,7],
y: [6,0,2,7,4,3,8],
};
// TURNLEFT FUNCTION
function turnLeft(rover){
console.log("turnLeft was called!");
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;
}
};
// TURN RIGHT FUNCTION
function turnRight(rover){
console.log("turnRight was called!");
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;
}
};
// FUNCTION TO CHECK IF THERE IS ANY OBSTACLE AHEAD.
function checkObstacle (rover,otherRover){
for (let i = 0; i < obstacles.x.length; i++){
if(obstacles.x[i] === rover.x && obstacles.y[i] === rover.y){
console.log('An obstacle was found! Order aborted!');
return true;
} else if(otherRover.x=== rover.x && otherRover.y === rover.y){
console.log('Another rover found in your path! Order aborted!');
return true;
} else {
return false;
}
}
};
// MOVE FORWARD FUNCTION
function moveForward (rover) {
console.log("moveForward was called");
travelLog[rover].push(['[x' + rover.x +',' + 'y' + rover.y + ']' ]);
if(rover.direction === 'N' && rover.y > 0 ){ // NORTHBOUND MOVEMENT
rover.y--;
if(checkObstacle()){
rover.y++;
};
} else if(rover.direction === 'W' && rover.x > 0){ // WESTBOUND MOVEMENT
rover.x--;
if(checkObstacle()){
rover.x++;
};
} else if(rover.direction === 'S' && rover.y < 9 ){ // SOUTHBOUND MOVEMENT
rover.y++;
if(checkObstacle()){
rover.y--;
};
} else if(rover.direction ==='E' && rover.x <9){ //EASTBOUND MOVEMENT
rover.x++;
if(checkObstacle()){
rover.x--;
};
} else {
console.log('Your order tried to put the rover off the grid! Order cancelled!');
};
console.log(`The new position of the rover is heading ${rover.direction} row ${rover.x} column ${rover.y}`);
}
我希望将流动站的新位置记录到对象 travelLog 中,在其相应的键(rover1 或 rover2)中。
【问题讨论】:
-
你没有告诉我们什么调用
moveForward(),因为传递的参数将决定是否可以找到对象的属性 -
如果我理解你的话,传递的参数将是 rover1 或 rover2。
-
不一定...如果您传递
moveForward(rover1),那么您传递的是对象rover而不是字符串。您无法使用对象获取对象的属性。如果您通过moveForward("rover1"),那么它可能会工作......或查看seelts答案,通过向对象添加name属性来获得更好的解决方案 -
你的代码有一个奇怪的地方是 moveForward 函数。为什么不使用开关盒?您还检查障碍物,如果是,则执行相反的操作。没有障碍就不能行动吗?
-
我正在通过 moverForward(rover1)。对不起,如果我不能很好地解释自己,谢谢你的帮助。
标签: javascript arrays object