2009-09-03 6 views
6

En un juego de manager en línea (como Hattrick), quiero simular partidos entre dos equipos.Simulando partidos deportivos en el juego en línea

Un equipo consta de 11 jugadores. Cada jugador tiene un valor de fuerza entre 1 y 100. Tomo estos valores de fuerza de los jugadores defensivos para cada equipo y calculo el promedio. Esa es la calidad defensiva de un equipo. Luego tomo las fortalezas de los jugadores ofensivos y obtengo la calidad ofensiva.

Para cada ataque, hago lo siguiente:

$offFactor = ($attackerTeam_offensive-$defenderTeam_defensive)/max($attackerTeam_offensive, $defenderTeam_defensive); 
$defFactor = ($defenderTeam_defensive-$attackerTeam_offensive)/max($defenderTeam_defensive, $attackerTeam_offensive); 

Por el momento, no sé por qué lo divido por el mayor uno de los dos valores. Pero esta fórmula debería darle un factor para la calidad de la ofensa y defensa que se necesita más adelante.

Luego he anidado declaraciones condicionales para cada evento que podría suceder. P.g .: ¿El equipo atacante tiene una oportunidad de gol?

if ((mt_rand((-10+$offAdditionalFactor-$defAdditionalFactor), 10)/10)+$offFactor >= 0) 
{ ... // the attack succeeds 

Estos factores adicionales pueden ser valores tácticos, por ejemplo.

¿Crees que esta es una buena forma de calcular un juego? Mis usuarios dicen que no están satisfechos con la calidad de las simulaciones. ¿Cómo puedo mejorarlos? ¿Tiene diferentes enfoques que podrían dar mejores resultados? ¿O crees que mi enfoque es bueno y solo necesito ajustar los valores en las declaraciones condicionales y experimentar un poco?

Espero que me puedan ayudar. ¡Gracias por adelantado!

+0

¿Qué representan los 10 en los cálculos específicamente en esta simulación? –

+0

¿Qué pasa con la calidad de las simulaciones con las que no están satisfechas? –

+0

@Kyle Walsh: Los 10 solo se usan porque las funciones mt_rand() solo toman valores enteros. Quiero generar un valor aleatorio entre -1 (o superior dependiendo de factores adicionales) y +1 como valor de coma flotante. – caw

Respuesta

19

Aquí hay una forma en que lo haría.

Calidad ofensivo/defensivo

En primer lugar permite trabajar a cabo la resistencia media de todo el equipo:

Team.Strength = SUM(Players.Strength)/11 

Ahora queremos dividir a lado en dos, y se calcula la media para nuestra jugadores defensivos, y nuestros jugadores ofensivos.]

Defense.Strength = SUM(Defensive_Players.Strength)/Defensive_Players.Count 
Offense.Strength = SUM(Offense_Players.Strength)/Offense_Players.Count 

Ahora, tenemos tres valores. El primer promedio del Equipo, se usará para calcular nuestras probabilidades de ganar. Los otros dos, vamos a calcular nuestras probabilidades de defender y nuestras probabilidades de anotar.

Un equipo con un promedio ofensivo alto va a tener más oportunidades, un equipo con una defensa alta tendrá más posibilidades de ahorrar.

Ahora bien, si tenemos a los equipos, vamos a llamarlos A y B.

Equipo A, tienen un promedio de 80, una puntuación ofensiva de 85 y una puntuación defensiva de 60.

Equipo B, tener un promedio de 70, un puntaje ofensivo de 50 y un puntaje defensivo de 80.

Ahora, basado en la media. El equipo A debería tener más posibilidades de ganar. Pero por cuánto?

Puntuación y Ahorro de

Vamos a averiguar cuántas veces los objetivos del equipo A debe anotar:

A.Goals = (A.Offensive/B.Defensive) + RAND() 
     = (85/80) + 0.8; 
     = 1.666 

he asumido el valor aleatorio añade nada entre -1 y 1, aunque puede hacerlo ajustar esto

Como podemos ver, la fórmula indica que el equipo A debe marcar 1,6 goles. podemos redondear esto arriba/abajo. O dele el equipo A 1 y calcule si el otro está permitido (posibilidad aleatoria).

Ahora, para el equipo B

B.Goals = (B.Offensive/A.Defensive) + RAND() 
     = (50/60) + 0.2; 
     = 1.03 

así que tenemos una puntuación de 1 y B anotando 1. Pero recuerde, queremos ponderar esto a favor de A, ya que, en general, son el mejor equipo.

Entonces, ¿cuál es la probabilidad de que A gane?

Chance A Will Win = (A.Average/B.Average) 
        = 80/70 
        = 1.14 

Así que podemos ver que las probabilidades son 14% (0,14) a favor de que A gane el partido. Podemos utilizar este valor para ver si hay algún cambio en la puntuación final:

if Rand() <= 0.14 then Final Score = A 2 - 1 B Otherwise A 1 - 1 B 

Si nuestro número al azar fue de 0,8, entonces el partido es un empate.

Redondeo y Otros Pensamientos

Definitivamente va a querer jugar con los valores. Recuerde, la mecánica del juego es muy difícil de entender. Habla con tus jugadores, pregúntales por qué están insatisfechos. ¿Hay equipos siempre perdiendo? ¿Las simulaciones están siempre estancadas? etc.

El esquema anterior se ve profundamente afectado por la aleatoriedad de la selección. Deberá normalizarlo, por lo que las posibilidades de que un equipo obtenga 5 goles extra es muy raro. Pero un poco de aleatoriedad es una gran manera de agregar algo de variedad al juego.

También hay formas de editar este método. Por ejemplo, en lugar de la cantidad de goles, podría usar la figura de Gol como el número de oportunidades de gol, y luego tener otra función que resuelva el número de goles según otros factores (es decir, elegir un golpe aleatorio y usar ese jugador individualmente). estadísticas y los porteros, para averiguar si hay un objetivo)

Espero que esto ayude.

+0

¡Muchas gracias! :) Por favor, eche un vistazo a mi comentario a la respuesta de Kylotan sobre la división. ¿Crees que la división es más adecuada que la diferencia? – caw

+0

¿Por qué B.Goals = (B.Offensive/A.Defensive) + RAND()? – Mathias

+0

@Mathias De la misma manera que tomamos A.Goals = (A.Offensive/B.Defensive) + RAND() cambiamos la variable para B.Goals. Comparamos la ofensiva de cada equipo contra la defensa de los equipos contrarios. El azar tiene alguna variación. – AAA

0

El promedio debe ser el número de jugadores ... usando al máximo significa que si tiene 3 equipos de jugador:

[4 4 4]

[7 4 1]

la segunda uno sería considerado más débil. ¿Es eso lo que quieres? Creo que preferirías hacer algo como:

(Total de puntuaciones/Total de jugadores) + (Puntuación máxima/Total de jugadores), por lo que en el ejemplo anterior, mejoraría un poco el segundo equipo.

Supongo que depende de cómo se sienta que los equipos deben estar equilibrados.

+0

Gracias por su respuesta. Sé cómo calcular los valores promedio y ya lo he implementado. $ attackerTeam_offensive es el promedio de la ofensiva del atacante y $ defenderTeam_defensive es el promedio de la defensa del atacante. Pero no sé por qué divido su diferencia por la más alta de ambos valores. Y no sé si mi técnica/método es bueno. – caw

3

La división en su ejemplo probablemente sea una mala idea, porque cambia la escala de la variable de salida dependiendo de qué lado sea mejor. En general, cuando se comparan dos cantidades, se desean datos de intervalo (restar uno de otro) o datos de relación (dividir uno por el otro) pero no ambos.

Un mejor enfoque en este caso sería simplemente dividir el puntaje ofensivo por el puntaje defensivo. Si ambos son iguales, el resultado será 1. Si el atacante es mejor que el defensor, será mayor que 1, y si el defensor es más fuerte, será menor a uno. Estos son números fáciles de trabajar.

Además, en lugar de promediar todo el equipo, las partes promedio del equipo dependen de las formaciones o tácticas utilizadas. Esto les permitirá a los equipos elegir jugar ofensivamente o defensivamente y ver los pros y contras de esto.

Y escriba usted mismo algunas mejores funciones de generación de números aleatorios. Uno que devuelve valores de punto flotante entre -1 y 1 y uno que funciona de 0 a 1, para principiantes. Úselos en sus cálculos y puede evitar todos esos 10 confusos en todas partes.

+0

¡Muchas gracias! No creo que dividir los dos valores de fuerza sea una buena idea. Los factores cambiarán de una manera desequilibrada y obtendrás una parábola: 6/1 = 6, 6/2 = 3, 6/3 = 2 Este no debería ser el caso, ¿o sí? La diferencia es una forma bastante mejor, creo. – caw

+0

Otro argumento en contra de la división: Los valores de 4/2 a 4/3 están cayendo, mientras que los valores de 2/4 a 3/4 están aumentando. Eso es totalmente indeseable, ¿no? Esto significaría: como equipo local, es bueno ser más fuerte. Como equipo invitado, es bueno ser más débil. ;) – caw

+0

Ya tomo los promedios de partes del equipo. Tengo $ attackTeam_offensive y $ attackTeam_defensive. ¿O quieres decir que incluso debería dividir la ofensiva en varias partes, como el lado derecho y el izquierdo? – caw

3

Puede que quiera preguntar a los usuarios qué sobre la simulación no les gusta. Es posible que, en lugar de ver el resultado final del juego, quieran saber cuántas veces su equipo tuvo la oportunidad de atacar, pero la defensa recuperó el control. Así que en lugar de

"Your team wins 2-1"

Ellos quieren ver las mejores jugadas:

 
"Your team wins 2-1: 
- scored at minute 15, 
- other team took control and went for tried for a goal at minute 30, 
    but the shoot was intercepted, 
- we took control again and $PLAYER1 scored a beautiful goal! 
... etc 

se puede usar algo parecido a lo que Jamie sugiere un punto de inicio, seleccione los tiempos al azar, y tal vez recoger que marcó el gol basado en un muestreo ponderado de los jugadores ofensivos (es decir, un jugador con un puntaje más alto tiene una mayor probabilidad de ser el que anotó). Puede divertirse y agregar eventos aleatorios de baja probabilidad como una tarjeta roja en un jugador, alguien que se lastime, streakers en el campo ...

4

La decisión táctica más básica en el fútbol es elegir formation, que es un conjunto de tres números que asignan los 10 jugadores de campo a la defensa, centro del campo y ataque, respectivamente, por ejemplo 4/4/2.

Si usa una fuerza de jugador promedio, no solo pierde esa táctica, la hace retroceder: la defensa más fuerte es una con un solo jugador muy bueno, darle cualquier ayuda lo hará más probable que el otro equipo Puntuación. Si tiene un jugador con una calificación de 10, el promedio es 10. Agregue otro con una calificación de 8, y el promedio caiga (a 9). Pero asignar más personas a la defensa debería hacerlo más fuerte, no más débil.

Lo primero, quiere que todo se base en el total, no en el promedio. La relación entre los totales es una buena forma independiente de escala de determinar qué equipos son más fuertes y en qué medida. Las proporciones tienden a ser mejores que las diferencias, porque funcionan de manera predecible con equipos de cualquier rango de fortalezas. Puede configurar un combat results table que indique cuántos objetivos se puntúan (por juego, por medio, por jugada o lo que sea).

La siguiente elección táctica es si es mejor tener un jugador excepcional o varios buenos. Puedes hacer que eso importe al configurar escenarios que representan cosas que suceden en el juego, p. un 1 en 1, una esquina o una pelota larga. Los jugadores involucrados en un escenario primero se eligen al azar, luego se realiza el rodaje del resultado del escenario. Un resultado puede ser que se inicie otro escenario (el pase del mediocampo lleva al cruce conduce a la posibilidad del encabezado).

El paso final, lo que traerá más o menos hasta el nivel de los juegos reales de gerente de fútbol, ​​es dar a los jugadores más de un tipo de calificación de fortaleza, por ejemplo, el título, pases, tiros, y así sucesivamente. Luego, usa la clasificación de resistencia apropiada para el escenario en el que se encuentra.

+0

¡Gracias! "Tienes que ir hacia atrás: la defensa más fuerte es una con un solo jugador muy bueno, darle cualquier ayuda hará que sea más probable que el otro equipo anote". ¿Puedes explicar esto más detallado? ¿Entonces tomarías la razón en lugar de la diferencia? – caw

+2

Si tiene un jugador con una calificación de 10, el promedio es 10. Agregue otro con una calificación de 8, y el promedio caiga (a 9). Pero asignar más personas a la defensa debería hacerlo más fuerte, no más débil. Las proporciones tienden a ser mejores que las diferencias, porque funcionan de manera predecible con equipos de cualquier rango de fortalezas. – soru

Cuestiones relacionadas