【发布时间】:2019-04-30 11:53:49
【问题描述】:
我正在尝试在有房间的地牢中找到一条路径,这些房间由门相连。 从一个房间到另一个房间总是只有一种方法。 有人可以帮我建造一条路径吗?我已经研究过路径搜索算法,但对于这个例子来说它们太复杂了,因为只有一个可能的路径,因此不需要给房间增加权重。
这是我正在使用的 Room 对象:
public Room(int id, Tile centerTile, ArrayList<Room> neighbours, ArrayList<Door> doors)
id = unique room id
centerTile = center of the room.
neighbours = list of neighbouring rooms
doors = list of doors leading to the neighbouring rooms
房间被存储在一个称为探索房间的 Arraylist 中。
这是我目前得到的,但它不起作用。
package pathing;
import room.Room;
import room.RoomUtils;
import java.util.ArrayList;
import java.util.Iterator;
public class Path {
public static ArrayList<Room> findPath(Room start, Room target) {
ArrayList<Room> frontier = new ArrayList<>();
ArrayList<Node> visited = new ArrayList<>();
ArrayList<Room> path = new ArrayList<>();
frontier.add(RoomUtils.getRoomById(start.getId()));
visited.add(new Node(RoomUtils.getRoomById(start.getId()), null));
if (start.equals(target)) {
path.add(RoomUtils.getRoomById(start.getId()));
} else {
Iterator frontierIterator = frontier.listIterator();
while (frontierIterator.hasNext()) {
Room front = (Room) frontierIterator.next();
front = RoomUtils.getRoomById(front.getId());
if (front.getNeighbours().size() > 0) {
for (Room room : front.getNeighbours()) {
if (room.equals(target)) {
frontier.clear();
visited.add(new Node(RoomUtils.getRoomById(room.getId()), RoomUtils.getRoomById(front.getId())));
frontierIterator = frontier.listIterator();
} else {
frontier.remove(RoomUtils.getRoomById(front.getId()));
visited.add(new Node(RoomUtils.getRoomById(room.getId()), RoomUtils.getRoomById(front.getId())));
frontierIterator = frontier.listIterator();
}
}
}
}
Node startNode = visited.get(0);
Node backtrackNode = getFrom(visited, target);
if (backtrackNode != null && backtrackNode.getCurrent() != null) {
path.add(backtrackNode.getCurrent());
}
while (backtrackNode != null && backtrackNode.getFrom() != null && !backtrackNode.equals(startNode)) {
path.add(backtrackNode.getFrom());
backtrackNode = getFrom(visited, backtrackNode.getFrom());
}
}
return path;
}
private static Node getFrom(ArrayList<Node> nodes, Room from) {
for (Node node : nodes) {
if (node.getCurrent().equals(from)) {
return node;
}
}
return null;
}
private static class Node {
private final Room current;
private final Room from;
public Node(Room current, Room from) {
this.current = current;
this.from = from;
}
public Room getCurrent() {
return current;
}
public Room getFrom() {
return from;
}
}
}
【问题讨论】:
-
我们需要您的
Room和Door课程代码。也欢迎您尝试解决此问题的代码。 -
每一种可能的方式都是一条路径。如果您找到您正在搜索的路径,您的判断标准是什么?
-
@michalk 我用我目前得到的代码更新了这个问题。
-
@Conffusion 我需要一条从房间 A 到房间 B 的路径,但 A 和 B 之间的每个房间都可以有房间,所以它并不总是一条笔直的路径
标签: java arraylist path-finding