Acabei de iniciar um novo projeto no qual gostaria que o mundo do jogo consistisse em locais gerados processualmente, conectados por teleportadores. Depois de um pouco de pesquisa, descobri que isso é chamado de "teoria dos grafos" ou "muito complicado", dependendo de quem está discutindo. Infelizmente, encontrei muito pouca informação sobre a geração de gráficos; a maioria das ferramentas que vi são direcionadas para o exame de gráficos existentes.
Supondo que eu tenha a terminologia corretamente resolvida, meus requisitos são que o gráfico seja:
- simple - nenhum local (vértice) deve ter um teletransportador (borda) que se conecte de volta a si mesmo, nem dois vértices devem ter várias arestas conectando-os
- conectado - deve ser possível viajar entre dois vértices no gráfico (embora eu não preveja a necessidade de encontrar o caminho; basta saber que o jogador pode encontrar um, se preferir, é suficiente)
- cíclico - deve haver mais de um caminho entre dois vértices
- sem direção - todas as arestas podem ser percorridas em qualquer direção
- infinito - se o jogador desejar, ele poderá viajar indefinidamente, com o gráfico continuando a gerar incrementalmente à medida que se aproxima de
seusvértices inexploradosmais externos - localmente finito - o grau de um vértice nunca deve mudar depois que o jogador o visita
- rotulado de forma estável - cada vértice representa um local que será gerado proceduralmente a partir de uma semente; a mesma semente deve ser atribuída a um vértice, independentemente do caminho que o jogador percorreu até lá ou do tamanho do gráfico ao percorrer
Eu tive algumas idéias (que ainda não tentei implementar) sobre o uso dos máximos locais do ruído perlin 2D como vértices (a entrada x e y poderiam então ser usados como seu rótulo), mas isso parece desajeitado e complicado demais.
Existe uma maneira melhor de gerar um gráfico como este? Estou desenvolvendo no Python 2.6 usando o Panda3D e o numpy e, é claro, gostaria de incluir outras bibliotecas se elas ajudarem com esse problema!
Editar
Acho que fiz um péssimo trabalho explicando alguns dos meus requisitos, então é hora da ilustração! Felizmente, isso vai esclarecer as coisas.
O que quero dizer com rótulos estáveis é que eu quero, por exemplo, que o Jogador A seja capaz de explorar e encontrar, entre outras coisas, um caminho cíclico de volta ao local inicial e uma montanha que parece um gato. Seu jogo agora se parece com o seguinte (os vértices são numerados com suas sementes e arestas com a ordem em que o jogador os atravessou). Ele começou no vértice 8329 (verde) e a Happycat Mountain está no vértice 6745 (azul).
O bom amigo do jogador A, jogador B, é um fã de gatos, então ele quer mostrar a ela. Ele dá a ela a raiz do seu mundo e direções ao longo do caminho mais curto para a montanha de interesse. O jogo dela agora deve ficar assim:
O problema com o qual estou tendo mais dificuldade atualmente é "Como eu gero as mesmas sementes para o Jogador B quando a exploração dela não segue o mesmo caminho?" Foi isso que me levou à ideia de usar o ruído Perlin - desde que a mesma semente de raiz seja usada, o máximo não se moverá, então suas coordenadas poderão ser usadas como sementes de vértice estáveis.