Я работаю над текстовым симулятором ровера, и цель состоит в том, чтобы иметь 2 разных ровера, которые получают команды (turnLeft, turnRight, moveForward, moveBackwards) и перемещаются в сетке 10x10.Кроме того, я хочу записать путь каждого ровера, и вот тут у меня возникли некоторые проблемы.Я создал объект travelLog с двумя ключами, rover1 и rover2.Значением каждого ключа является инициализированный массив [].Однако, когда я пытаюсь переместиться вперед, я получаю сообщение об ошибке «TypeError: Невозможно прочитать свойство« push »из 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).