Dengan asumsi Anda memiliki hexmap n
sel secara total, dan p
pemain, di mana p <= n
, cara terbaik untuk mengatasi hal ini adalah melalui distribusi round-robin melalui seluler automata (CA).
Inisialisasi
Secara acak (dan / atau menggunakan beberapa atau heuristik lain, seperti jarak dari pusat peta) pilih sel awal untuk setiap pemain. Sejakp <= n
, ini seharusnya tidak menjadi masalah.
Automata seluler
Anda memerlukan konektivitas penuh antara sel hex Anda. Saya akan menyarankan array 6-tetangga per sel:
class Cell
{
//... other members...
Cell[6] neighbours = new Cell[6];
}
Penggunaan array ukuran tetap memungkinkan konsep arah topografi antar sel ada, yang tidak akan ada dalam daftar atau vektor. Saya merekomendasikan ini, karena dapat membuat operasi navigasi tertentu lebih mudah.
Anda juga dapat menyimpan hexmap Anda dalam array 2D, dengan offset per baris. Namun ini mungkin sedikit kurang intuitif daripada menyimpan array tetangga per sel, hanya karena offset geometris pada setiap baris lainnya.
Pastikan setiap sel terhubung ke semua yang tetangga. Anda dapat melakukan baris ini demi baris, sel demi sel saat Anda menghasilkan hexmap penuh. NB. Jika pada akhirnya Anda menginginkan hexmap yang tidak dibatasi empat persegi panjang, Anda dapat dengan mudah menghapus masing-masing sel dan referensi ke sel-sel tersebut, untuk membentuk ruang negatif, memungkinkan Anda untuk membuat garis besar peta organik.
Distribusi round-robin
Kodesemu:
count number of neutral cells in entire map, minus those starting cells taken by players
while neutral cells remain (or while true)
for each player
if player has not yet reached expected territory size in cells
for each cell already constituting this player's territory
if territory can grow by one cell into a neutral neighbour
grow into neighbour
reduce neutral cell count for entire map by one
if no more neutral cells remain in map
break out of outermost while loop immediately
else
continue to next player immediately
begin game
Algoritma ini akan memberikan setiap pemain kesempatan untuk menumbuhkan wilayahnya satu per satu, secara bundar, asalkan wilayah pemain masih memiliki ruang tumbuh yang valid. Jika pemain tertentu diblokir dari tumbuh lebih lanjut, algoritma akan terlepas dari ini terus menumbuhkan wilayah pemain yang melakukannya masih memiliki ruang tumbuh valid. Anda dapat dengan mudah membatasi setiap pemain ke jumlah sel yang sama segera setelah salah satu dari mereka mencapai batas, tetapi itu seharusnya cukup mudah bagi Anda untuk mencari tahu, jika diinginkan.
Ini akan memberikan "wilayah rumah" berukuran maksimal untuk setiap pemain. Jika Anda ingin memiliki wilayah "pulau" sebagai tambahan, untuk memenuhi kuota jumlah sel untuk pemain itu, maka setelah pemain kehabisan ruang lokal untuk tumbuh, Anda kemudian dapat memilih sel awal baru dari daftar sel netral dan lanjutkan dengan proses "pertumbuhan" yang sama, dari sana. Dengan cara ini, Anda akan berakhir dengan set pulau yang berukuran bagus dan koheren untuk masing-masing pemain, daripada kebisingan acak.