Si todos los jugadores se generan en posiciones aleatorias a la misma distancia de los jugadores adyacentes, el número de jugadores será proporcional a la probabilidad de que sus posiciones de generación sean injustas. Mientras los jugadores más cercanos se reproducen en el centro del mapa, es más probable que se encuentren con otros jugadores y menos probabilidades de sobrevivir, en comparación con los jugadores en el borde del mapa. Supongamos que todos los jugadores se generan al mismo tiempo.
¿Hay alguna manera de dar forma a los puntos de generación, o cambiar el mapa, de modo que:
- Todos los jugadores tienen un número limitado de enemigos adyacentes.
- Todos los jugadores tienen las mismas posibilidades de encontrarse con enemigos adyacentes.
- El tamaño del mapa no tiene que aumentar proporcionalmente al número de jugadores.
- Estas limitaciones no se aplican con espacios infranqueables arbitrarios.
La respuesta no tiene que ser perfecta, simplemente obviamente mejor que la alternativa. Fuera de la caja pensando bienvenido.
game-design
level-design
Código inapropiado
fuente
fuente
Respuestas:
Deje que los jugadores elijan sus ubicaciones de inicio ellos mismos.
Al comienzo del juego, genera todos los jugadores en el centro del mapa, pero sin ningún medio de dañar a los otros jugadores. Luego tendrán que irrumpir y adquirir los medios para enfrentarse entre sí (construir una base, recoger un arma, reunir recursos, etc.)
Hay un poco de suerte o conocimiento de mapas involucrado en la búsqueda temprana de una buena ubicación de inicio (dependiendo de si usa mapas de procedimiento o hechos a mano). Pero cuándo y dónde establecerse es principalmente una decisión estratégica. Implementar temprano te da una ventaja de tiempo, pero te pone en una posición peligrosa. Elegir tu base con cuidado te deja atrás al principio del juego, pero puede ser una ventaja decisiva a mitad y al final del juego.
fuente
Comprender los requisitos
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.
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.
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.
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.
fuente
Depende de qué tipo de juego quieras crear y qué tan rápido sea. La distribución perfecta y uniformemente espaciada es posible en una esfera como el mundo (por ejemplo, Aniquilación planetaria). ¿Pero es una opción justa en tu juego? Incluso si todas las personas se están reproduciendo a la misma distancia, algunos pueden tener una mejor ventaja.
¿Su mapa es fijo o procesal generado? ¿Y alguna vez trataste de jugar Age of Empires con 8 personas en un mapa de 2 personas? No es posible escalar los jugadores infinitamente sin hacer ajustes al tamaño del mapa. Incluso una colocación de inicio injusta puede aportar mucha dinámica en el juego (ver la serie Worms). Nadie se quejó si engendraste en un grupo grande, siempre y cuando tu alianza de una ronda con otro jugador durara o no tuvieras los gusanos más sobrevivientes después de la primera ronda.
(Agregaré algunos ejemplos más si sé más sobre tu tipo de juego)
fuente
Ir por algo no sugerido hasta ahora: hazlo para que no haya centro del mapa. Lo que quiero decir con esto es que los bordes del mapa se unen en los lados opuestos. Esto requeriría mucho trabajo de programación, pero en la práctica puede hacer que el nivel se repita infinitamente si camina en una dirección. Esto significa que no hay centro, y una posición de generación aleatoria no tendrá ventajas ni desventajas.
Puede hacer esto haciendo un mapa plano que sea cuadrado y uniendo cada borde a una copia del borde opuesto. Cuando un jugador sale del lado, se teletransporta sin el conocimiento del jugador al borde opuesto. Por supuesto, teóricamente no podrás ver jugadores en el otro lado del límite. Para solucionar esto, crea clones de ese jugador que parezcan caminar al otro lado del límite para que puedas verlos, y cuando corres hacia ellos te teletransportas y el jugador real está parado donde estaba el muñeco.
Alternativamente, todo el mapa podría existir en el exterior de una esfera, sin embargo, esto hace que las coordenadas sean difíciles de generar.
fuente
Aquí hay algunas soluciones posibles:
fuente
Fundamentalmente creo que este es un problema de distribución de gráficos. Suponiendo una situación de combate a muerte (cualquier otro jugador es un enemigo), debes modelar tus mapas como un gráfico interconectado y rastrear qué nodo en el gráfico está más cerca de cada jugador. No todos los nodos deben ser un punto de generación, pero necesita el gráfico complejo para modelar distancias entre puntos de generación. En el momento de la generación, estás iterando el gráfico y anotando cada nodo generado en función de si los nodos cercanos tienen jugadores.
El nodo ideal tiene entonces:
Imagine que su gráfico se ha regularizado y está dibujando zonas concéntricas alrededor de cada nodo. Se penaliza el nodo si las zonas internas ya tienen jugadores y recompensa los nodos que tienen jugadores a la distancia correcta. Debes alentar el desove lo suficientemente cerca de otros jugadores como para que puedan encontrar interés rápidamente, pero no tan cerca como para que se suban antes de que tengan la oportunidad de orientarse.
Usted tendrá que aumentar el tamaño del mapa como el número de jugadores crece, pero la
k
necesidad de no tener 1 o más. Su peor caso será que cada nodo en el gráfico tiene al menos un jugador, en cuyo caso no hay buenos nodos para usar, y tendrá que sufrir ese caso y generar un jugador sabiendo que lo hará aterrizar justo encima de otro. El algoritmo de puntuación aún debe pesar los nodos para que generes en el nodo con la menor cantidad de jugadores.Tenga en cuenta que su gráfico de mapa tendrá que construirse cuidadosamente, con conocimiento del mapa, sus rutas, cualquier punto de estrangulamiento y la distancia efectiva entre puntos de nodo, no la distancia real . Como en, use algo como el tiempo medido para atravesar entre nodos en lugar de distancia, para tener en cuenta el terreno más difícil. También debe tener en cuenta la apertura frente a la cubierta; dos nodos pueden estar físicamente muy separados, pero debido a que están muy abiertos, engendrar un jugador en cada nodo puede significar que son tan vulnerables como si los hubieras generado uno al lado del otro.
Refinamientos:
fuente
Algunos otros ya han discutido las limitaciones de sus requisitos (el mapa necesitará escalar en algún punto para evitar el hacinamiento, etc.), y finalmente han eludido el hecho de que probablemente no haya un algoritmo de colocación "perfecto". Cuando probablemente no haya un algoritmo "perfecto", siempre miro hacia la heurística. Tiene varios criterios que están directa o indirectamente en desacuerdo entre sí, junto con un espacio de búsqueda muy complicado. Encontrar una solución óptima puede no ser factible o práctico, pero con un poco de ajuste, un enfoque estadístico puede funcionar muy bien la mayoría de las veces.
Abordar su tercer y cuarto criterio: "El mapa no debería tener que expandirse".
Al principio, me aseguraré de que tenga una gran cantidad de nodos (es decir, tan denso como una malla de navegación para encontrar rutas). Esto hace que el cálculo de la distancia a otros jugadores sea más costoso (no directamente a los nodos vecinos), pero este no es un proceso que ocurrirá más de una vez por ronda (supongo). Una ventaja de esto es que puede usar una biblioteca de navegación pre-enrollada para la mayoría de sus operaciones. Además, esto respetará el recorrido alrededor de los obstáculos de una manera justa donde la distancia euclidiana no lo haga (los jugadores en un laberinto pueden colocarse más juntos que en un campo abierto)
Calcule la heurística para las características de generación deseadas:
Después de colocar aleatoriamente a todos los jugadores, calcule el rendimiento de los nodos circundantes en función de sus criterios (distancia de otros jugadores, distancia al desove, etc.) Los pesos de sus valores se pueden ajustar y manipular para que no sean lineales para ajustar exactamente el rendimiento desea en un caso ideal desinfectado (cuadrícula rectangular plana sin obstáculos), y el rendimiento debe ser similar cuando vuelve a agregar el mundo. Desde allí puede decidir cuántos nodos buscar, cuál es el umbral para mover un punto de partida , y cuántas iteraciones quieres realizar antes de finalizar el engendro y comenzar el juego.
fuente
Si el campo de juego es un toro topológico (es decir, un rectángulo donde ir "fuera de los límites" significa entrar en el lado opuesto), es probable que sea una buena respuesta: el jugador
j
generax = (pjW/N) mod W, y = (qjH/N) mod H
, dondeW,H
están las dimensiones del rectángulo,N
es el número de jugadores, yp,q
son enteros por determinar; son distintos, (probablemente) relativamente primos, y no muy lejossqrt(N)
. Los puntos de generación forman un patrón oblicuo de "fondo de pantalla".Eso supone que los jugadores solo aparecen al comienzo del juego. Si aparecen más tarde, supongo que querrás colocarlos lo más lejos posible de la posición actual de cualquier jugador, en un vértice del diagrama de Voronoi definido por los otros jugadores.
fuente
Qué tal si:
Cada jugador está rodeado por un cuadro (o círculo) que no se genera.
Al igual que en, hay un cuadrado de cierto tamaño que se genera alrededor de cada jugador y sigue a ese jugador: ningún otro jugador puede generar dentro de ese cuadrado.
Estas casillas solo afectan el desove y no cualquier otro movimiento durante el juego.
Esto funciona con el desove solo inicial o el desove continuo.
(Los puntos indican jugadores y el verde indica posible área de generación para nuevos jugadores)
Para lidiar con esto, puede hacer una de dos cosas: (o ambas)
fuente