Masalah yang harus dipecahkan: Hasilkan peta ruang bawah tanah 2D acak untuk game berbasis ubin tempat semua kamar terhubung.
Saya mencari solusi yang lebih baik daripada yang saya miliki saat ini.
Solusi saya saat ini adalah saya menjalankan dua algoritma. Yang pertama menghasilkan ruang bawah tanah dengan kamar-kamarnya. Yang kedua pastikan bahwa semua kamar terhubung. Saya ingin tahu solus apa yang mungkin ada. Lebih cepat dan / atau lebih mudah dll. Kecepatan sebenarnya bukan masalah, tetapi jika kecepatan dapat diperoleh tanpa biaya nyata, yah, itu adalah hal yang baik. Lebih penting adalah bahwa saya, dan orang lain yang membaca, dapat belajar berbagai cara untuk mendekati dan menyelesaikan masalah.
Di bawah ini adalah implementasi saya saat ini. Kamar saat ini tidak memiliki jalan keluar atau keluar dalam arah 2, 3 atau 4 mana pun.
Menghasilkan ruang bawah tanah
Pengaturan: Atur ruang saat ini ke ruang kiri atas.
- Dapatkan tipe kamar yang valid untuk kamar (di mana tipe kamar yang valid adalah tipe tanpa pintu keluar dari ruang bawah tanah dan yang memiliki pintu keluar yang cocok dengan pintu keluar kamar di atas dan ruangan di sebelah kiri. Hanya perlu memeriksa di atas dan ke tersisa karena langkah 2 di bawah).
- Letakkan ruangan dan maju satu langkah koordinat x. Jika koordinat x melebihi lebar dungeon, atur koordinat x ke 0 dan naikkan satu koordinat y langkah. Jika koordinat y melebihi ketinggian penjara bawah tanah, kita selesai.
- Ulangi dari # 1.
Saya kemudian memeriksa untuk melihat apakah semua kamar terhubung Jika mereka tidak semua terhubung saya menjalankan algoritma kedua itu, dalam cara non-seksi tapi pasti cukup baik dalam hal tata letak ruang bawah tanah, melewati kamar-kamar dan mengubahnya sehingga semua berakhir terhubung.
Memeriksa untuk melihat apakah semua kamar terhubung
Setup: Buat peta 2D bilangan bulat yang mewakili jalur dan inisialisasi entri ke nilai "belum diproses" (belum dilalui), -1. Menyetel integer indeks jalur awal yang melacak jalur saat ini ke 1. Atur ruang saat ini ke ruang kiri atas dengan menambahkannya ke tumpukan kamar untuk diperiksa.
- Jika tumpukan berisi kamar untuk diperiksa, letakan setel indeks jalur ruangan ke indeks jalur saat ini. Jika tumpukan tidak berisi ruangan apa pun, tambah indeks jalur dan coba dapatkan kamar dengan memajukan kolom demi kolom, baris demi baris, hingga kami mendapatkan kamar yang belum diproses. Jika tidak ada kamar dapat ditemukan, kita selesai.
- Periksa untuk melihat apakah ruangan memiliki jalan keluar ke kiri. Jika telah menambahkan ruang kiri ke tumpukan jika belum ada di sana.
- Ulangi langkah 2 untuk arah bawah, kanan dan atas (karena kami menggunakan tumpukan yang berarti kamar dilintasi dalam urutan searah jarum jam, dimulai dengan arah atas).
- Ulangi dari langkah 1.
- Jika jumlah indeks jalur lebih besar dari satu, ada kamar yang terputus.
Jika ada kamar yang terputus maka saya mengelompokkan kamar berdasarkan indeks jalurnya, dapatkan indeks jalur terbesar dan menghubungkan semua kamar lain ke kamar tersebut. Ini adalah pekerjaan yang sedang berjalan, tetapi rencana saya (saat ini, "brutal") adalah untuk melewati setiap kamar dalam grup kamar (kecuali yang pertama) memeriksa untuk melihat apakah ada jalur horizontal atau vertikal ke grup kamar biggeset, dan jika demikian, buat jalur horizontal / vertikal di sana dengan menyuntikkan / memperbarui kamar di antara. Bilas dan ulangi. Jelek, ya, tapi itu adalah sesuatu yang tidak akan terlihat dalam hal pola visual sehingga bekerja dalam pengertian itu.