Note that there are some explanatory texts on larger screens.

plurals
  1. POImproving soccer simulation algorithm
    primarykey
    data
    text
    <p>In another question, you helped me to build a simulation algorithm for soccer. <a href="https://stackoverflow.com/questions/1427043/soccer-simulation-for-a-game">I got some very good answers there.</a> Thanks again!</p> <p>Now I've coded this algorithm. I would like to improve it and find little mistakes which could be in it. I don't want to discuss how to solve it - as we did in the last question. Now I only want to improve it. Can you help me again please?</p> <ol> <li>Are there any mistakes?</li> <li>Is the structure of the nested if-clauses ok? Could it be improved?</li> <li>Are the tactics integrated correctly according to my description?</li> </ol> <p><strong>Tactical settings which should have an influence on the randomness:</strong></p> <ul> <li>$tactics[x][0] adjustment (1=defensive, 2=neutral, 3=offensive): the higher the value is the weaker is the defense and the stronger is the offense</li> <li>$tactics<a href="https://stackoverflow.com/questions/1427043/soccer-simulation-for-a-game">x</a> speed of play (1=slow, 2=medium, 3=fast): the higher the value is the better are the opportunities but the higher is the risk of getting a quick counter attack</li> <li>$tactics<a href="https://github.com/delight-im/Ballmanager" rel="nofollow noreferrer">x</a> distance of passes (1=short, 2=medium, 3=long): the higher the value is the less but better opportunities you get and the more often you are offside</li> <li>$tactics<a href="https://github.com/delight-im/Ballmanager/blob/master/Website/aa_spieltag_simulation.php" rel="nofollow noreferrer">x</a> creation of changes (1=safe, 2=medium, 3=risky): the higher the value is the better are your opportunities but the higher is the risk of getting a quick counter attack</li> <li>$tactics[x][4] pressure in defense (1=low, 2=medium, 3=high): the higher the value is the more quick counter attacks you will have</li> <li>$tactics[x][5] aggressivity (1=low, 2=medium, 3=high): the higher the value is the more attacks you will stop by fouls</li> </ul> <p><strong>Note:</strong> Tactic 0 and tactic 4 are partly integrated in the rest of the engine, not needed in this function.</p> <p><strong>The current algorithm:</strong></p> <pre><code>&lt;?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) &lt;= $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 .= '&lt;p&gt;'.$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']].']&lt;/p&gt;'; // 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']].']&lt;/p&gt;'; // 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']].']&lt;/p&gt;'; // 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']].']&lt;/p&gt;'; // 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']].']&lt;/p&gt;'; // close comment line return TRUE; // finish the attack } </code></pre> <p><strong>Update (2014):</strong> A few years later, I have now released the full code base of the game as <a href="https://github.com/delight-im/Ballmanager" rel="nofollow noreferrer">open-source on GitHub</a>. You'll find the specific implementation of this simulation <a href="https://github.com/delight-im/Ballmanager/blob/master/Website/aa_spieltag_simulation.php" rel="nofollow noreferrer">in this file</a>, if anyone is interested.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload