Pastikan labirin peta rumah dengan lift dapat dipecahkan?

13

Dalam permainan saya, kami melihat lantai sebuah rumah dari samping, dan pahlawan dapat mengambil lift - lift dapat naik (ke lift berikutnya ke atas), atau ke bawah (ke lift berikutnya ke bawah), tergantung pada panah sebagai ditampilkan, dan selalu ada sepasang tepat dua lift yang terhubung. Itulah satu-satunya cara pahlawan dapat bergerak secara vertikal, meskipun ia dapat bergerak secara bebas secara horizontal. Peta rumah adalah kisi 11x5 acak dengan item yang berbeda, dan dinding yang tidak dapat dilepas ke paling kiri, paling kanan, dan kadang-kadang di salah satu dari dua posisi tengah:

mengangkat contoh

Pertanyaan saya: Bagaimana saya bisa memastikan peta selalu acak namun selalu dapat dipecahkan dan bahwa pahlawan, mulai dari sisi kiri lantai bawah, selalu dapat meninggalkannya melalui lift yang mengarah ke atas di lantai atas?

Untuk apa nilainya saya menggunakan bahasa Lua untuk pengembangan. Terima kasih banyak!

Philipp Lenssen
sumber

Jawaban:

14

Yang ingin Anda lakukan adalah membuat Grafik sehingga setiap node adalah posisi lift, dan ujung-ujungnya berarti Anda dapat berjalan / mengangkat di sana. Setelah Anda membuat grafik, Anda dapat menggunakan dfs / bfs untuk melihat apakah Anda bisa mendapatkan dari titik awal ke titik akhir.

Dengan menggunakan Anda contoh di atas saya membuat gambar tentang bagaimana grafik akan terlihat. Lingkaran hijau berarti ada lift di sana, dan garis hijau berarti Anda dapat melakukan perjalanan dari node ke node.

node

Luis Estrada
sumber
Terima kasih, itu sangat berguna! Seharusnya saya lebih menekankan dalam pertanyaan saya bahwa peta juga perlu dibuat di tempat pertama. Apa yang sekarang saya pikirkan adalah jika itu mungkin tidak lebih mudah - daripada menghasilkan kombinasi lift / dinding sepenuhnya acak berulang-ulang dan memeriksa solvabilitas mereka - untuk memiliki langkah algoritma melalui rumah, seperti pahlawan akan, dan dengan cara ini menghasilkan lift dan pintu acak (dengan mengambil jarak lift acak dan belokan kiri-kanan, serta menambahkan dinding, misalnya). Seperti di "Jalan ke kanan 0, 4 atau 8 putaran; buat lift ke atas, naik dari 1 ke 4 lantai ..."
Philipp Lenssen
@ PhilippLenssen Itulah dasarnya pendekatan "pencarian mendalam-pertama acak" untuk membuat labirin pada grafik.
Kevin Reid
5

Perbedaan antara apa yang Anda miliki dan labirin normal hanyalah bahwa ia memiliki koneksi yang tidak berbatasan secara vertikal. Saya pikir apa yang harus Anda perhatikan adalah algoritma pembuatan labirin berbasis grafik . Anda hanya perlu memiliki satu set lebih besar "kamar yang berdekatan" atau "dinding yang mungkin" daripada labirin 2D biasa, di mana setiap pasangan sel-sel lantai-grid-aligned yang belum memiliki lift intervensi berdampingan. Anda bisa memodelkan ini sebagai grafik di mana menambahkan tepi lift tertentu secara tidak sengaja menghapus tepi lift lain yang mungkin; beberapa algoritma mungkin bingung dengan ini, tetapi tidak yang lain.

Kevin Reid
sumber