Моделирование футбола для игры

У вас есть два способа решения проблемы

  1. Установить пакет mod_auth (не уверен, как он назван в MacOS)
  2. Строка комментария 70 вашего файла конфигурации [112 ]
28
задан 8 revs, 2 users 100% 12 January 2014 в 20:33
поделиться

4 ответа

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

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

Вес команды Команда A = 56 , вес команды Команда B = 120

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

35
ответ дан 4 revs 28 November 2019 в 03:23
поделиться

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

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
        }
    }
}

РЕДАКТИРОВАТЬ: I просто домой, и мне действительно нужно идти спать, но после быстрого взгляда на ваши изменения у меня появилась идея, которая может вас заинтересовать. Что если вместо использования значения регулировки 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: Похоже, сейчас это не имеет особого смысла, но я попытаюсь еще раз взглянуть на это утром.

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

2
ответ дан 2 revs 28 November 2019 в 03:23
поделиться

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

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

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

0
ответ дан Martin 28 November 2019 в 03:23
поделиться

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

Я бы рекомендовал последовательность действий примерно так:

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 (с учетом всех других возможных результатов).

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

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

8
ответ дан 28 November 2019 в 03:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: