Merintis jalan dengan beberapa jalur acak dalam game Tower Defense

8

Saya memikirkan pathfinding acak untuk game Tower Defense saya. A * tidak akan berfungsi untuk puposis saya, karena saya secara spesifik memerlukan penelusuran jalur acak .

Bayangkan sebuah peta dengan rute, titik awal dan tujuan. Saya memiliki beberapa rute, yang semuanya mengarah dari titik awal ke tujuan, dengan satu atau lain cara. Itu bisa terlihat seperti ini:


Two branch-path shaped like a square

Deskripsi warna: merah - titik awal; tujuan hitam; rute abu-abu; white - free space
(Angka-angka tersebut digunakan dalam teks sebagai referensi untuk beberapa ubin)


Saya pertama kali berpikir tentang hanya menghitung titik jalan berikutnya secara acak, ketika suatu entitas melewati ubin. Tetapi itu tidak akan berhasil. Ketika suatu entitas melewati ubin 1 itu bisa naik atau turun. Ketika datang ke 2 itu bisa turun / naik (relatif terhadap posisi itu) atau kanan.
Jika ia pergi ke bawah / atas itu akan pergi untuk ubin 1, yang berarti bahwa ia pergi ke belakang. Buruk...

Saya benar-benar ingin membuatnya dinamis , tetapi saya tidak tahu apa yang bisa saya lakukan sekarang. Adakah yang punya ide atau pengalaman dalam hal ini?

Marco
sumber
Sebagian besar permainan menara pertahanan yang saya sadari membuat hal-hal merayapi jalur terpendek ke pintu keluar dan memblokir setiap gerakan yang akan membatalkan dari keluar ... Bagian yang sulit di sini adalah memastikan untuk menghitung ulang jalur ketika pemain mengubah tata letak menara
James
@James: Maksud Anda mendapatkan jalur terpendek, yaitu A *, atau maksud Anda merangkak melalui titik arah untuk mendapatkan arah yang valid untuk setiap ubin. Saya juga tidak perlu menghitung ulang jalan karena cara saya sudah diperbaiki dan pemain tidak dapat menempatkan menara di sana. Tetapi secara umum Anda benar.
Marco

Jawaban:

4

Instead of having all adjacent squares as possible next waypoints, only include squares that do not lead back to the beginning and randomly pick from those. If you did this, it would be impossible to go backwards because going back is not an option.

This is a directed graph problem with each waypoint as a vertex, and each path an edge. You just need to limit the number of cycles, perhaps removing them entirely.

Chewy Gumball
sumber
That was my second thought. I have to think about the implementation of "the way leads back now" thing. Limiting the number of tiles to pass would not be dynamic and flexible.
Marco
You can solve this by building a directed graph and keeping track of the visited/unvisited tiles. Then just make sure you search unvisited tiles only. That should build you a graph that represent your paths. Now if you hit a tile where a note has several outgoing edges (in the graph that was previously built), just pick one randomly.
bummzack
I meant to write "node" not "note" in my previous comment. Sorry.
bummzack
@bummzack: No, that wouldn't work. Imagine a map with 3 paths. If I search for unvisited nodes, I could also simply go to the beginning. I think about implementing a algorithm which crawls through the map and randomly chooses between the directions. When it realizes that it goes back to the beginning this part is unusable. I could do this with a counter. When the distance to the start gets smaller it goes back. This would be parsed once on map creation in development process, so there are no performance issues.
Marco
@ Marsco Mengapa itu tidak berhasil? Jika Anda menerapkan pencarian pertama yang luas dari node awal Anda, Anda tidak akan mengunjungi node sebelumnya lagi. Anda tidak akan pernah kembali ke awal, karena ini seperti banjir.
bummzack
7

Anda mengatakan acak, tetapi seberapa banyak keacakan yang Anda inginkan? Apakah boleh jika musuh memilih jalur 10 kali lebih lama dari yang terpendek? Apakah boleh jika musuh memasuki jalan buntu dan harus mundur? Yaitu, acak atas set path apa, dan dengan distribusi probabilitas apa?

Dengan anggapan Anda menginginkan musuh lebih memilih jalur pendek, Anda bisa menggunakan A *, tetapi secara acak memvariasikan bobot tepi yang diberikan padanya. Kemudian, musuh akan selalu memilih jalur acak yang mengunjungi setiap simpul paling banyak sekali, dengan bias menuju jalur yang lebih pendek. Secara khusus, jika tanpa pengacakan akan ada beberapa jalur dengan panjang yang sama, masing-masing jalur ini akan dipilih dengan probabilitas yang sama.

Atau, dalam A *, Anda bisa beralih di atas tetangga secara acak. Dalam eaxmple Anda, ketika pencarian jalur mencapai simpul 1, itu akan secara acak terlebih dahulu menentukan bagian atas tetangga bawah, menyebabkan jalur atas atau bawah dipertimbangkan terlebih dahulu. Solusi ini akan menyebabkan musuh memilih di antara semua jalur terpendek secara acak. Dalam contoh sederhana Anda, kedua jalur terpendek akan sama-sama memungkinkan, tetapi dalam situasi seperti:

start -+--------+
       |        |
       +--------+
       |        |
       +--------+- end

jalan teratas akan dipilih pada probabilitas 1/2, sedangkan yang bawah akan dipilih pada probabilitas 1/4 masing-masing.

meriton
sumber
Saya tidak yakin apa sebenarnya yang dimaksud OP dengan "pencarian jalan acak" tetapi solusi Anda untuk memilih secara acak di antara semua jalur terpendek adalah apa yang saya asumsikan maksudnya, dan "alternatif Anda" sebagai solusi untuk masalah itu.
jhocking
0

Hanya bukti konsep:

  1. Pilih arah acak.
  2. Jika ini akan menyebabkan kita pergi ke suatu tempat yang sudah kita kunjungi, pilih arah lain.
  3. Jika kita kehabisan arah, kembali ke alun-alun terakhir dengan arah yang belum dijelajahi.
orlp
sumber