Comprender los requisitos
- Todos los jugadores tienen un número limitado de enemigos adyacentes.
En primer lugar, estamos hablando de los puntos de generación de los jugadores, no de la posición actual de los jugadores en un punto dado del juego. Solo quitándome eso del camino.
Adyacente está bien definido cuando hablamos de un gráfico. Podemos pensar en un mapa que represente la navegabilidad en el mapa, de ahora en adelante "el gráfico".
Si el nodo can puede tener como máximo un punto de generación, entonces tiene sentido hablar de ellos como "adyacentes". Nota: No limitaré a los nodos a tener un único punto de generación como máximo, por razones que serán evidentes más adelante.
Para construir el gráfico tendremos que considerar cosas como paredes, puentes, escaleras, puntos de teletransportación, o incluso considerar el espacio de vuelo si podría haber un jugador que pueda volar. Cada nodo representa una ubicación transitable; cada conexión representa un posible movimiento.
Nota: conozca el tamaño y la forma de los nodos y trabaje con nodos realmente adyacentes. No considere los nodos un punto. No considere que las conexiones tengan longitud. Además, use nodos convexos.
El gráfico podría haber sido precompilado (el mapa fue creado por un diseñador); de lo contrario, se puede crear sobre la marcha si el mapa se genera aleatoriamente.
- Todos los jugadores tienen las mismas posibilidades de encontrarse con enemigos adyacentes.
Asumiré que los enemigos son otros jugadores. De nuevo, solo quitándolo del camino.
Suponiendo que cada jugador realiza una caminata aleatoria, la probabilidad de encontrar a un jugador en un punto dado, en un espacio plano, libre de obstáculos, estará dada por una función (gaussiana) de la distancia al punto de generación, de ahora en adelante "el función".
Como estamos trabajando en el gráfico, anotaremos los valores en el gráfico.
- El tamaño del mapa no tiene que aumentar proporcionalmente al número de jugadores.
Si tuviéramos la restricción de tener un solo punto de generación por nodo, entonces para agregar más jugadores necesitaríamos nodos más pequeños. Si decidimos el gráfico antes de saber cuántos jugadores tendremos, es posible que tengamos que subdividir los nodos para el juego en particular.
- Estas limitaciones no se aplican con espacios infranqueables arbitrarios.
No tengo la intención de agregar obstáculos para resolver el problema. Al contrario , necesito trabajar alrededor de los obstáculos. Si no estuvieran allí, la implementación sería más simple.
Solución
Estamos tratando de colocar N puntos de generación de modo que la posibilidad de encontrar a otro jugador en todos esos puntos de generación sea igual.
Podemos obtener una medida del error como la suma de las diferencias de las posibilidades con la media de las posibilidades. Estamos tratando de minimizar eso (de hecho, queremos que sea 0).
Para hacerlo, necesitamos saber la posibilidad de encontrar un jugador en cada nodo del gráfico.
Para calcular esa posibilidad, comience con cero. Dado que la posibilidad de encontrar un jugador en cualquier nodo dado, cuando no hay jugadores, es cero. Y luego, para cada punto de generación, recorra el gráfico agregando a la posibilidad anotada el valor de la función para el punto de generación actual.
Nota 1: Agregar o mover un punto de generación afectará la posibilidad de encontrar un jugador para todo el mapa.
Nota 2: Hacer un seguimiento de cuánto afecta cada punto de generación a la posibilidad, facilitará las cosas.
Nota 3: Dado que los nodos tienen tamaño, qué tan cerca puede llegar al error = cero depende del tamaño de los nodos. Puede ser más preciso trabajando con rangos de valores (posibilidad mínima y máxima, dependiendo de la posición particular de los puntos de generación dentro del nodo).
Coloque los puntos de generación al azar, luego comience a moverlos de tal manera que el error se haga más pequeño (considere un posible movimiento, y si el error disminuye, manténgalo, de lo contrario revertirlo). Y continúe haciéndolo hasta que no podamos mejorar más (demasiadas iteraciones sin mejora, o el error es cero).
Nota 4: Al mover un punto de generación, puede usar la posibilidad de encontrarse con un jugador (excluyendo el punto de generación que moverá) para seleccionar aleatoriamente una nueva posición para un punto de generación, tal posición que tiene la posibilidad de encontrar un jugador más cercano La media es más probable. Les recuerdo que mover el punto de generación afectará la media.
El comportamiento esperado es que los puntos de generación que están demasiado juntos se separan y los puntos de generación que están demasiado separados se acercan. Hasta que alcanzan el equilibrio.
Si en cualquier iteración tiene múltiples puntos de generación en un nodo (lo cual es poco probable, ya que deberían tender a separarse, pero es posible si tiene nodos lo suficientemente grandes), divida el nodo y continúe resolviendo. Cualquier división del nodo es válida.
La solución anterior se acercará a error = cero, pero no se garantiza que llegue a cero. Lo que puede hacer es ejecutarlo hasta que alcance un mínimo local ... En teoría, puede dividir los nodos para que sea exactamente cero ... ¡Sin embargo, eso es equivalente a ajustar las coordenadas del punto de generación!
Pruebe el recocido simulado para mover el punto de generación dentro del nodo. Aunque, sinceramente, probablemente no valga la pena molestarse con tal nivel de detalle.
Quiero dejar en claro que el resultado de un mapa plano libre de obstáculos no será puntos distribuidos uniformemente. En cambio, si el mapa tiene bordes (es decir, si no se ajusta), entonces habrá más puntos de generación más cerca de los bordes, esto se debe a que se puede llegar a los puntos en el centro desde más direcciones, lo que aumenta la posibilidad de encontrar otros jugadores allí. Por lo tanto, puntos más separados cerca del centro para compensar.