Моделирование спортивных матчей в онлайн-игре

в онлайн-игре менеджера (как хеттрик), Я хочу имитировать матчи между двумя командами.

команда состоит из 11 игроков. Каждый игрок имеет значение силы от 1 до 100. Я беру эти значения силы защитников для каждой команды и вычисляю среднее значение. Это оборонительное качество команды. Затем я беру сильные стороны наступательных игроков, и я получаю наступательное качество.

для каждой атаки, я делаю следующий:

$offFactor = ($attackerTeam_offensive-$defenderTeam_defensive)/max($attackerTeam_offensive, $defenderTeam_defensive);
$defFactor = ($defenderTeam_defensive-$attackerTeam_offensive)/max($defenderTeam_defensive, $attackerTeam_offensive);

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

тогда у меня есть вложенные условные операторы для каждого события, которое может произойти. Например: У атакующей команды есть шанс забить гол?

if ((mt_rand((-10+$offAdditionalFactor-$defAdditionalFactor), 10)/10)+$offFactor >= 0) 
{ ... // the attack succeeds

эти дополнительные факторы могут быть тактическими значений например.

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

Я надеюсь, что вы можете помочь мне. Заранее спасибо!

5 ответов


вот как я бы это сделал.

Наступательное / Оборонительное Качество

сначала давайте отработаем среднюю силу всей команды:

Team.Strength = SUM(Players.Strength) / 11

теперь мы хотим разделить сторону на две и выработать средний показатель для наших защитников и наших наступательных игроков.]

Defense.Strength = SUM(Defensive_Players.Strength)/Defensive_Players.Count
Offense.Strength = SUM(Offense_Players.Strength)/Offense_Players.Count

теперь у нас есть три значения. Первая, средняя команда, будет использоваться для расчета наших шансов на победу. Два других, собираются вычислить наши шансы на защиту и наши шансы забить.

команда с высоким наступательным средним будет иметь больше шансов, команда с высокой защитой будет иметь больше шансов на спасение.

теперь, если у нас есть команды, назовем их A и B.

Команда A, в среднем 80, наступательный счет 85 и оборонительный счет 60.

команда B, в среднем 70, наступательный счет 50 и оборонительный счет 80.

теперь, на основании в среднем. Команда должна иметь больше шансов на победу. Но на сколько?

оценка и сохранение

позволяет выяснить, сколько раз цели команда а должна забить:

A.Goals = (A.Offensive / B.Defensive) + RAND()
        = (85/80) + 0.8;
        = 1.666

я предположил, что случайное значение добавляет что-либо между -1 и +1, хотя вы можете настроить это.

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

теперь для команды B

B.Goals = (B.Offensive / A.Defensive) + RAND()
        = (50/60) + 0.2;
        = 1.03

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

так что шансов победит?

Chance A Will Win = (A.Average / B.Average)
                  = 80 / 70
                  = 1.14

таким образом, мы можем видеть, что шансы 14% (.14) в пользу победы в матче. Мы можем использовать это значение, чтобы увидеть, есть ли какие-либо изменения в конечном счете:

if Rand() <= 0.14 then Final Score  = A 2 - 1 B Otherwise A 1 - 1 B

если бы наше случайное число было 0.8, тогда матч закончился вничью.

округление и дальнейшие мысли

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

вышеуказанный план глубоко зависит от случайности выбора. Вы хотите нормализовать его, так что шансы команда забивает дополнительные 5 голов очень редко. Но немного случайности-отличный способ добавить разнообразие в игру.

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

надеюсь, это поможет.


самое основное тактическое решение в футболе-это выбор образование, который представляет собой набор из трех чисел, который назначает 10 игроков на поле для защиты, полузащиты и атаки, соответственно, например, 4/4/2.

Если вы используете среднюю силу игрока, вы не просто теряете эту тактику, у вас она идет назад: самая сильная защита-это один с одним очень хорошим игроком, давая ему любую помощь, это сделает более вероятным счет другой команды. Если у вас есть один игрок с рейтинг 10, в среднем 10. Добавьте еще один с рейтингом 8, и среднее значение упадет (до 9). Но назначение большего числа людей на защиту должно сделать ее сильнее, а не слабее.

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

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

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


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

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

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

и напишите себе некоторые лучшие функции генерации случайных чисел. Тот, который возвращает значения с плавающей запятой между -1 до 1 и от 0 до 1, Для начала. Используйте их в своих расчетах, и вы можете избежать всех этих запутанных 10s везде!


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

"Your team wins 2-1"

Они хотят видеть основные моменты матча:

"Your team wins 2-1:
 - scored at minute 15,
 - other team took control and went for tried for a goal at minute 30, 
   but the shoot was intercepted,
 - we took control again and $PLAYER1 scored a beautiful goal!
... etc

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


среднее должно быть количеством игроков... используя максимум средств, если у вас есть 3 команды:

[4 4 4]

[7 4 1]

второй будет считаться более слабым. Это то, что вы хотите? Я думаю, вы предпочли бы сделать что-то вроде:

(Общий Балл / общее количество игроков) + (максимальный балл / общее количество игроков), поэтому в приведенном выше примере это сделает вторую команду немного лучше.

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