tiempo real que matrices graficos graficas graficar ejes crear coordenadas python graph procedural-generation

real - python graficos 2d



¿Cuál es una buena estrategia para construir un gráfico dirigido para un mapa del juego(en Python)? (2)

Eche un vistazo a las discusiones sobre el conector MUD : hay algunas discusiones excelentes sobre el diseño y la generación mundial, y diferentes tipos de sistemas de coordenadas / navegación en el foro "Codificación y diseño avanzados" (o similar).

Estoy desarrollando un mundo de juego generado por procedimientos en Python. La estructura del mundo será similar al paradigma MUD / MUSH de habitaciones y salidas dispuestas como un gráfico dirigido (las habitaciones son nodos, las salidas son bordes). (Tenga en cuenta que esto no es necesariamente un gráfico acíclico, aunque estoy dispuesto a considerar soluciones acíclicas).

Para el algoritmo de generación mundial, las habitaciones de diferentes clases se distinguirán por el atributo "etiquetas" de cada sala (un conjunto de cadenas). Una vez que se han instanciado, las salas pueden consultarse y seleccionarse mediante etiquetas (etiqueta única, intersección de etiquetas, unión de etiquetas, mejor candidato).

Crearé tipos específicos de salas utilizando un sistema glorificado de objetos de plantilla y métodos de fábrica. No creo que los detalles sean importantes aquí, ya que la implementación actual probablemente cambiará para coincidir con la estrategia elegida. (Por ejemplo, sería posible agregar etiquetas y consultas de etiquetas al sistema de plantilla de sala).

Por ejemplo, tendré habitaciones de este tipo:

side_street, main_street, plaza, bar, hotel, restaurant, shop, office

Finalmente, la pregunta: ¿cuál es una buena estrategia para crear instancias y organizar estas salas para crear un gráfico que pueda corresponder a las reglas dadas?

Algunas reglas pueden incluir: una plaza por 10,000 habitantes; main_street conecta a la plaza ; side_street conecta con main_street o side_street ; hotel favorece main_street o plaza , y recibe etiquetas adicionales en consecuencia; etc.

Puntos de bonificación si una estrategia sugerida permitiría una implementación basada en datos.


Primero, necesitas un sentido de Ubicación. Sus diversos objetos ocupan una cierta cantidad de espacio de coordenadas.

Debes decidir qué tan regulares son estas cosas. En el caso trivial, puede colocarlos en su espacio de coordenadas como rectángulos simples (o sólidos rectangulares) para hacer que las ubicaciones sean más simples de planificar.

Si las cosas son irregulares y densas, la vida es algo más compleja.

Definir un mapa para contener ubicaciones. Cada ubicación tiene un lapso de coordenadas; si trabajas con rectángulos simples, entonces cada ubicación puede tener una tupla (izquierda, superior, derecha, abajo).

Su mapa necesitará métodos para determinar quién reside en un espacio determinado y qué es adyacente al espacio, etc.

A continuación, puede probar la unidad con un conjunto fijo de ubicaciones que haya calculado y que se puedan eliminar en el mapa y pasar algunas verificaciones de cordura básicas para que no entren en conflicto, adyacentes y similares.

En segundo lugar, necesitas una especie de "generador de laberinto". Un laberinto simplemente conectado se genera fácilmente como una estructura de árbol plegada en el espacio dado.

El laberinto / árbol tiene un nodo "raíz" que será el centro del laberinto. No necesariamente el centro físico de su espacio, pero el nodo raíz será el centro de la estructura del laberinto.

Idealmente, una rama de este nodo contiene una "entrada" a todo el espacio.

La otra rama de este nodo contiene una "salida" de todo el espacio.

Alguien puede pasear de entrada a salida, visitando un montón de lugares "sin salida" en el camino.

Elija un tipo de espacio para el nodo raíz. Colócalo en tu espacio de Mapa.

Esto tendrá 1 - n entradas, cada una de las cuales es un subárbol con un nodo raíz y 1 - n entradas. Es este negocio de entradas múltiples lo que hace que un árbol encaje de forma natural con esta estructura. También un árbol adecuado siempre está bien conectado, ya que nunca se tienen secciones aisladas que no se puedan alcanzar.

Usted, recursivamente, se desplegará desde el nodo raíz, seleccionando ubicaciones y colocándolas en el espacio disponible.

Pruebe con la unidad esto para asegurarse de que llena el espacio razonablemente bien.

El resto de sus requisitos están ajustando la forma en que el generador de laberinto elige las ubicaciones.

Lo más fácil es tener una tabla de pesas y opciones aleatorias. Elija un número al azar, compárelo con los pesos para ver qué tipo de ubicación se identifica.

Su definición de espacio puede ser 2D o 3D; ambas son bastante racionales. Para obtener un crédito adicional, considere cómo implementaría un espacio 2D con mosaicos hexagonales en lugar de cuadrados.

Esta "geometría" puede ser un complemento de la Estrategia para los diversos algoritmos. Si puede reemplazar 2D cuadrado con 2D hexagonal, habrá hecho un buen trabajo con OO Design.