¿Hacer justos los puntos de generación aleatorios?

22

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:

  1. Todos los jugadores tienen un número limitado de enemigos adyacentes.
  2. Todos los jugadores tienen las mismas posibilidades de encontrarse con enemigos adyacentes.
  3. El tamaño del mapa no tiene que aumentar proporcionalmente al número de jugadores.
  4. 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.

Código inapropiado
fuente
10
¿Engendrar en un círculo?
Zibelas
1
@Zibelas Enfoque tradicional, pero viola el requisito 3, y con muchos jugadores esto crea un mapa enorme y un interior vacío.
InadecuadoCódigo
44
Depende de tu tipo de juego. (2D / 3D, reaparecer / último hombre de pie, etc.) El engendro perfecto en ese caso solo es posible en un mundo con forma de bola (más jugadores, engendros más cercanos, pero puede garantizar que tengan la misma distancia). En un mundo 2D con bordes fijos, siempre tienes menos jugadores limítrofes ya que no tienes lugar para generarlos. Si es un juego en 3D, puedes tener múltiples capas.
Zibelas
1
Creo que sería útil saber qué tipo de juego estás haciendo. Parece un juego de guerra, pero ¿cuáles son los detalles? ¿Es un tirador? ¿Comienzas con todas tus armas o tienes que explorar y encontrar cosas? ¿Cuál es la condición de victoria? ¿Cuánto tiempo se espera que dure un partido?
RothX
3
No para una respuesta completa, pero creo que todos están tratando de "engendrar justo y equilibrado" que ... no es divertido. Mira el excelente desove de PUBG (y otros Battle Royale): los jugadores pueden "engendrar" (bueno, saltar y aterrizar ...) casi en cualquier lugar que quieran; si quieres conflicto y drama, eliges el lugar donde la mayoría de los jugadores aterrizan / desovan. Alto riesgo, alta recompensa, pero solo si el jugador la quiere. Puedes aterrizar en algún lugar del bosque, tienes tiempo para prepararte: bajo riesgo y baja recompensa, pero algunos jugadores pueden preferirlo (como yo, por ejemplo;)). NO es al azar, es por elección de los jugadores.
Jan 'splite' K.

Respuestas:

27

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.

Philipp
fuente
3
@Shashimee En realidad creo que he visto este método por primera vez en Anno 1602. También creo que algunos de los primeros juegos de C&C tenían eso como una opción opcional de juego multijugador (pero no estoy seguro si recuerdo eso correctamente).
Philipp
3
@Philipp MULA para el Commodore 64 alrededor de 15 años más viejo y permitirá elegir así sus posiciones :)
Zibelas
Luego te encuentras con el problema donde te siguen hasta tu punto de generación. Por supuesto, esto podría ser una mecánica de juego deseada, pero también podría ser extremadamente frustrante y no es algo que decidas que quieres en tu juego. Una buena idea sería tener a los personajes engendrados invisibles y sin colisiones de jugadores, y encontrar su base antes de comenzar el juego.
Dent7777
Ese es el método utilizado por la línea de modos de juego personalizados "Vampirism" y "Tree Tag" en Warcraft 3. Funciona mejor ya que todos los jugadores están aliados (al menos inicialmente) y el equipo contrario se libera más tarde.
Kroltan
Esto también tiene la ventaja de sentirse menos injusto. Si engendras al azar y mueres rápidamente o sufres penalizaciones, eso puede parecer injusto, incluso si es bastante justo. Si eliges dónde generar la muerte o las penalizaciones, puede parecer menos injusto y castigador porque elegir los puntos de generación es una habilidad en sí misma y algo en lo que puedes mejorar. Dicho esto, si elegir puntos de generación es realmente difícil, también podría parecer injusto porque los jugadores con más habilidades lo harían mucho mejor.
Anubian Noob
9

Comprender los requisitos

  1. 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.

  1. 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.

  1. 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.

  1. 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.

Theraot
fuente
6

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.

  • Armas más cercanas / mejores al alcance / más recursos
  • Mejor cobertura / más oculto / resumen
  • el "flujo" de los jugadores, algunos lugares son más atractivos que otros (piense en un mapa forestal completo con una sola casa en un lugar, independientemente de dónde esté esa casa, es muy probable que la gente lo esté mirando)

¿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)

Zibelas
fuente
5

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.

Aric
fuente
2
O haga un mapa que, bueno, en el centro, pueda ser cazado o cazar mucho más fácilmente, y también puede encontrar botín más fácil, pero nuevamente, es mucho más posible ser cazado de esta manera, y en áreas no centrales, haga para que los jugadores tengan menos probabilidades de encontrar otros usuarios y botín, por lo que si quieren más botín tendrán que ir al centro, si quieren sobrevivir más tiempo, tendrán que quedarse donde están. Básicamente, hacer que la desventaja de los engendros aleatorios sea una ventaja.
Ave
4

Aquí hay algunas soluciones posibles:

  • Engendrar al azar en la circunferencia del círculo
  • Se genera aleatoriamente en radios (no se genera para cerrar el centro)
  • Agregar un componente de tiempo de generación aleatorio

Diagrama de mecanismos de desove

dnk drone.vs.drones
fuente
La segunda imagen es una gran opción. Resuelve el problema de la primera opción donde el jugador sabe exactamente dónde se encuentran todos los demás jugadores.
Zanon
@Zanon, aunque con la primera imagen, los jugadores pueden (y probablemente lo harán) alejarse antes de que alguien venga allí. El segundo causará engendros injustos, algunos cercanos a otros. Tal vez algo como esto donde hay 2 círculos y la diferencia entre uno más pequeño y uno más grande es donde se generan, así que como la segunda imagen, pero menos al centro.
Ave
1

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:

  • No hay jugadores actualmente en él
  • Más de cero jugadores en nodos cercanos (algunos pocos enlaces de distancia)

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 knecesidad 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:

  • Agregue una penalización temporal para anotar si un jugador se ha generado en ese nodo recientemente, para evitar que se formen puntos de estrangulamiento (un flujo interminable de jugadores que vienen de la misma dirección y son eliminados)
  • Agregue aleatoriedad dentro de un rango (por ejemplo, elija los mejores 3 nodos y luego elija aleatoriamente entre ellos con la misma probabilidad) para obtener más variación.
  • Agregue un peso inicial al centro del mapa (o los puntos más interesantes) cuando aún no haya aparecido nadie, de modo que genere en lugares conocidos, incluso cuando cada nodo tenga una puntuación de cero porque no hay otros jugadores presentes.
MrCranky
fuente
0

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.

Aaron
fuente
0

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 jgenera x = (pjW/N) mod W, y = (qjH/N) mod H, donde W,Hestán las dimensiones del rectángulo, Nes el número de jugadores, y p,qson enteros por determinar; son distintos, (probablemente) relativamente primos, y no muy lejos sqrt(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.

Anton Sherwood
fuente
0

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)

El tamaño del mapa no tiene que aumentar proporcionalmente al número de jugadores.

Para lidiar con esto, puede hacer una de dos cosas: (o ambas)

  • Disminuye el tamaño de los cuadros que no se generan según el número de jugadores.
  • Permite que hasta X jugadores enemigos se generen en cada casilla.
    • Este número puede aumentar a medida que avanza (a partir de 0).
    • Variante 1: tener una caja más pequeña de no generación y una caja más grande de generación limitada.
    • Variante 2: probabilidades de peso según la proximidad del nuevo engendro a este jugador (si está dentro de la caja); puede ser difícil de implementar de manera eficiente.
NotThatGuy
fuente