案例研究 / 04

Retro Quest

C++17 / Exact RTP / Monte Carlo

一个可试玩的老虎机原型,背后是一套独立的 C++17 概率引擎和两种互补的验证方法。

← 全部项目
经过验证的游戏数学C++17
Retro Quest 旋转中:三个卷轴、金色中奖线框、星星与宝藏符号
89.9%
理论返奖率(RTP)设计目标 90%
基础游戏 ≈ 63.5% 奖励 ≈ 26.4%
22³ = 10,648 种结果1M 次模拟旋转
角色游戏数学、C++ 引擎与公开演示
背景面试练习,完成后独立扩展
状态已完成 / 公开 / MIT

挑战

建立透明的游戏数学模型,并验证设计的行为与实际实现的结果空间一致。

我的贡献

把一份面试练习扩展为自成一体的公开项目:C++ 数学引擎、精确枚举、蒙特卡洛验证,以及零依赖的可玩网页演示。

概率预算

RTP 是
一份预算。

RTP = Σ(概率 × 赔付)

概率由卷轴带决定,赔付则由你来分配。下面的数字来自模型自带的调参工具数据。

  1. 皇冠 Crown18.03%40× · 48 种组合
  2. 药水 Potion19.53%10× · 208 种组合
  3. 钱袋 Bag18.03%3× · 640 种组合
  4. 宝箱 Chest7.89%15× · 56 种组合
  5. 奖励 Bonus≈ 26.4%由收集进度条触发的 Treasure Wheels

合计 ≈ 89.9%,设计目标 90%

卷轴带

三个卷轴,
每轴 22 个停位。

游戏能产生的每一种结果,都来自这 66 个位置。皇冠权重为 2 / 2 / 1,因此近失出现的频率约为顶级中奖的四倍——而且只使用真实的符号位置。

  • 皇冠 Crown
  • 宝箱 Chest
  • 药水 Potion
  • 钱袋 Bag
  • 百搭 Wild
  • 星星 Star
  • 空白 Blank

22³ = 10,648 种中奖线结果,在 slot_math.cpp 中精确枚举。

自己调一调

锁定总值,
拖动一项赔付。

交互式 RTP 调参工具运行在游戏真实的组合数上。锁定总 RTP,拖动任意一项赔付,看剩余预算如何重新平衡。

打开 RTP 调参工具 ↗

交付过程

这项工作
是如何成形的。

从对问题的第一个模型,到检验系统的实际行为。

01

定义模型

在验证实现之前,先明确符号权重、固定卷轴、赔付规则与收集奖励。

02

精确枚举

遍历全部 22³ 种卷轴停位组合——共 10,648 种结果——计算出理论值。

03

独立模拟

另行运行 1,000,000 次旋转的蒙特卡洛模拟,用来发现实现或建模上的偏差。

04

公开推理过程

公开 C++ 引擎、奖励说明与可玩界面,让评审者能看到的不止一张截图。

工程证据

那些
真正重要的细节。

  • 穷举 10,648 种结果
  • 1,000,000 次旋转的蒙特卡洛模拟
  • 验证 RTP 为 89.9%,设计目标 90%
  • 独立随机数生成器与固定卷轴带设计
  • 基础游戏与收集奖励的贡献分开计算
  • 零依赖、可直接在浏览器试玩的演示

决策细节 / 展开阅读

01精确计算有限的结果空间

三个卷轴、每轴 22 个停位,产生 22³ = 10,648 种中奖线结果。枚举全部组合可得到基础游戏的精确期望;收集奖励单独计算。

02用独立模拟检验模型

一百万次旋转的蒙特卡洛模拟会同时覆盖线上中奖、收集进度与奖励触发。把观测到的返奖率与理论值对比,有助于暴露实现或建模上的偏差。

03表现层始终在结果之后

独立的随机数生成器在固定卷轴带上选定停位。动画只是呈现这个选择;近失(near miss)使用真实的相邻符号,而不会改动已选定的结果。

04让概率预算清晰可读

把约 63.5% 的基础游戏返奖与 26.4% 的奖励贡献分开,整体 89.9% 的返奖率就更容易推理和调整。仓库内包含 C++ 引擎和一个交互式 RTP 调参工具。

结果

两条验证路径都收敛于约 89.9% 的 RTP——一个小而可查验的项目,展示了 C++、概率,以及负责任的游戏数学推理。

项目核心源自一份 AGS 面试练习。C++ 引擎、双重验证、文档与公开版本,均在评估结束后由我独立扩展完成。

  • C++17
  • 概率
  • 统计
  • 蒙特卡洛
  • JavaScript
  • HTML
在线试玩 → 查看仓库 ↗

下一个案例

05商业游戏客户端开发→