我正在制作一个机器人,在迷宫中鳍闪光灯并将其带回原位。当我测试我的代码时,机器人会找到闪光灯,然后卡住而不会回到它的起始位置。我已经编写了其他方法来使程序更容易,它们包括检查机器人是否已访问下一个交叉点的方法,另一种计算下一个大道和街道的方法,以及一个使机器人转向指定方向的方法。 这是完整的代码:
import becker.robots.Robot;
import becker.robots.City;
import becker.robots.Direction;
import becker.robots.Intersection;
import java.util.ArrayList;
/* This program has a robot search a maze for a flasher, picks the flasher up, and
returns back to it's starting position. If no flasher is found, it will return back
to the starting position as well.
*/
public class RobotUtils{
Robot meow;
/* This method says what avenue the robot will be on if it decides to move
one intersection in the direction it's facing
*/
public static int calculateNextAvenue(Robot meow){
int avenue = meow.getAvenue();
Direction direction = meow.getDirection();
//Changes the value of the avenue the robot is on when facing west
if (direction == Direction.WEST){
return avenue - 1;
}
//Changes the value of the avenue the robot is on when facing east
if (direction == Direction.EAST){
return avenue + 1;
}
//If facing north or south, doesn't change the value
else{
return avenue;
}
}
/* This method says what street the robot will be on if it decides to move
one intersection in the direction it's facing
*/
public static int calculateNextStreet(Robot meow){
int street = meow.getStreet();
Direction direction = meow.getDirection();
//Changes the value of the avenue the robot is on when facing south
if (direction == Direction.SOUTH){
street = street + 1;
}
//Changes the value of the avenue the robot is on when facing north
if (direction == Direction.NORTH){
street = street - 1;
}
//If facing east or west, doesn't change the value
return street;
}
//This method turns the robot to face a certain specified direction
public static void turnRobot(Robot meow, Direction face){
Direction direction = meow.getDirection();
while (direction != face){
meow.turnLeft();
direction = meow.getDirection();
}
}
//This method checks a list to see if a certain intersection is in the list
public static boolean isVisited(ArrayList<Intersection> search , int
street, int avenue){
Intersection inter;
boolean found = false;
int i = 0;
while (found == false && i < search.size()){
inter = search.get(i);
if (inter.getAvenue()== avenue &&
inter.getStreet() == street){
found = true;
}
i++;
}
return found;
}
//This method makes the robot search a maze, find a flasher if there is
//one, pick the flasher up, and return back to its starting position.
public static void retrieveLight(Robot meow){
ArrayList<Direction> path;
path = new ArrayList<Direction>();
ArrayList<Intersection> intersections;
intersections = new ArrayList<Intersection>();
boolean searched = false;
boolean flasher = false;
int street = meow.getStreet();
int avenue = meow.getAvenue();
Intersection current = meow.getIntersection();
//Adds the current intersection the robot is on to a list that
//keeps track of where the robot has been
while (searched == false && flasher == false){
Direction d = meow.getDirection();
if (isVisited(intersections, street, avenue) == false){
intersections.add(current);
}
//Robot picks flasher up
if (meow.canPickThing()){
flasher = true;
meow.pickThing();
}
//Makes the robot move towards intersections it hasn't visited yet
//to search the maze to find the flasher
else {
//Robot moves if an adjacent intersection hasn't been visited yet
if (!isVisited(intersections, calculateNextStreet(meow),
calculateNextAvenue(meow)) && meow.frontIsClear()){
path.add(d);
turnRobot(meow, d);
meow.move();
}
//If path is blocked or intersection has been visited,
//robot turns to look for new direction to move in
if (isVisited(intersections, calculateNextStreet(meow),
calculateNextAvenue(meow)) || !meow.frontIsClear()){
meow.turnLeft();
}
//If the robot has searched the entire maze without
//finding flasher, exits the loop
else if (path.isEmpty()){
searched = true;
}
//If all intersections around robot have been visited/are blocked,
//robot back tracks to find a new intersection to visit
else {
int last = path.lastIndexOf(d);
path.remove(last);
turnRobot(meow, d.opposite());
meow.move();
}
}
}
//Have robot go back to start by backtracking all intersections it
//has visited
int i = path.size();
while (i >= 0 && isVisited(intersections,
calculateNextStreet(meow),calculateNextAvenue(meow))){
Direction d = meow.getDirection();
int last = path.lastIndexOf(d);
path.remove(last);
turnRobot(meow, d.opposite());
meow.move();
i--;
}
}
}
我认为代码的主要问题在于本节:
//Makes the robot move towards intersections it hasn't visited
//to search the maze to find the flasher
else {
//Robot moves if an adjacent intersection hasn't been visited yet
if (!isVisited(intersections, calculateNextStreet(meow),
calculateNextAvenue(meow)) && meow.frontIsClear()){
path.add(d);
turnRobot(meow, d);
meow.move();
}
//If path is blocked or intersection has been visited,
//robot turns to look for new direction to move in
if (isVisited(intersections, calculateNextStreet(meow),
calculateNextAvenue(meow)) || !meow.frontIsClear()){
meow.turnLeft();
}
//If the robot has searched the entire maze without
//finding flasher, exits the loop
else if (path.isEmpty()){
searched = true
}
//If all intersections around robot have been visited/are blocked,
//robot back tracks to find a new intersection to visit
else {
int last = path.lastIndexOf(d);
path.remove(last);
turnRobot(meow, d.opposite());
meow.move();
}
}
}
//Have robot go back to start by backtracking all intersections it
//has visited
int i = path.size();
while (i >= 0 && isVisited(intersections,
calculateNextStreet(meow),calculateNextAvenue(meow))){
Direction d = meow.getDirection();
int last = path.lastIndexOf(d);
path.remove(last);
turnRobot(meow, d.opposite());
meow.move();
i--;
}
}
}
如果你能帮助我,我会非常感激。
编辑我的机器人一旦发现闪光灯,任何想法,现在都会撞到墙上。我应该如何终止最后一次while循环?
答案 0 :(得分:1)
你应该创建一个堆叠在迷宫中遍历的所有点,然后一旦到达目的地,“弹出”每个点从堆栈中。这将有效地让您回溯您的步骤,并且很容易编码到您当前的代码中。它比使用ArrayList ...
容易得多