Вопрос

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


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

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

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

Атакующая команда определяется игральными костями до того, как:$attacking = 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 х 1,5 х 1,5).Так что я не могу интегрировать тактику таким образом.Что еще я могу сделать?


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

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

Это было полезно?

Решение

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

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

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

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

Исходя из веса, вы могли бы рассчитать шансы на выигрыш;Шанс на выигрыш в Команда А = 32%, Шанс на выигрыш в Команда B = 68%.

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

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

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

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

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

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

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

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

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

Присвоение веса

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

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

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

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

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

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

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

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

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

Другие советы

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

Я бы порекомендовал использовать что-то более похожее на это :

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 из команды А и предположите, что цифры ближе к цели.В случае выпадения 5 бросков за столом, за которым команда противника либо добьется успеха, либо потерпит неудачу в зависимости от мастерства случайного игрока.В случае шести немедленно забейте гол команде соперника (в футболе это случается менее чем в 5% случаев, скорее в 0,01%, но вы также можете попасть в другую таблицу критических неудач, которые включают травму или глупый вид в течение десяти секунд).

3) Повторите процесс, основываясь на полученных результатах.

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

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

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

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

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

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

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

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

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)

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

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

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

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

Я боюсь, что вам придется делать это и программирование, скорее всего, самостоятельно ;)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top