Pytris |
---|
开发 |
Chloe |
---|
游戏平台 |
Python(Pygame) |
---|
发行时间 |
2022年3月30日 |
---|
预览块数 |
3 |
---|
场地大小 |
10 × 22 |
---|
暂存 |
有 |
---|
硬降 |
有 |
---|
旋转系统 |
专用 |
---|
|
Pytris 是一个 Python 四连方块游戏。
该游戏每次操作都带软降一格,速度升上去之后难度很大。
该游戏有一个作者自制的 AI。
玩法
得分、生存。
非硬降每格 1 分,硬降保底 3 分 + 每格 2 分,消行每行 100 分。
消行从下往上逐行完成,第一行瞬消,之后每次消行延迟都等于重力帧率。[注 1]
|
0 分
|
1000 分
|
2000 分
|
4000 分
|
8000 分
|
硬核模式
|
重力帧率
|
25
|
18
|
14
|
10
|
7
|
n
|
将 pytris.py 第 245 行的“-1”改成正数可以开启硬核模式,数值越小越难。
死亡判定:重叠死亡。
触发死亡时,游戏程序终止。
操作
A/D 或左右键横移,W 或上键顺时针旋转,S 或下键硬降,左 Shift 键暂存。
所有操作都只能单点,每次操作结束瞬间方块软降一格[注 2],接地状态软降即锁定。
方块环境配置
O 黄色,I 银蓝色,J 蓝色,L 橙色,T 粉色,S 红色,Z 绿色。
各碰撞箱的入场位置如上图所示。
其中,X 格坐标为 (5,21)。
以下图组中,每一组的最左图是入场朝向,右图是依次顺时针旋转的朝向:
Pytris (Python, Chloe, 2022) 没有踢墙。
Pytris-AI
作者 Chloe 的 Pytris-AI 工程日志(按关键点梳理大意)
|
一试
神经网络类别:稠密卷积(每一层都接受前面所有层的输出)。
AI 做法:2D 卷积在列和行方向各扫一次场地,神经网络选择最佳硬降位置(不考虑软降)。
学习过程:以最终得分为度量标准,先都取随机权重,每一代神经网络择优微调传往下一代。
试验结果:电脑算力不够,没有产出预期的成果。
二试
算法类型:Q-learning(强调价值导向)。
基本思路第一步:按得分规则、死格和方块堆的“凸度”等度量标准建立评分方法 s(p)。
基本思路第二步:Q(p) = (s(p) + g(Q(p+1))),其中 g 试取 0–1 之间的值。
节点:一个游戏状态对应一个节点,方块每做一次运动都是在前往下一个节点。
算法偏重:以层数深度为优先,自动更新 Q 值。
决策树代码改用 C++ 的理由:Python 算层太慢(三层就要两分钟),C++ 能快几十倍。
C++ 代码部分的三处改进:算出 Q 值,顶出计为扣一万分,训练状态在“随机”和“爬树”之间切换。
剪枝优化:直接放弃浅层的低分节点(即便这违背 Q-learning 的本意)。[注 3]
提速效果:13 秒就跑完五层并取得 5 个高分节点(但如果同分,则全部保留[注 4])。
二试学习数据:包含 15000 个状态,深四层,评分取出前 12 名,AI 已能决策出消行。
|
作者自制的 AI 需要用到 Python 的 tty 模块下的 termios 模块,只能在 Unix 环境使用。
截至 2022 年 5 月,Pytris-AI 存储库中的关键文件对应二试的成果。
TetrisAI.py 是包含了 AI 网络和初次实行决策树的 Python 代码部分;
decision_tree.cpp 是用来生成决策树的 C++ 代码部分。
注释
- ↑ 在前期,快速操作下一块,就能快速完成消四
- ↑ 其原理是检测到操作就立刻把自动下落的倒计时器跑满
- ↑ 方块游戏中存在大量低 Q(p) 操作,作者依算力情况决定要速度不要遍历
- ↑ 特别是在近乎空场的局面下(大平原很多位置评分相同)
外链