Jika semua pemain muncul pada posisi acak dengan jarak yang sama dari pemain yang berdekatan, jumlah pemain akan sebanding dengan kemungkinan posisi spawn mereka menjadi tidak adil. Semakin dekat pemain muncul di tengah peta, semakin besar kemungkinan mereka bertemu pemain lain dan semakin kecil kemungkinan mereka untuk bertahan hidup, dibandingkan dengan pemain di tepi peta. Asumsikan semua pemain dilahirkan pada saat yang sama.
Apakah ada cara untuk membentuk titik spawn, atau mengubah peta, sehingga:
- Semua pemain memiliki sejumlah musuh yang berdekatan.
- Semua pemain memiliki peluang yang sama untuk bertemu musuh yang berdekatan.
- Ukuran peta tidak harus meningkat sebanding dengan jumlah pemain.
- Batasan-batasan ini tidak ditegakkan dengan ruang-ruang yang tidak dapat dilewati secara sewenang-wenang.
Jawabannya tidak harus sempurna, hanya jelas lebih baik daripada alternatifnya. Out of the box berpikir selamat datang.
game-design
level-design
Kode tidak pantas
sumber
sumber
Jawaban:
Biarkan para pemain memilih lokasi awal mereka sendiri.
Di awal permainan, buat semua pemain di tengah peta, tetapi tanpa ada cara untuk melukai pemain lain. Mereka kemudian harus berkerumun dan mendapatkan sarana untuk saling terlibat (membangun pangkalan, mengambil senjata, mengumpulkan sumber daya, dll.)
Ada sedikit keberuntungan atau pengetahuan peta yang terlibat dalam menemukan lokasi awal yang baik lebih awal (tergantung pada apakah Anda menggunakan peta prosedural atau buatan tangan). Tetapi kapan dan di mana penyelesaiannya sebagian besar merupakan keputusan strategis. Menyebarkan lebih awal memberi Anda keuntungan waktu, tetapi menempatkan Anda pada posisi berbahaya. Memilih basis Anda dengan hati-hati membuat Anda tertinggal di awal permainan, tetapi bisa menjadi keuntungan yang menentukan di pertengahan dan akhir pertandingan.
sumber
Memahami persyaratan
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.
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.
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.
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.
sumber
Itu tergantung pada jenis permainan yang ingin Anda buat dan seberapa cepat itu. Distribusi spasi sempurna yang sempurna dimungkinkan pada dunia seperti bola (misalnya Penghancuran Planet). Tapi apakah itu opsi yang adil dalam gim Anda? Bahkan jika semua orang memijah pada jarak yang sama, beberapa pemijahan mungkin masih memiliki keunggulan yang lebih baik.
Apakah peta Anda adalah peta yang diperbaiki atau yang dihasilkan secara prosedural? Dan pernah mencoba bermain Age of Empires dengan 8 orang di peta 2 orang? Tidak mungkin untuk membuat skala para pemain tanpa batas tanpa membuat penyesuaian dengan ukuran peta. Bahkan penempatan awal yang tidak adil dapat membawa banyak dinamika dalam permainan (lihat seri Worms). Tidak ada yang mengeluh jika Anda menelurkan tepat dalam kelompok besar, selama aliansi satu putaran Anda dengan pemain lain berlangsung atau Anda tidak memiliki cacing yang paling bertahan setelah putaran pertama.
(Saya akan menambahkan beberapa contoh lagi jika saya tahu lebih banyak tentang jenis permainan Anda)
sumber
Pergi untuk sesuatu yang tidak disarankan sejauh ini: Buatlah agar tidak ada pusat peta. Yang saya maksud dengan ini adalah bahwa tepi peta bergabung ke sisi yang berlawanan. Ini akan membutuhkan banyak pekerjaan pemrograman, tetapi dalam praktiknya hal itu dapat membuat level terulang kembali dengan sendirinya jika Anda berjalan dalam satu arah. Ini berarti bahwa tidak ada pusat, dan posisi spawn acak tidak akan memiliki kelebihan atau kekurangan.
Anda dapat melakukan ini dengan membuat peta datar yang berbentuk bujur sangkar, dan menyatukan setiap sisi ke salinan sisi yang berlawanan. Ketika seorang pemain berjalan dari sisi, mereka diteleportasi tanpa sepengetahuan pemain ke tepi yang berlawanan. Tentu saja, secara teoritis Anda tidak akan dapat melihat pemain di sisi lain batas. Untuk memperbaikinya, buat klon pemain yang tampaknya berjalan di sisi lain batas sehingga Anda bisa melihatnya, dan ketika Anda berlari ke arah itu, Anda teleport dan pemain yang sebenarnya berdiri di tempat boneka itu berada.
Atau, seluruh peta bisa ada di luar bola, namun ini membuat koordinat sulit untuk pemijahan.
sumber
Berikut adalah beberapa solusi yang mungkin:
sumber
Pada dasarnya saya percaya ini adalah masalah distribusi grafik. Dengan asumsi situasi deathmatch (setiap pemain lain adalah musuh), Anda perlu memodelkan peta Anda sebagai grafik yang saling berhubungan, dan melacak simpul mana pada grafik yang paling dekat dengan setiap pemain. Tidak setiap node perlu menjadi titik spawn, tetapi Anda membutuhkan grafik kompleks untuk memodelkan jarak antara titik spawn. Pada waktu spawn, Anda kemudian iterasi grafik dan mencetak setiap node spawnable berdasarkan apakah node terdekat memiliki pemain.
Simpul ideal kemudian memiliki:
Bayangkan bahwa grafik Anda telah diatur, dan Anda menggambar zona konsentris di sekitar setiap node. Anda menghukum simpul jika zona batin sudah memiliki pemain di dalamnya, dan hadiah node yang memiliki pemain pada jarak yang tepat. Anda ingin mendorong pemijahan cukup dekat ke pemain lain sehingga mereka dapat menemukan minat dengan cepat, tetapi tidak begitu dekat sehingga mereka bisa melompat sebelum mereka memiliki kesempatan untuk mendapatkan posisi mereka.
Anda akan perlu untuk meningkatkan ukuran peta dengan jumlah pemain tumbuh, tetapi
k
kebutuhan tidak 1 atau lebih besar. Kasing terburuk Anda adalah bahwa setiap simpul pada grafik memiliki setidaknya satu pemain - dalam hal ini tidak ada simpul bagus untuk digunakan, dan Anda harus menderita kasing itu dan menelurkan pemain mengetahui bahwa mereka akan mendarat tepat di atas yang lain. Algoritma skoring harus tetap membobot node sehingga Anda menelurkan di node dengan paling sedikit pemain lain.Ingatlah bahwa grafik peta Anda harus dibangun dengan hati-hati, dengan pengetahuan tentang peta, rutenya, chokepoints, dan jarak efektif antara titik-titik node, bukan jarak yang sebenarnya . Seperti dalam, gunakan sesuatu seperti waktu yang diukur untuk melintasi antar node daripada jarak, untuk memperhitungkan medan yang lebih sulit. Anda juga perlu memperhitungkan keterbukaan vs perlindungan; dua node mungkin secara fisik berjauhan, tetapi karena mereka sangat terbuka, memunculkan pemain di setiap node mungkin berarti mereka sama-sama rentan seperti jika Anda melahirkan mereka tepat di sebelah satu sama lain.
Perbaikan:
sumber
Beberapa orang lain telah membahas keterbatasan persyaratan Anda (peta perlu skala pada titik tertentu untuk mencegah kepadatan berlebih, dll.), Dan pada akhirnya menghindari fakta bahwa kemungkinan tidak ada algoritma penempatan yang "sempurna". Ketika kemungkinan tidak ada algoritma "sempurna", saya selalu melihat kearah heuristik. Anda memiliki beberapa kriteria yang secara langsung atau tidak langsung bertentangan dengan satu sama lain, bersama dengan ruang pencarian yang sangat rumit. Menemukan solusi optimal mungkin tidak dapat dilakukan atau praktis, tetapi dengan sedikit penyesuaian, pendekatan statistik dapat bekerja dengan sangat baik sebagian besar waktu.
Mengatasi kriteria ketiga dan keempat Anda: "Peta tidak harus diperluas."
Saya akan memastikan pada awalnya Anda memiliki node yang terlalu banyak (yaitu: sama padatnya dengan mesh navigasi untuk pencarian jalur). Ini membuat menghitung jarak ke pemain lain lebih mahal (tidak secara langsung bertetangga dengan node), tetapi ini bukan proses yang akan terjadi lebih dari satu kali per putaran (saya berasumsi). Bonus dari ini adalah Anda dapat menggunakan perpustakaan nav pra-lintir untuk sebagian besar operasi Anda. Selain itu ini akan menghormati traversal di sekitar rintangan dengan cara yang adil di mana jarak euclidean mungkin tidak (pemain dalam labirin mungkin ditempatkan lebih dekat bersama daripada di lapangan terbuka)
Hitung heuristik untuk karakteristik bibit yang Anda inginkan:
Setelah secara acak menempatkan semua pemain, hitung kinerja simpul-simpul di sekitarnya berdasarkan kriteria Anda (jarak dari pemain lain, jarak untuk memijah, dll.) Bobot nilai Anda dapat diubah, dan dimanipulasi menjadi nonlinear untuk menyetel persis kinerja Anda ingin dalam kasus ideal yang telah dibersihkan (kotak persegi panjang tanpa penghalang), dan kinerjanya harus sama ketika Anda menambahkan dunia kembali. Dari sana Anda dapat memutuskan berapa banyak node untuk dicari, berapa ambang batas untuk memindahkan titik awal , dan berapa banyak iterasi yang ingin Anda lakukan sebelum menyelesaikan spawn dan memulai permainan.
sumber
Jika lapangan bermain adalah torus topologis (yaitu persegi panjang di mana "keluar batas" berarti masuk di sisi yang berlawanan), ini kemungkinan merupakan jawaban yang baik: pemain
j
memunculkanx = (pjW/N) mod W, y = (qjH/N) mod H
, di manaW,H
dimensi persegi panjang,N
adalah jumlah pemain, danp,q
bilangan bulat yang harus ditentukan; mereka berbeda, (mungkin) relatif prima, dan tidak terlalu jauh darisqrt(N)
. Poin spawn membentuk pola 'wallpaper' miring.Itu seandainya para pemain hanya muncul di awal permainan. Jika mereka muncul nanti, saya kira Anda ingin menempatkan mereka sejauh mungkin dari posisi pemain mana pun saat ini - pada titik puncak diagram Voronoi yang ditentukan oleh pemain lain.
sumber
Bagaimana tentang:
Setiap pemain dikelilingi oleh kotak non-pemijahan (atau lingkaran).
Seperti halnya, ada kotak dengan ukuran tertentu yang muncul di sekitar setiap pemain dan mengikuti pemain itu di sekitarnya - tidak ada pemain lain yang bisa muncul di dalam kotak itu.
Kotak ini hanya memengaruhi pemijahan dan tidak ada gerakan lain selama pertandingan.
Ini bekerja dengan baik pemijahan hanya awal atau pemijahan terus menerus.
(Titik menunjukkan pemain dan hijau menunjukkan area spawn untuk pemain baru)
Untuk mengatasinya, Anda dapat melakukan salah satu dari dua hal: (atau keduanya)
sumber