我正在制作一个可以在迷宫中搜寻闪光器并将其恢复到原始位置的机器人。当我测试代码时,机器人会找到闪光器,但随后会卡住并且不会返回到其起始位置。我编写了其他方法来简化程序,其中包括检查机器人是否已探访下一个路口的方法,计算下一条大道和街道的另一种方法以及使机器人转弯的方法是指定的方向。
这是完整的代码:
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循环?
最佳答案
您应该创建一个在迷宫中遍历的所有点的堆栈,然后在到达目的地后,将每个点从堆栈中“弹出”。这将有效地让您追溯您的步骤,并且很容易将代码编写为当前代码。这比使用ArrayList要容易得多...
关于java - 机器人不会回到以前的位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4234980/