Supponendo che tu abbia una mappa esadecimale di n
celle e p
giocatori, in cui p <= n
il modo migliore per affrontarlo è attraverso la distribuzione round-robin tramite automi cellulari (CA).
Inizializzazione
Casualmente (e / o usando alcuni o altri euristici, come la distanza dal centro della mappa) scegli una cella iniziale per ogni giocatore. Da allora p <= n
, questo non dovrebbe essere un problema.
Automi cellulari
È necessaria una connettività completa tra le celle esadecimali. Vorrei suggerire un array di 6 vicini per cella:
class Cell
{
//... other members...
Cell[6] neighbours = new Cell[6];
}
L'uso di matrici di dimensioni fisse consente l'esistenza del concetto di direzioni topografiche tra celle, cosa che un elenco o un vettore non avrebbe. Lo consiglio, poiché potrebbe rendere più semplici alcune operazioni di navigazione.
Puoi anche archiviare la tua hexmap in un array 2D, con offset per riga. Questo può tuttavia essere leggermente meno intuitivo rispetto alla memorizzazione di un array vicino per cella, solo a causa dell'offset geometrico su ogni altra riga.
Assicurati che ogni cella sia connessa a tutto ciò che è vicino. Puoi eseguire questa riga per riga, cella per cella mentre generi l'esagono completo. PS Se alla fine desideri una hexmap delimitata in modo non rettangolare, puoi semplicemente rimuovere singole celle e riferimenti a tali celle, per formare spazi negativi, che ti consentono di creare un contorno organico della mappa.
Distribuzione round-robin
pseudocodice:
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
Questo algoritmo darà a ogni giocatore la possibilità di far crescere il proprio territorio di uno, in modo round robin, a condizione che il territorio del giocatore abbia ancora spazio di crescita valido. Se certi giocatori sono bloccati di crescere ulteriormente, l'algoritmo nonostante questo continuano a crescere i territori di giocatori che non hanno ancora spazio di crescita valida. Puoi limitare facilmente ogni giocatore allo stesso numero di celle non appena uno di loro raggiunge un limite, ma dovrebbe essere abbastanza facile da capire, se lo desideri.
Ciò fornirà "territori d'origine" di dimensioni massime per ciascun giocatore. Se si desidera avere anche territori "insulari", al fine di soddisfare la quota di conteggio delle celle per quel giocatore, una volta che un giocatore ha esaurito lo spazio locale per crescere, è quindi possibile selezionare una nuova cella iniziale dall'elenco di celle neutre e procedere con lo stesso processo di "crescita", da lì. In questo modo, finirai con insiemi di isole di dimensioni adeguate e coerenti per ogni giocatore, piuttosto che rumore casuale.