6

在一个在线经理游戏(如Hattrick)中,我想模拟两支球队之间的比赛。

一个团队由 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

例如,这些附加因素可能是战术价值。

你认为这是计算游戏的好方法吗?我的用户说他们对模拟的质量不满意。我该如何改进它们?你有不同的方法可以产生更好的结果吗?还是您认为我的方法很好,我只需要调整条件语句中的值并进行一些实验?

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

4

5 回答 5

19

这是我会做的一种方式。

进攻/防守质量

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

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队,应该有更好的获胜机会。但是多少呢?

计分和保存

让我们计算一下 A 队应该进多少球:

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

我假设随机值会添加介于 -1 和 +1 之间的任何值,尽管您可以对其进行调整。

正如我们所看到的,公式表明 A 队应该进 1.6 个球。我们可以向上/向下舍入。或者给 A 队 1,然后计算是否允许另一队(随机机会)。

现在为 B 队

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

所以我们有 A 得 1 分和 B 得 1 分。但请记住,我们希望对 A 有利,因为总的来说,他们是更好的球队。

那么A获胜的机会有多大?

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

所以我们可以看到 A 赢得比赛的几率是 14% (0.14)。我们可以使用这个值来查看最终分数是否有任何变化:

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

如果我们的随机数是 0.8,那么比赛就是平局。

四舍五入和进一步思考

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

上面的大纲深受选择的随机性的影响。您将希望使其正常化,因此球队额外进 5 球的机会非常非常罕见。但是一点随机性是为游戏添加一些多样性的好方法。

也有一些方法可以编辑此方法。例如,您可以使用 Goal 数字代替进球数作为得分机会的数量,然后使用另一个函数根据其他因素计算出进球数(即选择随机前锋,并使用该球员个人统计数据和守门员,以确定是否有目标)

我希望这有帮助。

于 2009-09-06T22:54:19.307 回答
4

足球中最基本的战术决策是选择阵型,这是一组三个数字,将 10 名外场球员分别分配到防守、中场和进攻,例如 4/4/2。

如果你使用平均球员的力量,你不仅会失去那个战术,而且会倒退:最强的防守是由一个非常优秀的球员组成的,给他任何帮助都会让对方更有可能得分。如果您有一个评分为 10 的玩家,则平均值为 10。添加另一个评分为 8 的玩家,平均值下降(至 9)。但是分配更多的人来防守应该使它更强大,而不是更弱。

所以首先,你想让一切都基于总数,而不是平均值。总数之间的比率是一种很好的与规模无关的方法,可以确定哪些团队更强以及强多少。比率往往比差异更好,因为它们以可预测的方式与任何实力范围的团队一起工作。您可以设置一个战斗结果表,显示进球数(每场比赛、每半场、每步或其他)。

下一个战术选择是拥有一名出色的球员还是拥有几位优秀的球员更好。您可以通过设置代表游戏中发生的事情的场景来实现这一点,例如一对一、角球或长球。首先随机选择参与场景的玩家,然后滚动场景的结果。一个结果可能是另一种情况开始(中场传球导致交叉导致头球机会)。

最后一步,可以让你达到实际足球经理游戏的水平,给球员提供不止一种力量等级,例如头球、传球、射门等等。然后你使用适合他们所处场景的强度等级。

于 2009-09-12T15:52:33.093 回答
3

您示例中的除法可能是一个坏主意,因为它会根据哪一侧更好而改变输出变量的比例。通常,在比较两个数量时,您需要区间数据(从另一个中减去一个)或比率数据(一个除以另一个),但不是两者都需要。

在这种情况下,更好的方法是简单地将进攻得分除以防守得分。如果两者相等,则结果为 1。如果攻击者优于防御者,则大于 1,如果防御者更强,则小于 1。这些数字很容易使用。

此外,不是对整个团队进行平均,而是根据所使用的阵型或战术对团队的各个部分进行平均。这将允许球队选择进攻或防守,并看到这样做的利弊。

并为自己编写一些更好的随机数生成函数。对于初学者,一种返回 -1 和 1 之间的浮点值,另一种从 0 到 1 工作。在你的计算中使用这些,你可以避免所有那些令人困惑的 10s!

于 2009-09-07T16:19:00.357 回答
3

您可能还想询问用户他们不喜欢的模拟是什么。他们可能不想看到比赛的最终结果,而是想知道他们的球队有多少次有机会进攻但防守方重新获得控制权。所以而不是

“你的球队以 2-1 获胜”

他们希望看到比赛亮点:

“你的球队以 2-1 获胜:
 - 在第 15 分钟得分,
 - 其他球队控制并在第30分钟尝试进球,
   但拍摄被拦截,
 - 我们再次控制了比赛,$PLAYER1 打进了漂亮的进球!
... ETC

您可以使用 Jamie 建议的作为起点,随机选择时间,并可能根据进攻球员的加权抽样选择谁得分(即得分较高的球员更有可能成为得分的人)。您可以玩得开心,并添加随机的低概率事件,例如球员红牌、受伤的人、球场上的裸奔者......

于 2009-09-11T14:47:43.987 回答
0

平均值应该是玩家人数......如果您有 3 个玩家团队,则使用最大平均值:

[4 4 4]

[7 4 1]

第二个将被认为较弱。那是你要的吗?我认为你宁愿做这样的事情:

(总得分 / 总玩家数)+(最高得分 / 总玩家数),所以在上面的例子中,它会让第二支球队稍微好一点。

我想这取决于你觉得球队应该如何平衡。

于 2009-09-03T17:58:48.513 回答