大家好,我是GoalBlink负责系统设计的提瓦特元素反应。

image
Figure 1. 初始球迷图一张

我们参考了很多足球游戏(其实主要是TM),很多时候“球迷”其实只是一个数字:赢球,加一点;输球,减一点;球场坐满了,就多赚点钱。

我们其实想做点不一样的。

于是,就有了现在这个版本的回答。 今天想用开发日志的形式,和你们聊一聊GoalBlink的球迷系统。

最根本的想法其实很简单: 球迷不是“你升到甲级就凭空多出来”的奖励,他们是生活在足球世界里的人。

所以我们把整个系统建立在两个基座上:

  1. 趋势平滑。
  2. 整体与局部关联。

换句话说,球迷数量不是各队各算各的,而是被放进一个更大的生态里: 国家联赛的繁荣程度、俱乐部实力、外战表现、近期战绩、球迷情绪、球场容量…… 这些东西共同决定了一支球队到底能吸引多少人。

然后就引出我们的设计起点,国家球迷池:同一个国家,共享一片土壤。

同一个国家的所有俱乐部,并不是各自孤立地生成球迷,而是共享一个国家足球市场。 这个市场会随着国家足球整体水平一起变化。

简单的公式可以理解为:

$$ 国家球迷池 ≈ 基础球迷池 × 外战系数 × 联赛繁荣系数 \tag{1} $$

其中基础球迷池非常朴素:

$$ 基础球迷池 = 800 × 国家球队总数 \tag{2} $$ 这意味着你作为玩家,不只是在经营自己的一家俱乐部,你其实也在参与一整个国家足球生态的起落。

image
Figure 2. 初始的中国区概况,球迷数量为整个国家的球迷数量之和

如果本国球队在国际赛事里持续打出好成绩,整个国家的足球关注度就会慢慢变高; 如果联赛整体实力提升,市场容量也会跟着变大。

反过来,一个外战长期低迷、联赛质量提不上来的国家,也不会凭空拥有无限的球迷。

这是我们特别想保留的差异感—— 球迷不是系统赠品,而是足球环境的一部分。

除了人数,还有什么会影响球迷的数量呢。。。?

我们想应该是外战表现,也就是球队在对战其他国家球队或是国家队之间的比赛中的表现。这影响的是整个国家,不只是获取成绩的俱乐部,拥有优秀外战成绩的国家自然会得到更多的球迷吸引力。

然而这里有一个很容易踩坑的地方:外战成绩,究竟应该奖励谁?

我们不希望出现“只有冠军获利、其他人看戏”的局面,也不想让参赛名额多的国家纯粹靠数量把积分堆上去(这显然会导致极其强化的正反馈)。所以我们将其设计为做大“蛋糕”,并且增加参数来中和参赛名额带来的优势。

因此其公式类似于 $外战吸引系数 = SUM(外战积分) / 参赛名额$ (权重非真实)

此外,外战系数读取的是比赛本身的分量。 简单来说——

$$ 单场外战积分 = 比赛结果基础分 × 比赛权重 \tag{3} $$ 而周期结束后,外战系数不会直接跳变,而是平滑更新。

我们给它的变化加了惯性,大致逻辑是:

$$ 新系数 ≈ 旧系数 × 0.8 + 更新值 × 0.2 \tag{4} $$ 同时限制在一个合理区间里(0.85 到 1.25)

这样一来,一个国家不会因为某一个赛季爆冷夺冠就立刻起飞,也不会因为短期低迷就突然崩盘。足球热度会变化,但它有记忆,有惯性。(嗯,毕竟人们不会一夜之间忘记足球,也不会一夜之间全都爱上足球。)

那么,球队如何从国家球迷池里“分到”球迷呢?

市场总量有了,接下来就是各家俱乐部凭吸引力去分配活跃球迷。

这里我们做了一件稍微“狠”一点的事:

$$ 球队分配权重 = 球队吸引力^{2.5} \tag{5} $$ 也就是吸引力取了一个指数,让顶级球队拥有非常明显的流量优势。 强队、豪门、近期成绩亮眼的球队,理应吸引更多中立球迷和媒体关注。

最终某个球队的目标活跃球迷,就是国家球迷池按这个权重比例切出来的。

不得不承认,这确实会造成比较明显的球迷差距。 在我们的预设模型里,顶级联赛俱乐部的球迷数量大概是第四级别联赛俱乐部的 10 倍左右。

看到这个数字的时候,也许会有疑问: “这样会不会直接把小球队玩没了?”

所以后来,我们在收入侧补了一手——联赛发展金。 简单说,就是上级联赛需要给下级联赛分成,形成扶持。 这样既保留了流量向强队集中、热热闹闹的现实感,又不会让低级别完全没有活下去的空间。(这部分就不在我们本次的日志讨论范围了,敬请期待)

为什么赢球了,球迷没有立刻提升?

传统的做法是: 赢一场 → 马上加球迷 → 反馈很强烈,但系统跳得也很厉害。

就像上面提到的,我们的核心设计理念之一是“平滑”,也就是把 “目标球迷数”和“当前真实球迷数” 分开。

每周的变化大致遵循这样的节奏:

$$ 球迷缺口 = 目标活跃球迷 − 当前活跃球迷 \tag{6} $$

$$ 本周变化 ≈ 球迷缺口 × 平滑率 \tag{7} $$

$$ 新活跃球迷 = 当前活跃球迷 + 本周变化 \tag{8} $$ 在普通周,这个平滑率大约是 15%。

也就是说,球队热度会逐步兑现,而不是一夜之间翻倍。

球迷不会因为一场胜利全部涌进来,也不会因为一场失败立刻全部走光。热度像潮水,有涨有退,但很少瞬间倾覆。

球队吸引力:实力是起点,但不被球迷反向绑架 吸引力本身,我们是这么考虑的——

$$ 球队吸引力 = 竞技Rating × 35\% + 近期战绩分 × 25\% + 联赛等级分 × 20\% + 球星分 × 10\% + 媒体分 × 5\% + 历史底蕴分 × 5\% \tag{9} $$

但在做完这个公式之后,我们内部反复强调了一条边界:球迷数量不能反过来直接提升球队Rating。

因为正反馈带来的结果并不妙:球迷多 → 声望高 → Rating更高 → 吸引更多球迷 → 更多球迷……

这会变成一种系统滚雪球,而不是靠你真正去经营阵容、研究战术、打好比赛变强。

GoalBlink 里,这条关系链应该长这样:

Rating → 球队吸引力 → 球迷数量 球迷数量 → 收入 / 声望 / 商业价值

球迷可以让俱乐部更有钱、更有名,但不会直接替球队踢球。 想提升竞技实力,仍然要靠买人、训练和经营决策。

最后再聊聊球迷情绪,同样是“平滑”的思路——球迷情绪也不是单场胜负一键切换的。

我们记录了最近 20 场比赛,使用衰减权重: 最新一场影响最大,越久远的影响越小。

$$ 权重衰减系数 ≈ 0.8^(场次距离) \tag{10} $$ 然后加权计算基础情绪: 胜 = 1.0,平 = 0.2,负 = -1.0。

这样一来,最近几场连胜会迅速点燃球迷情绪, 但长期的低迷仍然会压在底层,不会因为一场胜利就一笔勾销。

一支刚赢一场的新球队,不会立刻情绪爆棚; 一支长期沉沦的球队,也需要持续拿出好成绩,才能真正赢回看台。

爆冷,应该让球迷真的兴奋一下 我们还额外加了一层情绪修正: 击败更强的球队,有额外情绪加成; 输给更弱的球队,有额外惩罚。

判断强弱不看声望或球迷数,而是看 竞技Rating。 因为球迷真正感到兴奋的,是竞技意义上的爆冷,而不是“对方粉丝更多”。

修正逻辑大致是:

$$ 强度差 ≈ (对手Rating − 己方Rating) / 己方Rating 情绪修正 = 强度差 × 0.2 \tag{11} $$ 这个修正在击败更强的对手时正向加成,在输给更弱的对手时负向惩罚。 其他情况不触发。

我们觉得,这样才比较接近看台上的真实情绪: “我们居然赢了他们!”和“居然输给他们了?!”这种心情,必须被体现出来。

球迷多,不等于场场坐满 最后,球迷数量会自然影响上座,但上座不是固定比例。

普通球迷的上座率由情绪决定:

$$ 普通球迷上座率 ≈ 50% + 球迷情绪 × 50% \tag{12} $$ 球迷的情绪将由多个部分组成,比如近期战绩,转会等。

$$ 理论主队上座 = 死忠球迷 + 普通球迷 × 上座率。 \tag{13} $$ 再之后,比赛权重、天气、球场容量等还会继续影响实际到场人数。

这个地方其实给了经营决策很多判断空间: 你需要看清楚,究竟是球迷不够、情绪不足、容量卡住了, 还是高价值比赛的票价空间没有被利用。

我们真正想做的,不是赛后弹一个“+300 球迷”就完事的东西。

我们更希望它能解释一些真正值得能贴近现实的东西:短期看情绪,中期看容量,长期看国家市场、声望和死忠沉淀。

在 GoalBlink 里,球迷不是一个静态的数字, 而是俱乐部成长、联赛生态和经营决策之间的连接层。

赢球会带来掌声,但持续经营,才能把掌声变成真正属于你的看台。

那么还缺点什么呢?我想外国球迷其实也是俱乐部球迷的重要组成部分!!!!或许有朝一日我们会填补这部分的坑~

以上就是这次关于球迷系统的全部碎碎念。 感谢你看完这篇长长的开发日志。 如果有什么想法、疑问或者想吐槽的地方,随时都可以告诉我们。

丛雨一张
Figure 3. 丛雨一张

我们下篇日志见,Ciallo!!!☺️