Suponiendo que tiene un mapa hexadecimal de n
celdas en total y p
jugadores, donde p <= n
, la mejor manera de abordar esto es a través de la distribución por turnos mediante autómatas celulares (CA).
Inicialización
Aleatoriamente (y / o usando alguna u otra heurística, como la distancia desde el centro del mapa) elige una celda inicial para cada jugador. Desde entonces p <= n
, esto no debería ser un problema.
Autómata celular
Necesita una conectividad completa entre sus celdas hexadecimales. Sugeriría una matriz de 6 vecinos por celda:
class Cell
{
//... other members...
Cell[6] neighbours = new Cell[6];
}
El uso de matrices de tamaño fijo permite que exista el concepto de direcciones topográficas entre celdas, lo que no existiría en una lista o vector. Recomiendo esto, ya que puede facilitar ciertas operaciones de navegación.
También puede almacenar su mapa hexadecimal en una matriz 2D, con desplazamientos por fila. Sin embargo, esto puede ser un poco menos intuitivo que almacenar una matriz vecina por celda, solo debido al desplazamiento geométrico en cada otra fila.
Asegúrese de que cada celda esté conectada a todo lo que sea vecino. Puede hacerlo fila por fila, celda por celda a medida que genera el mapa hexadecimal completo. PD Si finalmente desea un mapa hexadecimal acotado no rectangularmente, simplemente puede eliminar celdas individuales y referencias a esas celdas, para formar espacios negativos, lo que le permite crear un esquema de mapa orgánico.
Distribución round-robin
Pseudocódigo:
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
Este algoritmo le dará a cada jugador la oportunidad de hacer crecer su territorio en uno, en una forma de todos contra todos, siempre que el territorio del jugador todavía tenga un espacio de crecimiento válido. Si ciertos jugadores están bloqueados aumente aún más, el algoritmo a pesar de esto seguirá creciendo los territorios de los jugadores que no todavía tienen espacio de crecimiento válida. Podrías restringir fácilmente a cada jugador a la misma cantidad de celdas tan pronto como una de ellas llegue al límite, pero eso debería ser lo suficientemente fácil para que lo descubras, si lo deseas.
Esto proporcionará "territorios de origen" de tamaño máximo para cada jugador. Si quieres tener territorios de "islas" además, para cumplir con la cuota de conteo de células para ese jugador, una vez que un jugador se queda sin espacio local para crecer, puedes elegir una nueva celda de inicio de la lista de celdas neutrales y proceder con el mismo proceso de "crecimiento", a partir de ahí. De esta manera, terminarás con conjuntos de islas coherentes de buen tamaño para cada jugador, en lugar de ruido aleatorio.