Skip to content

saudademjj/cs616161

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 

Repository files navigation

English | 简体中文

CS61 Hog -- 骰子博弈策略与蒙特卡洛仿真

Python Functional Monte Carlo

Hog 是一个双人掷骰子博弈游戏项目,源自 UC Berkeley CS61 系列课程。玩家通过决策每轮投掷骰子的数量来获取积分,目标是率先达到 100 分。项目在实现完整游戏引擎的基础上,深入探索了函数式编程范式、自动化博弈策略设计与百万级蒙特卡洛仿真验证。

博弈规则

游戏包含以下特殊积分修正规则,为策略设计增加了丰富的博弈维度:

Sow Sad(悲伤播种)

如果本轮投掷的骰子中包含任意一个 1,则本轮积分强制为 1,无论其他骰子的点数如何。这一规则惩罚贪心策略——投掷越多骰子,触发此规则的概率越高。

Pig Tail(猪尾巴)

选择投掷 0 个骰子时触发。本轮得分基于对手当前积分的数字特征计算:取对手积分特定位置数字差的绝对值加 1。这为「不投骰子」提供了一个确定性的保底收益。

Square Swine(方块猪)

如果得分后的累计积分恰好是一个完全平方数(如 1, 4, 9, 16, 25...),则积分自动提升为下一个完全平方数。这一规则为策略设计引入了「踩点」的概念——精确控制得分使其落在平方数上可以获得额外跳跃。

核心工程实践

1. 函数式编程范式

项目大量运用函数式编程思想,是学习 Python 高阶函数与闭包的优秀实践:

  • 高阶函数组合:系统实现了大量「返回函数的函数」(Higher-Order Functions)。通过动态组合不同的策略函数,实现了博弈逻辑的高度解耦。例如,骰子生成器、回合处理器和策略选择器均以函数作为参数和返回值
  • 闭包应用:利用 Python 的闭包特性维护博弈状态(当前分数、回合数等),避免了全局变量的滥用。每个策略函数通过闭包捕获其运行环境,增强了代码的可测试性和可组合性
  • 纯函数设计:核心游戏逻辑尽可能设计为无副作用的纯函数,便于单元测试和形式化验证

2. 自动化博弈策略

项目实现了多层次的自动化决策系统:

  • 启发式决策:开发了能够根据当前双方比分实时调整投掷数量的策略函数。策略会综合考虑当前分差、触发特殊规则的概率和风险收益比
  • 期望值最大化(EV Maximization):编写了基于概率统计的 final_strategy。该策略通过计算不同决策(投掷 0~10 个骰子)下的获胜概率期望,自动选择风险收益比最优的动作
  • 对手建模:策略设计中考虑了对手可能的行为模式,实现了基础的博弈论对抗逻辑

3. 百万级蒙特卡洛仿真

  • 仿真引擎:构建了高性能的模拟对局引擎,支持任意两个策略函数之间的自动化对抗
  • 大规模实验:通过执行 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

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages