Saya mencoba membuat grafik yang diarahkan secara acak untuk tujuan membuat game puzzle yang mirip dengan teka-teki luncur es dari Pokemon.
Ini pada dasarnya adalah apa yang ingin saya hasilkan secara acak: http://bulbanews.bulbagarden.net/wiki/Crunching_the_numbers:_Graph_theory .
Saya harus dapat membatasi ukuran grafik dalam dimensi x dan y. Dalam contoh yang diberikan dalam tautan, itu akan dibatasi ke kisi 8x4.
Masalah yang saya hadapi bukanlah menghasilkan grafik secara acak, tetapi menghasilkan grafik secara acak, yang dapat saya petakan dengan benar dalam ruang 2d, karena saya membutuhkan sesuatu (seperti batu) di sisi yang berlawanan dari sebuah simpul, untuk membuatnya secara visual masuk akal ketika Anda berhenti meluncur. Masalah dengan ini adalah bahwa kadang-kadang batu berakhir di jalur antara dua node lain atau mungkin pada node lain itu sendiri, yang menyebabkan seluruh grafik menjadi rusak.
Setelah membahas masalah tersebut dengan beberapa orang yang saya kenal, kami sampai pada beberapa kesimpulan yang mungkin mengarah pada solusi.
- Termasuk hambatan di grid sebagai bagian dari grafik saat membangunnya.
- Mulailah dengan kisi yang terisi penuh dan gambarkan jalur acak dan hapus blok yang akan membuat jalur itu berfungsi.
Masalahnya kemudian menjadi mencari tahu yang mana yang akan dihapus untuk menghindari memperkenalkan jalur tambahan yang lebih pendek. Kami juga berpikir algoritma pemrograman dinamis mungkin bermanfaat, meskipun tidak ada di antara kita yang terlalu terampil membuat algoritma pemrograman dinamis dari nol. Setiap ide atau referensi tentang apa masalah ini secara resmi disebut (jika ini merupakan masalah grafik resmi) akan sangat membantu.
Berikut adalah beberapa contoh dari apa yang telah saya capai sejauh ini dengan hanya menempatkan blok secara acak dan menghasilkan grafik navigasi dari awal / akhir yang dipilih. Idenya (seperti yang dijelaskan dalam tautan sebelumnya) adalah Anda mulai dari S hijau dan ingin sampai ke F. hijau. Anda melakukan ini dengan bergerak ke atas / bawah / kiri / kanan dan Anda terus bergerak ke arah yang dipilih sampai Anda menekan dinding. Dalam gambar-gambar ini, abu-abu adalah dinding, putih adalah lantai, dan garis ungu adalah panjang minimum dari awal hingga akhir, dan garis-garis hitam dan titik-titik abu-abu mewakili jalur yang mungkin.
Berikut adalah beberapa contoh grafik yang dihasilkan secara acak:
Berikut adalah beberapa contoh grafik yang dihasilkan secara acak (atau tweak tangan):
Saya juga sepertinya memperhatikan yang lebih menantang ketika benar-benar memainkan ini sebagai puzzle adalah puzzle yang memiliki banyak node tingkat tinggi di sepanjang jalur minimum.
sumber
Jawaban:
properti yang lebih maju:
contoh:
contoh menggabungkan ubin:
Anda mungkin menyukai game Tsuro , ia menggunakan ubin untuk menghasilkan papan acak.
sumber
Mungkin reverse engineering bisa membantu Anda jika Anda siap untuk itu.
Jika ada satu dan hanya satu solusi untuk setiap masalah, Anda mungkin dapat membuat grafik berdasarkan jawaban unik. Ini tidak mengharuskan Anda untuk melakukan pemrograman dinamis atau bahkan melewatkan brute force dan memilih generasi yang metodis.
Anda dapat melakukannya dengan:
Meskipun Anda perlu perangkat cara sesuai dengan kompleksitas masalah dan ukuran masalah yang akan menghasilkan pertanyaan ini untuk Anda. Jangan hanya melakukan kekerasan. Cobalah beberapa algoritma acak sebagai gantinya. Ini bisa membantu Anda.
sumber
Bagaimana dengan pendekatan lain? Mulai dengan labirin kosong dan tambahkan blok seperti ini:
Sentuhan akhir: temukan rute terpendek dengan algoritma yang Anda berikan. Catat semua sel yang digunakan dan mulai mengisi sisanya secara acak, setiap kali memastikan rute terpendek tidak menjadi lebih pendek.
Ada peringatan di langkah kedua, ketika Anda tidak dapat menempatkan blok terakhir sehingga tidak melewati jalur yang digunakan, tapi saya melihat dua solusi untuk ini: pindahkan blok akhir sebelumnya atau membatalkan beberapa langkah dan coba sekali lagi.
Dan pemikiran lain untuk panjang acak langkah geser - Anda mungkin ingin memilihnya sehingga blok yang ditempatkan sebelumnya digunakan kembali, selama jalurnya tidak tumpang tindih.
sumber