English | 简体中文
Hog 是一个双人掷骰子博弈游戏项目,源自 UC Berkeley CS61 系列课程。玩家通过决策每轮投掷骰子的数量来获取积分,目标是率先达到 100 分。项目在实现完整游戏引擎的基础上,深入探索了函数式编程范式、自动化博弈策略设计与百万级蒙特卡洛仿真验证。
游戏包含以下特殊积分修正规则,为策略设计增加了丰富的博弈维度:
如果本轮投掷的骰子中包含任意一个 1,则本轮积分强制为 1,无论其他骰子的点数如何。这一规则惩罚贪心策略——投掷越多骰子,触发此规则的概率越高。
选择投掷 0 个骰子时触发。本轮得分基于对手当前积分的数字特征计算:取对手积分特定位置数字差的绝对值加 1。这为「不投骰子」提供了一个确定性的保底收益。
如果得分后的累计积分恰好是一个完全平方数(如 1, 4, 9, 16, 25...),则积分自动提升为下一个完全平方数。这一规则为策略设计引入了「踩点」的概念——精确控制得分使其落在平方数上可以获得额外跳跃。
项目大量运用函数式编程思想,是学习 Python 高阶函数与闭包的优秀实践:
- 高阶函数组合:系统实现了大量「返回函数的函数」(Higher-Order Functions)。通过动态组合不同的策略函数,实现了博弈逻辑的高度解耦。例如,骰子生成器、回合处理器和策略选择器均以函数作为参数和返回值
- 闭包应用:利用 Python 的闭包特性维护博弈状态(当前分数、回合数等),避免了全局变量的滥用。每个策略函数通过闭包捕获其运行环境,增强了代码的可测试性和可组合性
- 纯函数设计:核心游戏逻辑尽可能设计为无副作用的纯函数,便于单元测试和形式化验证
项目实现了多层次的自动化决策系统:
- 启发式决策:开发了能够根据当前双方比分实时调整投掷数量的策略函数。策略会综合考虑当前分差、触发特殊规则的概率和风险收益比
- 期望值最大化(EV Maximization):编写了基于概率统计的
final_strategy。该策略通过计算不同决策(投掷 0~10 个骰子)下的获胜概率期望,自动选择风险收益比最优的动作 - 对手建模:策略设计中考虑了对手可能的行为模式,实现了基础的博弈论对抗逻辑
- 仿真引擎:构建了高性能的模拟对局引擎,支持任意两个策略函数之间的自动化对抗
- 大规模实验:通过执行 1,000,000 次以上的策略对抗实验,获取不同策略的理论获胜率
- 鲁棒性验证:利用统计显著性检验验证启发式算法在不同对手策略下的稳定表现
- 策略迭代:基于仿真结果反复调优策略参数,逼近理论最优解
cs616161/
├── hog.py # 核心游戏引擎:规则定义、回合处理、策略开发与 EV 计算
├── dice.py # 骰子逻辑:确定性骰子(用于测试)与随机骰子的实现
├── hog_gui.py # 图形界面:基于原生 Python 的可视化策略对战与调试工具
├── tests/ # 测试套件:基于 OK Autograder 框架的精细化单元测试用例集
└── README.md # 项目说明文档
- Python >= 3.6
项目采用 UC Berkeley 自研的 OK 评测系统进行逻辑校验:
# 执行特定阶段的正确性校验(例如阶段 1)
python3 ok -q 01
# 执行所有阶段的校验
python3 ok
# 查看详细的测试输出
python3 ok -v# 启动图形界面,手动对战或观察策略行为
python3 hog_gui.py在 Python 交互环境中运行蒙特卡洛仿真:
from hog import *
# 运行 100 万次对局仿真,比较两个策略的胜率
win_rate = average_win_rate(final_strategy, baseline_strategy)
print(f"Final strategy win rate: {win_rate:.4f}")- 纯函数式架构:整个游戏引擎基于高阶函数和闭包构建,无类定义,展示了 Python 函数式编程的表达力
- 概率驱动决策:final_strategy 基于精确的概率计算而非简单的 if-else 规则,体现了数据驱动的工程思维
- 统计验证闭环:策略设计 -> 蒙特卡洛仿真 -> 统计分析 -> 参数调优,形成完整的实验验证流程
- 可组合性:策略函数可以像积木一样自由组合,便于快速实验不同的决策逻辑
MIT License