Supondo que você tenha um mapa hexadecimal de n
células e p
jogadores, onde p <= n
, a melhor maneira de resolver isso é através da distribuição round-robin via autômatos celulares (CA).
Inicialização
Aleatoriamente (e / ou usando algumas ou outras heurísticas, como a distância do centro do mapa), escolha uma célula inicial para cada jogador. Desde então p <= n
, isso não deve ser um problema.
Autômatos celulares
Você precisa de conectividade completa entre suas células hexadecimais. Eu sugeriria uma matriz de 6 vizinhos por célula:
class Cell
{
//... other members...
Cell[6] neighbours = new Cell[6];
}
O uso de matrizes de tamanho fixo permite que exista o conceito de direções topográficas entre células, o que uma lista ou vetor não existiria. Eu recomendo isso, pois pode facilitar algumas operações de navegação.
Você também pode armazenar seu hexmap em uma matriz 2D, com deslocamentos por linha. No entanto, isso pode ser um pouco menos intuitivo do que armazenar uma matriz vizinha por célula, apenas devido ao deslocamento geométrico em todas as outras linhas.
Verifique se todas as células estão conectadas a tudo que é vizinho. Você pode fazer isso linha por linha, célula por célula, ao gerar o mapa hexadecimal completo. PS Se você quiser um mapa hexadecimal não retangularmente delimitado, poderá simplesmente remover células e referências individuais a essas células, para formar espaços negativos, permitindo criar um esboço de mapa orgânico.
Distribuição round-robin
Pseudo-có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
Esse algoritmo dará a cada jogador a chance de aumentar seu território por um, de maneira round robin, desde que o território do jogador ainda tenha um espaço de cultivo válido. Se alguns jogadores são impedidos de crescer ainda mais, o algoritmo irá apesar deste continuar a crescer nos territórios de jogadores que não têm ainda espaço crescente válido. Você pode restringir facilmente todos os jogadores ao mesmo número de células assim que um deles atingir um limite, mas isso deve ser fácil o suficiente para você descobrir, se desejar.
Isso fornecerá "territórios domésticos" de tamanho máximo para cada jogador. Se você deseja ter territórios de "ilha", além disso, para cumprir a cota de contagem de células para esse jogador, depois que um jogador ficar sem espaço local para crescer, você poderá escolher uma nova célula de início na lista de células neutras e prossiga com o mesmo processo de "crescimento" a partir daí. Dessa forma, você acabará com conjuntos de ilhas coerentes e de bom tamanho para cada jogador, em vez de ruído aleatório.