模拟在线游戏中的体育比赛

caw*_*caw 6 simulation probability

在一个在线经理游戏(如Hattrick)中,我想模拟两个团队之间的匹配.

一支球队由11名球员组成.每位球员的实力值都在1到100之间.我为每支球队采取防守球员的这些力量值并计算平均值.这是球队的防守质量.然后我抓住了进攻球员的优势,我获得了进攻质量.

对于每次攻击,我执行以下操作:

$offFactor = ($attackerTeam_offensive-$defenderTeam_defensive)/max($attackerTeam_offensive, $defenderTeam_defensive);
$defFactor = ($defenderTeam_defensive-$attackerTeam_offensive)/max($defenderTeam_defensive, $attackerTeam_offensive);
Run Code Online (Sandbox Code Playgroud)

目前,我不知道为什么我将它除以两个值中较高的值.但是这个公式应该为你提供一个后来需要的进攻和防守质量的因素.

然后我为每个可能发生的事件嵌套了条件语句.例如:进攻球队是否获得得分机会?

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

例如,这些额外因素可能是战术价值.

你认为这是计算游戏的好方法吗?我的用户说他们对模拟的质量不满意.我怎样才能改进它们?你有不同的方法可以提供更好的结果吗?或者您认为我的方法是好的,我只需要调整条件语句中的值并进行一些实验?

我希望你能帮助我.提前致谢!

小智 19

这是我要做的一种方式.

进攻/防守质量

首先让我们计算出整个团队的平均实力:

Team.Strength = SUM(Players.Strength) / 11
Run Code Online (Sandbox Code Playgroud)

现在我们想分成两局,并计算我们的防守球员和我们的进攻球员的平均值.

Defense.Strength = SUM(Defensive_Players.Strength)/Defensive_Players.Count
Offense.Strength = SUM(Offense_Players.Strength)/Offense_Players.Count
Run Code Online (Sandbox Code Playgroud)

现在,我们有三个值.第一个是团队平均值,将用于计算我们获胜的几率.另外两个,将计算我们的防守几率和得分几率.

进攻平均水平较高的球队将有更多的机会,高防守的球队将有更多的机会获得节省.

现在,如果我们有团队,我们称他们为A和B.

A队,平均80分,进攻得分85分,防守得分60分.

B队,平均得分70,进攻得分50,防守得分80.

现在,基于平均值.A队应该有更好的获胜机会.但是多少钱?

得分和储蓄

让我们弄清楚A队应该得分的目标:

A.Goals = (A.Offensive / B.Defensive) + RAND()
        = (85/80) + 0.8;
        = 1.666
Run Code Online (Sandbox Code Playgroud)

我假设随机值在-1和+1之间添加任何东西,尽管你可以调整它.

我们可以看到,该公式表明A队应该打进1.6球.我们可以向上/向下舍入.或者给团队A 1,并计算是否允许另一个(随机机会).

现在为B队

B.Goals = (B.Offensive / A.Defensive) + RAND()
        = (50/60) + 0.2;
        = 1.03
Run Code Online (Sandbox Code Playgroud)

所以我们得分为A和B得分1.但是请记住,我们希望以A的优势来衡量这一点,因为总的来说,他们是更好的球队.

那么A赢得的机会是多少?

Chance A Will Win = (A.Average / B.Average)
                  = 80 / 70
                  = 1.14
Run Code Online (Sandbox Code Playgroud)

所以我们可以看到赔率为14%(.14),有利于A赢得比赛.我们可以使用此值来查看最终得分是否有任何变化:

if Rand() <= 0.14 then Final Score  = A 2 - 1 B Otherwise A 1 - 1 B
Run Code Online (Sandbox Code Playgroud)

如果我们的随机数为0.8,则该比赛为平局.

四舍五入与进一步思考

你一定会想要玩这些价值观.请记住,游戏机制很难做到正确.与你的球员交谈,问他们为什么不满意.队伍总是在输球吗?模拟总是停滞不前吗?等等

上述轮廓深受选择随机性的影响.你需要将其标准化,以便球队获得额外5个进球的机会非常罕见.但是一点点随机性是为游戏添加一些变化的好方法.

还有一些方法可以编辑此方法.例如,您可以使用目标数字作为得分机会的数量,然后根据其他因素计算目标数量(即选择一名随机前锋,并使用该球员个人),而不是目标数量统计数据和守门员,如果有目标,可以计算出来)

我希望这有帮助.