Футбольный симулятор для игры - PullRequest
28 голосов
/ 15 сентября 2009

Я хотел бы создать симулятор, который может симулировать футбольный матч (футбольный матч). Было бы здорово, если бы вы могли мне помочь. Для меня важно решить, какие действия произойдут. Прослушиватели событий для каждого действия могут быть легко реализованы позже. Функция должна только имитировать результаты игры и комментировать происходящие действия. Не требуется 2D / 3D графика. Мы говорим об играх типа Hattrick .


Я бы предложил, чтобы сначала у вас был массив минут с действиями.

$ минут = массив (1, 3, 4, 7, 11, 13, ..., 90, 92);

В течение каждой из этих минут вы можете смоделировать атаку.

Атакующая команда определяется кубиками до: $ attackcking = mt_rand (1, 2);

Так что наиболее важной для меня частью является функция атаки.

Пожалуйста, измените мой подход или используйте его в качестве образца. Можете ли вы помочь мне улучшить это? Функция должна быть сложной, чтобы результаты были максимально реалистичными. Но вам нужно найти что-то между высокой предсказуемостью и слишком случайными результатами. Я только хочу улучшить эту функцию.

Мой подход:

<?php
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, $schuesse, $taktiken;
    // 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
    // ADJUSTMENT START
    switch ($taktiken[$teamname_att][0]) {
        case 1: $strength_att['defenders'] *= 1.1; $strength_att['forwards'] *= 0.9; break;
        case 3: $strength_att['defenders'] *= 0.9; $strength_att['forwards'] *= 1.1; break;
    }
    switch ($taktiken[$teamname_def][0]) {
        case 1: $strength_def['defenders'] *= 1.1; $strength_def['forwards'] *= 0.9; break;
        case 3: $strength_def['defenders'] *= 0.9; $strength_def['forwards'] *= 1.1; break;
    }
    // ADJUSTMENT END
    $matchReport .= '<p>'.$minute.'\': '.comment($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*($taktiken[$teamname_att][2]/2)*($taktiken[$teamname_att][3]/2))) {
        // attacking team passes 1st third of opponent's field side
        $matchReport .= ' '.comment($teamname_def, 'attack_advance');
        if (Chance_Percent(25*($taktiken[$teamname_def][4]/2))) {
            // the defending team fouls the attacking team
            $fouls[$teamname_def]++;
            $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul');
            if (Chance_Percent(43)) {
                // yellow card for the defending team
                // chance is correct for my purpose
                $yellowCards[$teamname_def]++;
                $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_yellow');
            }
            elseif (Chance_Percent(3)) {
                // red card for the defending team
                // chance is correct for my purpose (only 1.43% because it's an alternative way)
                $redCards[$teamname_def]++;
                $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_red');
            }
            // indirect free kick
            // only 58.23% because it's an alternative way
            $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_iFreeKick');
            if (Chance_Percent(25)) {
                // shot at the goal
                $schuesse[$teamname_att]++;
                $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_iFreeKick_shot');
                if (Chance_Percent(25)) {
                    // attacking team scores (6.25% chance)
                    $goals[$teamname_att]++;
                    $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_iFreeKick_shot_score');
                }
                else {
                    // defending goalkeeper saves
                    // only 18.75% because it's an alternative way
                    $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_iFreeKick_shot_save');
                }
            }
            else {
                // defending team cleares the ball
                // only 75% because it's an alternative way
                $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_iFreeKick_clear');
            }
        }
        elseif (Chance_Percent(17)) {
            // attacking team is caught offside
            // only 4.25% because it's an alternative way
            $offsides[$teamname_att]++;
            $matchReport .= ' '.comment($teamname_def, 'attack_advance_offside');
        }
        else {
            if (Chance_Percent(25*($taktiken[$teamname_def][5]/2))) {
                // the defending team fouls the attacking team
                $fouls[$teamname_def]++;
                $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul');
                if (Chance_Percent(43)) {
                    // yellow card for the defending team
                    // chance is correct for my purpose
                    $yellowCards[$teamname_def]++;
                    $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_yellow');
                }
                elseif (Chance_Percent(3)) {
                    // red card for the defending team
                    // chance is correct for my purpose (only 1.43% because it's an alternative way)
                    $redCards[$teamname_def]++;
                    $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_red');
                }
                if (Chance_Percent(19)) {
                    // penalty for the attacking team
                    $schuesse[$teamname_att]++;
                    $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_penalty');
                    if (Chance_Percent(77)) {
                        // attacking team scores (77% chance according to Wikipedia)
                        $goals[$teamname_att]++;
                        $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_penalty_score');
                    }
                    elseif (Chance_Percent(50)) {
                        // shot misses the goal
                        // only 11.5% because it's an alternative way
                        $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_penalty_miss');
                    }
                    else {
                        // defending goalkeeper saves
                        // only 11.5% because it's an alternative way
                        $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_penalty_save');
                    }
                }
                elseif (Chance_Percent(28)) {
                    // direct free kick
                    // only 22.68% because it's an alternative way
                    $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_dFreeKick');
                    if (Chance_Percent(33)) {
                        // shot at the goal
                        $schuesse[$teamname_att]++;
                        $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_dFreeKick_shot');
                        if (Chance_Percent(33)) {
                            // attacking team scores (10.89% chance)
                            $goals[$teamname_att]++;
                            $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_dFreeKick_shot_score');
                        }
                        else {
                            // defending goalkeeper saves
                            $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_dFreeKick_shot_save');
                        }
                    }
                    else {
                        // defending team cleares the ball
                        // only 77% because it's an alternative way
                        $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_dFreeKick_clear');
                    }
                }
                else {
                    // indirect free kick
                    // only 58.23% because it's an alternative way
                    $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_iFreeKick');
                    if (Chance_Percent(25)) {
                        // shot at the goal
                        $schuesse[$teamname_att]++;
                        $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_iFreeKick_shot');
                        if (Chance_Percent(25)) {
                            // attacking team scores (6.25% chance)
                            $goals[$teamname_att]++;
                            $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_iFreeKick_shot_score');
                        }
                        else {
                            // defending goalkeeper saves
                            // only 18.75% because it's an alternative way
                            $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_iFreeKick_shot_save');
                        }
                    }
                    else {
                        // defending team cleares the ball
                        // only 75% because it's an alternative way
                        $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_iFreeKick_clear');
                    }
                }
            }
            else {
                // attack passes the 2nd third of the opponent's field side - good chance
                $matchReport .= ' '.comment($teamname_def, 'attack_advance_advance');
                if (Chance_Percent(62*($taktiken[$teamname_att][6]/2)*($taktiken[$teamname_att][7]/2)/($taktiken[$teamname_att][8]/2)*($taktiken[$teamname_att][9]/2)/($taktiken[$teamname_def][10]/2))) {
                    // shot at the goal
                    $schuesse[$teamname_att]++;
                    $matchReport .= ' '.comment($teamname_def, 'attack_advance_advance_shot');
                    if (Chance_Percent(30*$strength_def['goalkeeper']/7/($taktiken[$teamname_att][11]/2))) {
                        // the attacking team scores
                        // only 8.78% because it's an alternative way
                        // if goalkeeper has strenth 7 then chance is 8.78% otherwise lower/higher
                        $goals[$teamname_att]++;
                        $matchReport .= ' '.comment($teamname_def, 'attack_advance_advance_shot_score');
                    }
                    else {
                        if (Chance_Percent(50)) {
                            // the defending defenders block the shot
                            $matchReport .= ' '.comment($teamname_def, 'attack_advance_advance_shot_block');
                        }
                        else {
                            // the defending goalkeeper saves
                            $matchReport .= ' '.comment($teamname_def, 'attack_advance_advance_shot_save');
                        }
                    }
                }
            }
        }
    }
    // attacking team doesn't pass 1st third of opponent's field side
    elseif (Chance_Percent(15*$defense_strength*($taktiken[$teamname_att][12]/2)*($taktiken[$teamname_att][13]/2))) {
        // quick counter attack - playing on the break
        // only 7.5% because it's an alternative way
        // if defense has strength 7 then chance is 7.5% otherwise lower/higher
        $strength_att['defenders'] = $strength_att['defenders']*0.8; // weaken the current attacking team's defense
        $matchReport .= ' '.comment($teamname_def, 'attack_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($teamname_def, 'attack_throwIn');
        if (Chance_Percent(33)) {
            // if a new chance is created
            if (Chance_Percent(50)) {
                // throw-in for the attacking team
                $matchReport .= ' '.comment($teamname_def, 'attack_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($teamname_def, 'attack_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
}
?>

Тактические настройки, которые должны влиять на случайность:

  • корректировка (1 = оборонительный, 2 = нейтральный, 3 = наступательный): чем выше значение, тем слабее защита и сильнее нападение
  • скорость игры (1 = медленный, 2 = средний, 3 = быстрый): чем выше значение, тем лучше возможности, но тем выше риск получить быструю контратаку
  • расстояние проходов (1 = короткий, 2 = средний, 3 = длинный): чем выше значение, тем меньше, но лучше возможностей, которые вы получаете, и тем чаще вы находитесь вне игры
  • создание изменений (1 = безопасный, 2 = средний, 3 = рискованный): чем выше значение, тем лучше ваши возможности, но тем выше риск получить быструю контратаку
  • давление в обороне (1 = низкий, 2 = средний, 3 = высокий): чем выше значение, тем быстрее вы будете иметь контратаку
  • агрессивность (1 = низкая, 2 = средняя, ​​3 = высокая): чем выше значение, тем больше атак вы остановите фолами

Интеграция тактических настроек:

Все тактические настройки имеют значение, которое может быть «1», «2» или «3». «2» всегда нейтрально / среднее. Поэтому я делю значения на 2. Я получаю соотношение, которое составляет 0,5 или 1 или 1,5. Я думал, что тогда я мог бы легко умножить шансы на это, чтобы интегрировать тактическое влияние. Но возникла одна проблема: если я умножу шанс на 2 или более тактических значения, он может быть выше 100% (например, 60 x 1,5 x 1,5). Поэтому я не могу интегрировать тактику таким образом. Что еще я могу сделать?


Большое спасибо!

Обновление (2014): Несколько лет спустя я выпустил полную кодовую базу игры в виде открытого кода на GitHub . Вы можете найти конкретную реализацию этого моделирования в этом файле , если кому-то интересно.

Ответы [ 4 ]

35 голосов
/ 15 сентября 2009

Создайте симуляцию на основе веса (да, я только что изобрел этот термин). Каждая переменная (независимо от ее типа) имеет «вес». Например, у игроков есть вес. Хороший игрок имеет лишний вес. Игрок с травмой имеет меньший вес или вообще не ждет (или, может быть, отрицательный вес?).

Вы складываете весь вес вместе (обеих команд, потому что это футбольный матч). Этот вес напоминает процент вероятности выигрыша. Например;

Вес Команда А = 56 , вес Команда Б = 120

Вес уже показывает, что одна команда намного лучше (независимо от того, как вес был установлен ... может быть, у них очень круглые шары, кого это волнует), чем другая.

На основании веса вы можете рассчитать шанс на выигрыш; Шанс на победу Команда A = 32% , Шанс на победу Команда B = 68% .

Теперь вы можете написать алгоритм, имитирующий совпадение, под влиянием процента выигрыша. Я однажды написал такой алгоритм для рисования рекламы. В моем случае количество кликов на рекламу было весомым. Чем больше вес, тем больше шансов, что мой алгоритм выберет рекламу.

Я написал алгоритм, взяв большое число (например, 1000), а затем присвоил диапазон этого числа каждому рекламному объявлению на основе процентного содержания. В этом случае Team A получает диапазон 32% от 1000 , , который составляет 0 - 320, Team B получает диапазон 68%, который составляет 321 - 1000 . Тогда мой алгоритм нарисует число (случайным образом) между 0 и 1000. Рекламное объявление (или ваши команды) с наибольшим диапазоном (и, следовательно, с наибольшим шансом на выигрыш) имеет наибольшие шансы быть выбранным алгоритмом, хотя может получиться иначе .

Этот вид алгоритма отлично подходит (хотя и не идеален) для сбалансированного результата (если пользователи могут создавать свои собственные команды, покупать лучших игроков и т. Д.). Вы также можете создавать любые события в игре, нарисованные этим алгоритмом, просто добавив вес к событию.

Вы можете добавить вес к событию (например, травме товарища по команде) для каждой команды, основываясь на других весовых коэффициентах в этой команде (сколько матчей сыграно подряд, насколько хорошо (или сколько весит) их медперсонал и т. д.). Если вы правильно сделаете вес, вы можете получить очень сбалансированный (и легко расширяемый) алгоритм моделирования, который может быть как предсказуемым (как некоторые совпадения в реальной жизни), так и совершенно удивительным (опять же, как совпадение в реальной жизни).

UPDATE: Тактические влияния Вы добавили тактические влияния, а также вопрос «как бы вы это сделали?», Поэтому я уточню. В настоящее время вы делаете (насколько я понимаю), что вы берете процент (вероятность того, что что-то произойдет) и умножаете его на коэффициент, чтобы это происходило больше / меньше.

Однако, поскольку у вас может быть несколько коэффициентов, вы получите шанс больше 100%.

Прежде всего, для каждого тактического преимущества команды есть (вероятно) встречное преимущество в другой команде. Например, если команда А имеет вес в постановке целей, команда В имеет противовес в достижении целей. Эта сумма является вселенной (100%). Теперь вес обоих тактических преимуществ составляет часть этой вселенной, или общий вес (как я объяснил выше).

Скажите, что Команда A на 80% уверена в том, что она забьет гол в определенную минуту, а Команда B на 20% уверена в том, что она остановится (на основе системы весов) , Но, поскольку команда B только что приобрела очень хорошего вратаря, на команду B оказывает тактическое влияние. Это влияние должно сместить шанс события, но не саму вселенную! Другими словами, вы не должны иметь общий шанс более 100% (хотя в некоторых случаях это не обязательно плохо)

Итак, вы должны добавить вес в команду B , основываясь на тактическом влиянии, а затем пересчитать шансы на основе новых весов.

Назначение веса

Теперь, как вы прокомментировали, назначение веса не так просто. Конечно, нет, если вам приходится «взвешивать» игроков на их качествах. Взвешивание - это больше, чем просто сказать, что игрок «плохой» или «хороший», вы должны фактически оценить их (как в старшей школе!). Чем выше высшая оценка, тем точнее система взвешивания.

Теперь присваивать веса тактическим влияниям стало немного проще. Скажите, что у вас есть следующие влияния:

  • Остановка целей
  • Забивание голов
  • Защита
  • Атака

Теперь создайте пул с общим весом (скажем, 1000, мне нравится это число). Это «тактические очки», которые вы можете назначить. Эти четыре влияния составляют совпадение, поэтому вы можете назначить 250 очков каждому влиянию. Это число (250) - вселенная каждого влияния.

Назначение этих очков каждой команде зависит от весовых коэффициентов команды (например, есть ли у них хороший хранитель?)

Хранитель, например, весит против хранителя противника (и, возможно, также людей, которые находятся между хранителем и противником, но давайте будем простыми). Скажем, хранитель команды А весит 80% от общего количества, а хранитель команды Б - 20% . Это оценивает, насколько они хороши, что напрямую связано с тактическими очками, которые они получают. Таким образом, Команда A получает 80% из 250 очков за остановку , а Команда B получает 20% этих очков.

Остальные точки могут быть назначены одинаково. В моем примере я взял только двух хранителей, поскольку вселенная, остановлена ​​цель или нет. На самом деле, весовых факторов может быть намного больше (чтобы вы поняли).

После того, как все они разделены, вы можете использовать тактические очки, чтобы разобраться в матче. За каждую минуту вы можете пересчитать шанс на выигрыш. Каждую минуту вы также можете пересчитывать тактические влияния (скажем, другой игрок выходит на поле или игрок получает травму).

Да, вы получите МНОГО переменных. Но чем больше вы получаете, тем лучше играет матч. Чем больше переменных (или весов / противовесов), тем больше это похоже на реальную жизнь.

8 голосов
/ 15 сентября 2009

Ну, это будет сложно, но если вы хотите реально смоделировать футбольный матч, вам понадобится намного больше переменных, введенных в игру. Не вся ваша команда будет атаковать, у вас будут защитники, и эти защитники уменьшат силу атаки противоположной команды.

Я бы порекомендовал потоку что-то вроде этого:

1) Команда А имеет мяч на своей стороне поля. Будет пытаться забить. Сформируйте таблицу из 1-100 (0-99) и заполните ее следующими факторами: умение игрока из команды А, защитная способность противника, расстояние от цели, количество усталости (продолжительность игры). Эта таблица будет выглядеть примерно так (представьте +1, чтобы сделать ее проще, поэтому 1-100, а не 0-99):

  1. 1-50: игрок успешно продвигает мяч
  2. 51-60: игрок не может перевести мяч вперед, но сохраняет владение
  3. 61-73: игрок не может перевести мяч вперед и теряет владение
  4. 74-82: игрок передает мяч далеко в сторону другого нападающего
  5. 83-95: игрок теряет мяч и противник пытается забить
  6. 95-100: критический сбой: игрок теряет владение мячом и мгновенно уступает цель команде противника

2) В случае 1, бросьте снова, но теперь есть другой набор опций для того, чтобы быть на противоположной стороне. В четном из 2 снова сделайте тот же бросок на столе. В случае трех сделайте одинаковые броски для команды противника, но используйте другой стол, поскольку они ближе к цели. В случае 4, сделайте броски снова, но измените статистику игрока на Игрока 2 в Команде A, и предположите, что числа ближе к цели. В случае 5 бросьте стол, где противоборствующая команда либо преуспевает, либо проваливается, основываясь на умении случайного игрока. В случае шести немедленно поставьте цель противостоящей команде (в игре в футбол это случается менее, чем в 5% случаев, это больше похоже на 0,01%, но вы также можете бросить на другой стол критические сбои, которые включают травмы или выглядят глупо в течение десяти секунд).

3) Повторите процесс на основе результатов.

Я мог бы дать вам примеры кода, но я думаю, у вас есть основная идея.

ОБНОВЛЕНИЕ: Я думаю, что другие ответили, как учесть веса с помощью вашего метода. Мой метод на самом деле был бы другим, и я объясню здесь различия ...

1) Ваши расчеты в основном предполагают попытку достижения цели каждые столько минут, и в этот момент существует сложный набор вычислений, которые пытаются смоделировать вероятность того, что игрок забьет или не забьет. Мои расчеты предполагают, что мяч постоянно находится в игре и перемещается от одного набора возможных результатов к другому на основе серии статистических данных, а не рассматривается как серия ударов вперед и назад по воротам. Концептуально это будет отличаться, поскольку он следует за мячом, а не за игроками, и мячу будет назначено определенное количество возможностей, которые взвешиваются этими вышеупомянутыми факторами.

2) Метод, которым вы взвешиваете вещи, включает в себя несколько весов, которые, как другие описали, увеличивают ваши процентные изменения на определенную величину. В моем сценарии вы разбиваете шансы на таблицу так, чтобы всегда был абсолютный максимум 100 возможных результатов, а затем вы используете mt_rand, чтобы набрать число внутри этого набора результатов, которое часто называют таблицей совпадений. или лотерея.

Чтобы сделать это, у вас будут базовые шансы, а затем взвесите их, что даст вам возможность расти. Например, скажем, базовый шанс забить мяч - 10/100. Если кто-то равен 1, это становится 5. 2, оно остается 10. 3, это становится 15. Так что теперь, броски 0-14 гибко назначаются этим значениям, и другие значения в таблице попаданий смещаются для соответствия. Это вызывает проблемы с вероятностью позже, так как вам также следует гипотетически увеличивать таблицу, но это пассивно снижает вероятность попадания при переходе с 10/100 до 15/105 (с учетом всех других возможных результатов).

Если вы хотите продолжить путь, который вы уже начали, я думаю, что большинство из того, что я здесь говорю, не сработает, если вы просто не выбросите эти значения в таблицу и не рассчитаете их при каждой атаке, когда вы уже делаю.

Если вы хотите придерживаться своих текущих вложенных случайных утверждений, я бы сказал, воспользуйтесь одним из решений, предложенных другими. Удачи!

2 голосов
/ 15 сентября 2009

Я бы посоветовал вам перевести все ваши вероятности в проценты:

function Chance($chance, $universe = 100)
{
    $chance = abs(intval($chance));
    $universe = abs(intval($universe));

    if (mt_rand(1, $universe) <= $chance)
    {
        return true;
    }

    return false;
}

Chance(25); // 25%
Chance(5, 1000); // 0.5%

Кроме того, я бы только определил некоторые вероятности с условиями других, например:

if ($attack === true)
{
    if (Chance(15 * $aggressivity) === true)
    {
        if (Chance(10 * $aggressivity) === true)
        {
            // red card
        }

        else
        {
            // yellow card
        }
    }
}

РЕДАКТИРОВАТЬ: Я просто дома, и мне действительно нужно идти спать, но после быстрого взгляда на ваши изменения у меня просто возникла идея, которая может вас заинтересовать. Что если вместо использования значения регулировки 1, 2 или 3 вы не используете тактическую позицию команды? Например, команда с 4-4-2 имела бы меньше шансов забить гол против команды 5-3-2, чем с командой 3-3-4. Предполагая, что места размещения всегда триплеты (X-Y-Z), было бы довольно легко сравнить, какая команда показывает лучшие результаты в защите, передаче и выигрыше.

Простая формула может выглядеть примерно так:

A: 4-4-2 (Defending Team)
B: 3-2-5 (Attacking Team)

Вероятность того, что Б забьет гол, будет равна (4/5) ^ -1 = 0,2 = 20%, а обратная величина (результат команды А) составит (3/2) ^ -1 = 0,5 = 50%. PS: Похоже, сейчас это не имеет особого смысла, но я попытаюсь еще раз взглянуть на это утром.

И еще: после красной карточки, почему команда-неудачник осталась прежней? Он должен стать слабее (на одного игрока меньше) ИМО.

0 голосов
/ 15 сентября 2009

Это настоящий трюк, не так ли? Возможно, начните думать о том, какие переменные игроки и команды могут повлиять на успех и вероятность действия.

Поток программы может выглядеть следующим образом: 1. Подсчитайте, какое событие происходит на основе переменных, и пусть там тоже будет некоторая случайность 2. Рассчитайте вероятность успеха мероприятия.

Боюсь, вам придется сделать это и программирование, безусловно, самостоятельно;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...