У меня было несколько дней с этой проблемой. Я искал в этом форуме и в google решение без везения. Моя проблема: я не могу создать рабочий алгоритм BFS для управления поведением призрака pacman. Я думаю, что я игнорирую что-то в коде. я вставить код здесь, если вы можете помочь мне, вы будете благодарить :) pacman это номер 2, и призрак номер 3.BFS для призрака pacman
Queue<Tile> path = new LinkedList<>();
Tile start = new Tile(canvas.g1.x, canvas.g1.y, 3);
Tile end = new Tile(canvas.pacman.x, canvas.pacman.y, 2);
start.distance = 1;
path.add(start);
while (!path.isEmpty()) {
Tile current = path.remove();
System.out.println(path.size());
canvas.walls[current.y][current.x] = 0;
if (canvas.walls[current.y][current.x] == canvas.walls[end.y][end.x]) {
end = current;
System.out.println("pacman found");
break;
}
ArrayList<Tile> list = adyacent(current);
for (Tile c : list) {
if (c.distance == 0) {
c.distance = current.distance + 1;
path.add(c);
canvas.walls[c.y][c.x] = 20;
for (Tile v : path) {
System.out.println("x: " + v.x + "/y: " + v.y + "/
distance: " + v.distance);
}
}
}
}
int dist = end.distance;
System.out.println("Recolection ended, size: " + dist);
Класс Tile():
public class Tile {
public int x;
public int y;
public int distance;
public int personaje;
public Tile(int x, int y, int personaje) {
this.x = x;
this.y = y;
this.personaje = personaje;
distance = 0;
}
}
и метод adyacent():
в этом методе, номер я проверить, являются те, с стеной (каждый с Diferent чертежом))
public ArrayList<Tile> adyacent(Tile c) {
ArrayList<Tile> surrounding = new ArrayList<>();
int ant;
ant = canvas.walls[c.y][c.x + 1];
if ((ant != 7) && (ant != 8) && (ant != 9) && (ant != 11)
&& (ant != 12) && (ant != 13) && (ant != 14) && (ant != 15)
&& (ant != 16)) {
surrounding.add(new Tile(c.x + 1, c.y, 3));
}
ant = canvas.walls[c.y][c.x - 1];
if ((ant != 7) && (ant != 8) && (ant != 9) && (ant != 11)
&& (ant != 12) && (ant != 13) && (ant != 14) && (ant != 15)
&& (ant != 16)) {
surrounding.add(new Tile(c.x - 1, c.y, 3));
}
ant = canvas.walls[c.y + 1][c.x];
if ((ant != 7) && (ant != 8) && (ant != 9) && (ant != 11)
&& (ant != 12) && (ant != 13) && (ant != 14) && (ant != 15)
&& (ant != 16)) {
surrounding.add(new Tile(c.x, c.y + 1, 3));
}
ant = canvas.walls[c.y - 1][c.x];
if ((ant != 7) && (ant != 8) && (ant != 9) && (ant != 11)
&& (ant != 12) && (ant != 13) && (ant != 14) && (ant != 15)
&& (ant != 16)) {
surrounding.add(new Tile(c.x, c.y - 1, 3));
}
return surrounding;
}
Что я заметил, так это то, что он никогда не достигает System.out, в котором я возвращаю размер пути. Кроме того, где я вижу размер очереди, это кажется правильным, но System.out, в котором я вижу «x» и «y» и «distance», становится больше каждый раз, намного больше.
Я установил, что проверенные плитки меняют цвет, меняя число, которое у меня есть в массиве: 0 - пол, 20 - прозрачный зеленый. И он остается в центре, и попрошайки работают медленнее и медленнее.
забудьте сказать, что он никогда не находит pacman :( спасибо!
, чтобы понять, как это работает, а что означает 7 8 13, мы, вероятно, должны увидеть, что он работает – gpasch
Эти числа - это разные плитки стены, я написал это как раз перед этим, но я вижу его не очень понятно, извините :( –