Pendekatan saya adalah sedikit memori intensif (dari perspektif era Pacman), tetapi Anda hanya perlu menghitung sekali dan itu bekerja untuk setiap desain level (termasuk melompat).
Label Node Sekali
Saat Anda pertama kali memuat level, beri label semua node lair monster 0 (mewakili jarak dari lair). Lanjutkan ke pelabelan yang terhubung node 1, node terhubung ke mereka 2, dan seterusnya, sampai semua node diberi label. (catatan: ini bahkan berfungsi jika sarang memiliki beberapa pintu masuk)
Saya berasumsi Anda sudah memiliki objek yang mewakili setiap node dan koneksi ke tetangga mereka. Kode palsu mungkin terlihat seperti ini:
public void fillMap(List<Node> nodes) { // call passing lairNodes
int i = 0;
while(nodes.count > 0) {
// Label with distance from lair
nodes.labelAll(i++);
// Find connected unlabelled nodes
nodes = nodes
.flatMap(n -> n.neighbours)
.filter(!n.isDistanceAssigned());
}
}
Mata Pindah ke Tetangga dengan Label Jarak Terendah
Setelah semua node diberi label, perutean mata adalah sepele ... pilih saja node tetangga dengan label jarak terendah (catatan: jika beberapa node memiliki jarak yang sama, tidak masalah yang dipilih). Kode palsu:
public Node moveEyes(final Node current) {
return current.neighbours.min((n1, n2) -> n1.distance - n2.distance);
}
Contoh Berlabel Sepenuhnya