Memahami persyaratan
- Semua pemain memiliki sejumlah musuh yang berdekatan.
Pertama, kita berbicara tentang titik-titik spawn para pemain, bukan posisi pemain saat ini pada titik tertentu dalam permainan. Hanya menyingkirkan itu.
Berdekatan didefinisikan dengan baik ketika kita berbicara tentang grafik. Kita dapat memikirkan peta yang mewakili kemampuan navigasi di peta - mulai sekarang di "grafik".
Jika simpul dapat memiliki paling banyak satu titik spawn, maka berbicara tentang mereka yang "berdekatan" masuk akal. Catatan: Saya tidak akan membatasi node untuk memiliki satu titik spawn paling banyak, untuk alasan yang akan terlihat kemudian.
Untuk membangun grafik kita perlu mempertimbangkan hal-hal seperti dinding, jembatan, tangga, titik teleportasi, atau bahkan mempertimbangkan ruang penerbangan jika ada pemain yang bisa terbang. Setiap node mewakili lokasi yang dapat dilalui; setiap koneksi mewakili gerakan yang memungkinkan.
Catatan: ketahui ukuran dan bentuk node, dan bekerja dengan node yang sebenarnya berdekatan. Jangan anggap titik sebagai titik. Jangan menganggap koneksi memiliki panjang. Juga, gunakan simpul cembung.
Grafik dapat dikompilasi sebelumnya (peta dibuat oleh seorang desainer); jika tidak, dapat dibuat dengan cepat jika peta dibuat secara acak.
- Semua pemain memiliki peluang yang sama untuk bertemu musuh yang berdekatan.
Saya akan menganggap musuh adalah pemain lain. Sekali lagi, baru saja menyingkir.
Dengan asumsi setiap pemain melakukan jalan acak, probabilitas menemukan pemain pada titik tertentu - di ruang datar, bebas hambatan - akan diberikan oleh fungsi (Gaussian) jarak ke titik spawn - mulai sekarang " fungsi".
Karena kami sedang mengerjakan grafik, kami akan menganotasi nilai pada grafik.
- Ukuran peta tidak harus meningkat sebanding dengan jumlah pemain.
Jika kita memiliki kendala untuk memiliki satu titik spawn per node, maka untuk menambahkan lebih banyak pemain kita akan memerlukan node yang lebih kecil. Jika kita memutuskan grafik sebelum kita tahu berapa banyak pemain yang akan kita miliki, kita mungkin harus membagi node untuk permainan tertentu.
- Batasan-batasan ini tidak ditegakkan dengan ruang-ruang yang tidak dapat dilewati secara sewenang-wenang.
Saya tidak bermaksud menambah kendala untuk menyelesaikan masalah. Au contraire , saya harus bekerja di sekitar rintangan. Jika tidak ada, implementasinya akan lebih sederhana.
Larutan
Kami mencoba menempatkan N spawn point sehingga peluang bertemu pemain lain sama sekali dengan spawn point.
Kita bisa mendapatkan ukuran kesalahan sebagai jumlah dari perbedaan peluang dengan rata-rata peluang. Kami mencoba untuk meminimalkan itu (sebenarnya, kami ingin membuatnya 0).
Untuk melakukannya, kita perlu mengetahui peluang bertemu pemain di setiap simpul grafik.
Untuk menghitung peluang itu, mulailah dengan nol. Karena peluang untuk menemukan pemain di sembarang simpul, ketika tidak ada pemain, adalah nol. Dan kemudian, untuk masing-masing titik spawn, berjalan grafik menambahkan ke kesempatan beranotasi nilai fungsi untuk titik spawn saat ini.
Catatan 1: Menambahkan atau memindahkan spawn point akan memengaruhi peluang bertemu pemain untuk semua peta.
Catatan 2: Melacak seberapa besar setiap titik pemijahan mempengaruhi kesempatan, akan membuat segalanya lebih mudah.
Catatan 3: Karena node memiliki ukuran, seberapa dekat Anda dengan error = nol tergantung pada ukuran node. Anda bisa lebih tepat dengan bekerja dengan rentang nilai (peluang minimun dan maksimal, tergantung pada posisi titik spawn di dalam simpul).
Tempatkan titik-titik spawn secara acak, lalu mulailah memindahkan mereka sedemikian rupa sehingga kesalahan menjadi lebih kecil (pertimbangkan gerakan yang memungkinkan, dan jika menyebabkan kesalahan berkurang pertahankan, jika tidak kembalikan). Dan terus melakukannya sampai kita tidak dapat meningkatkan lebih lanjut (terlalu banyak iterasi tanpa peningkatan, atau kesalahan adalah nol).
Catatan 4: Saat memindahkan titik bertelur, Anda dapat menggunakan peluang bertemu dengan pemain (tidak termasuk titik bertelur yang akan Anda pindahkan) untuk secara acak memilih posisi untuk titik bertelur sehingga posisi yang memiliki peluang bertemu dengan pemain yang lebih dekat dengan rata-rata lebih mungkin. Saya ingatkan Anda bahwa memindahkan spawn point akan memengaruhi mean.
Perilaku yang diharapkan adalah titik bertelur yang terlalu berdekatan bergerak terpisah dan titik bertelur yang terlalu jauh semakin dekat. Sampai mereka mencapai keseimbangan.
Jika pada suatu iterasi tertentu Anda memiliki beberapa titik spawn pada sebuah node (yang tidak mungkin, karena mereka cenderung bergerak terpisah, tetapi mungkin jika Anda memiliki node yang cukup besar), pisahkan node tersebut dan lanjutkan penyelesaiannya. Setiap pembagian node adalah valid.
Solusi di atas akan mendekati kesalahan = nol, tetapi tidak dijamin untuk mencapai nol. Yang bisa Anda lakukan adalah menjalankannya sampai mencapai minimum lokal ... Secara teori, Anda kemudian dapat membagi node untuk membuatnya benar-benar nol ... Namun, itu setara dengan mengutak-atik koordinat titik spawn!
Coba simulasikan anil untuk memindahkan titik spawn di dalam node. Meskipun, jujur, mungkin tidak ada gunanya untuk repot dengan tingkat detail seperti itu.
Saya ingin memperjelas bahwa hasil peta datar yang bebas dari rintangan tidak akan didistribusikan secara merata. Sebaliknya, jika peta memiliki tepi (yaitu, jika tidak membungkus), maka akan ada lebih banyak titik spawn lebih dekat ke tepi, ini karena titik-titik di pusat dapat dicapai dari lebih banyak arah, meningkatkan kemungkinan bertemu pemain lain di sana. Dengan demikian, poin lebih jauh terpisah di dekat pusat untuk kompensasi.