En otra pregunta, me ayudaste a construir un algoritmo de simulación para el fútbol. I got some very good answers there. ¡Gracias de nuevo!Mejorando el algoritmo de simulación de fútbol
Ahora he codificado este algoritmo. Me gustaría mejorarlo y encontrar pequeños errores que podrían estar en él. No quiero discutir cómo resolverlo, como lo hicimos en la última pregunta. Ahora solo quiero mejorarlo. ¿Puedes ayudarme otra vez por favor?
- ¿Hay algún error?
- ¿Está bien la estructura de las cláusulas if anidadas? Podría ser mejorado?
- ¿Están las tácticas integradas correctamente según mi descripción?
ajustes tácticos que deben tener una influencia sobre la aleatoriedad:
- $ tácticas [x] [0] ajuste (1 = defensiva, 2 = neutral, 3 = ofensivo): cuanto mayor el valor es más débil es la defensa y más fuerte es la ofensa
- $ tactics x velocidad de juego (1 = lento, 2 = medio, 3 = rápido): cuanto mayor es el valor, mejores son las oportunidades pero mayor es el riesgo de obtener un contraataque rápido
- $ tactics x distancia de pases (1 = short, 2 = medium, 3 = long): cuanto mayor sea el valor, menos oportunidades obtendrás y cuanto más a menudo estés fuera de juego
- $ tactics x creación de cambios (1 = seguro, 2 = medio, 3 = arriesgado): cuanto mayor sea el valor, mejores serán sus oportunidades, pero mayor será el riesgo de obtener un contraataque rápido
- $ tactics [x] [4] pressure in defense (1 = bajo, 2 = medio, 3 = alto): cuanto mayor sea el valor, más contraataques rápidos tendrá
- $ tactics [x] [5] agresividad (1 = bajo, 2 = medio, 3 = alto) : cuanto mayor sea el valor, más ataques se detendrán por fouls
Nota: Tactic 0 y Tactic 4 están parcialmente integrados en el resto del motor, no son necesarios en esta función.
El algoritmo actual:
<?php
function tactics_weight($wert) {
$neuerWert = $wert*0.1+0.8;
return $neuerWert;
}
function strengths_weight($wert) {
$neuerWert = log10($wert+1)+0.35;
return $neuerWert;
}
function Chance_Percent($chance, $universe = 100) {
$chance = abs(intval($chance));
$universe = abs(intval($universe));
if (mt_rand(1, $universe) <= $chance) {
return true;
}
return false;
}
function simulate_attack($teamname_att, $teamname_def, $strength_att, $strength_def) {
global $minute, $goals, $_POST, $matchReport, $fouls, $yellowCards, $redCards, $offsides, $shots, $tactics;
// input values: attacker's name, defender's name, attacker's strength array, defender's strength array
// players' strength values vary from 0.1 to 9.9
$matchReport .= '<p>'.$minute.'\': '.comment_action($teamname_att, 'attack');
$offense_strength = $strength_att['forwards']/$strength_def['defenders'];
$defense_strength = $strength_def['defenders']/$strength_att['forwards'];
if (Chance_Percent(50*$offense_strength*tactics_weight($tactics[$teamname_att][1])/tactics_weight($tactics[$teamname_att][2]))) {
// attacking team passes 1st third of opponent's field side
$matchReport .= ' '.comment_action($teamname_def, 'advance');
if (Chance_Percent(25*tactics_weight($tactics[$teamname_def][5]))) {
// the defending team fouls the attacking team
$fouls[$teamname_def]++;
$matchReport .= ' '.comment_action($teamname_def, 'foul');
if (Chance_Percent(43)) {
// yellow card for the defending team
$yellowCards[$teamname_def]++;
$matchReport .= ' '.comment_action($teamname_def, 'yellow');
}
elseif (Chance_Percent(3)) {
// red card for the defending team
$redCards[$teamname_def]++;
$matchReport .= ' '.comment_action($teamname_def, 'red');
}
// indirect free kick
$matchReport .= ' '.comment_action($teamname_att, 'iFreeKick');
if (Chance_Percent(25*strengths_weight($strength_att['forwards']))) {
// shot at the goal
$shots[$teamname_att]++;
$matchReport .= ' '.comment_action($teamname_att, 'iFreeKick_shot');
if (Chance_Percent(25/strengths_weight($strength_def['goalkeeper']))) {
// attacking team scores
$goals[$teamname_att]++;
$matchReport .= ' '.comment_action($teamname_att, 'shot_score');
}
else {
// defending goalkeeper saves
$matchReport .= ' '.comment_action($teamname_def, 'iFreeKick_shot_save');
}
}
else {
// defending team cleares the ball
$matchReport .= ' '.comment_action($teamname_def, 'iFreeKick_clear');
}
}
elseif (Chance_Percent(17)*tactics_weight($tactics[$teamname_att][2])) {
// attacking team is caught offside
$offsides[$teamname_att]++;
$matchReport .= ' '.comment_action($teamname_def, 'offside');
}
else {
// attack isn't interrupted
// attack passes the 2nd third of the opponent's field side - good chance
$matchReport .= ' '.comment_action($teamname_def, 'advance_further');
if (Chance_Percent(25*tactics_weight($tactics[$teamname_def][5]))) {
// the defending team fouls the attacking team
$fouls[$teamname_def]++;
$matchReport .= ' '.comment_action($teamname_def, 'foul');
if (Chance_Percent(43)) {
// yellow card for the defending team
$yellowCards[$teamname_def]++;
$matchReport .= ' '.comment_action($teamname_def, 'yellow');
}
elseif (Chance_Percent(3)) {
// red card for the defending team
$redCards[$teamname_def]++;
$matchReport .= ' '.comment_action($teamname_def, 'red');
}
if (Chance_Percent(19)) {
// penalty for the attacking team
$shots[$teamname_att]++;
$matchReport .= ' '.comment_action($teamname_att, 'penalty');
if (Chance_Percent(77)) {
// attacking team scores
$goals[$teamname_att]++;
$matchReport .= ' '.comment_action($teamname_att, 'shot_score');
}
elseif (Chance_Percent(50)) {
// shot misses the goal
$matchReport .= ' '.comment_action($teamname_att, 'penalty_miss');
}
else {
// defending goalkeeper saves
$matchReport .= ' '.comment_action($teamname_def, 'penalty_save');
}
}
else {
// direct free kick
$matchReport .= ' '.comment_action($teamname_att, 'dFreeKick');
if (Chance_Percent(33*strengths_weight($strength_att['forwards']))) {
// shot at the goal
$shots[$teamname_att]++;
$matchReport .= ' '.comment_action($teamname_att, 'dFreeKick_shot');
if (Chance_Percent(33/strengths_weight($strength_def['goalkeeper']))) {
// attacking team scores
$goals[$teamname_att]++;
$matchReport .= ' '.comment_action($teamname_att, 'shot_score');
}
else {
// defending goalkeeper saves
$matchReport .= ' '.comment_action($teamname_def, 'dFreeKick_shot_save');
}
}
else {
// defending team cleares the ball
$matchReport .= ' '.comment_action($teamname_def, 'dFreeKick_clear');
}
}
}
elseif (Chance_Percent(62*strengths_weight($strength_att['forwards'])*tactics_weight($tactics[$teamname_att][2])*tactics_weight($tactics[$teamname_att][3]))) {
// shot at the goal
$shots[$teamname_att]++;
$matchReport .= ' '.comment_action($teamname_att, 'shot');
if (Chance_Percent(30/strengths_weight($strength_def['goalkeeper']))) {
// the attacking team scores
$goals[$teamname_att]++;
$matchReport .= ' '.comment_action($teamname_att, 'shot_score');
}
else {
if (Chance_Percent(50)) {
// the defending defenders block the shot
$matchReport .= ' '.comment_action($teamname_def, 'shot_block');
}
else {
// the defending goalkeeper saves
$matchReport .= ' '.comment_action($teamname_def, 'shot_save');
}
}
}
else {
// attack is stopped
$matchReport .= ' '.comment_action($teamname_def, 'stopped');
if (Chance_Percent(15*$defense_strength*tactics_weight($tactics[$teamname_att][1])*tactics_weight($tactics[$teamname_att][3])*tactics_weight($tactics[$teamname_def][4]))) {
// quick counter attack - playing on the break
$strength_att['defenders'] = $strength_att['defenders']*0.8; // weaken the current attacking team's defense
$matchReport .= ' '.comment_action($teamname_def, 'quickCounterAttack');
$matchReport .= ' ['.$goals[$_POST['team1']].':'.$goals[$_POST['team2']].']</p>'; // close comment line
return simulate_attack($teamname_def, $teamname_att, $strength_def, $strength_att); // new attack - this one is finished
}
}
}
}
// attacking team doesn't pass 1st third of opponent's field side
elseif (Chance_Percent(15*$defense_strength*tactics_weight($tactics[$teamname_att][1])*tactics_weight($tactics[$teamname_att][3])*tactics_weight($tactics[$teamname_def][4]))) {
// attack is stopped
// quick counter attack - playing on the break
$matchReport .= ' '.comment_action($teamname_def, 'stopped');
$strength_att['defenders'] = $strength_att['defenders']*0.8; // weaken the current attacking team's defense
$matchReport .= ' '.comment_action($teamname_def, 'quickCounterAttack');
$matchReport .= ' ['.$goals[$_POST['team1']].':'.$goals[$_POST['team2']].']</p>'; // close comment line
return simulate_attack($teamname_def, $teamname_att, $strength_def, $strength_att); // new attack - this one is finished
}
else {
// ball goes into touch - out of the field
$matchReport .= ' '.comment_action($teamname_def, 'throwIn');
if (Chance_Percent(33)) {
// if a new chance is created
if (Chance_Percent(50)) {
// throw-in for the attacking team
$matchReport .= ' '.comment_action($teamname_def, 'throwIn_att');
$matchReport .= ' ['.$goals[$_POST['team1']].':'.$goals[$_POST['team2']].']</p>'; // close comment line
return simulate_attack($teamname_att, $teamname_def, $strength_att, $strength_def); // new attack - this one is finished
}
else {
// throw-in for the defending team
$matchReport .= ' '.comment_action($teamname_def, 'throwIn_def');
$matchReport .= ' ['.$goals[$_POST['team1']].':'.$goals[$_POST['team2']].']</p>'; // close comment line
return simulate_attack($teamname_def, $teamname_att, $strength_def, $strength_att); // new attack - this one is finished
}
}
}
$matchReport .= ' ['.$goals[$_POST['team1']].':'.$goals[$_POST['team2']].']</p>'; // close comment line
return TRUE; // finish the attack
}
Actualización (2014): Unos años más tarde, me han dado a conocer ahora la base de código completo del juego como open-source on GitHub. Encontrará la implementación específica de esta simulación in this file, si alguien está interesado.
No estoy seguro de Stackoverflow tiempo es el lugar adecuado para discutir 191 LOC. Especialmente ya que probablemente sea el único que sabe si su código es 100% semánticamente correcto. Sugerencia: elija un idioma, no mezcle inglés y alemán en su código. – middus
@middus: Lo siento. Escribí el código en alemán pero traduje todas las partes importantes al inglés para ti. Quizás una pregunta estúpida: ¿Qué es "191 LOC"? Pensé que alguien podría ayudarme porque todos los datos necesarios están en la pregunta. Veamos ... – caw
LOC = Líneas de código –