Pytris (Python, Chloe, 2022)

来自俄罗斯方块中文维基
Pytris
开发 Chloe
游戏平台 Python(Pygame)
发行时间 2022年3月30日
游戏信息
预览块数 3
场地大小 10 × 22
暂存块
硬降
旋转系统 专用
[[文件:|125px]]
Pytris (Python, Chloe, 2022) ingame.png

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 绿色。

Tet.pngTet.pngTet.png2234Tet.pngTet.pngTet.png
Tet.pngTet.pngTet.png2X34Tet.pngTet.pngTet.png
Tet.pngTet.pngTet.png3334Tet.pngTet.pngTet.png
Tet.pngTet.pngTet.png4444Tet.pngTet.pngTet.png

碰撞箱的入场位置如上图所示。
其中,X 格坐标为 (5,21)。
以下图组中,每一组的最左图是入场朝向,右图是依次顺时针旋转的朝向:

OO
OO
Tet.pngSvBlTet.pngTet.png
Tet.pngSvBlTet.pngTet.png
Tet.pngSvBlTet.pngTet.png
Tet.pngSvBlTet.pngTet.png
Tet.pngTet.pngTet.pngTet.png
SvBlSvBlSvBlSvBl
Tet.pngTet.pngTet.pngTet.png
Tet.pngTet.pngTet.pngTet.png
Tet.pngTet.pngSvBlTet.png
Tet.pngTet.pngSvBlTet.png
Tet.pngTet.pngSvBlTet.png
Tet.pngTet.pngSvBlTet.png
Tet.pngTet.pngTet.pngTet.png
Tet.pngTet.pngTet.pngTet.png
SvBlSvBlSvBlSvBl
Tet.pngTet.pngTet.pngTet.png
Tet.pngJTet.png
Tet.pngJTet.png
JJTet.png
JTet.pngTet.png
JJJ
Tet.pngTet.pngTet.png
Tet.pngJJ
Tet.pngJTet.png
Tet.pngJTet.png
Tet.pngTet.pngTet.png
JJJ
Tet.pngTet.pngJ
LTet.pngTet.png
LTet.pngTet.png
LLTet.png
LLL
LTet.pngTet.png
Tet.pngTet.pngTet.png
Tet.pngLL
Tet.pngTet.pngL
Tet.pngTet.pngL
Tet.pngTet.pngTet.png
Tet.pngTet.pngL
LLL
Tet.pngStaxLTet.png
StaxLStaxLStaxL
Tet.pngTet.pngTet.png
Tet.pngStaxLTet.png
Tet.pngStaxLStaxL
Tet.pngStaxLTet.png
Tet.pngTet.pngTet.png
StaxLStaxLStaxL
Tet.pngStaxLTet.png
Tet.pngStaxLTet.png
StaxLStaxLTet.png
Tet.pngStaxLTet.png
ZTet.pngTet.png
ZZTet.png
Tet.pngZTet.png
Tet.pngZZ
ZZTet.png
Tet.pngTet.pngTet.png
Tet.pngZTet.png
Tet.pngZZ
Tet.pngTet.pngZ
Tet.pngTet.pngTet.png
Tet.pngZZ
ZZTet.png
Tet.pngSTet.png
SSTet.png
STet.pngTet.png
SSTet.png
Tet.pngSS
Tet.pngTet.pngTet.png
Tet.pngTet.pngS
Tet.pngSS
Tet.pngSTet.png
Tet.pngTet.pngTet.png
SSTet.png
Tet.pngSS

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++ 代码部分。

注释

  1. 在前期,快速操作下一块,就能快速完成消四
  2. 其原理是检测到操作就立刻把自动下落的倒计时器跑满
  3. 方块游戏中存在大量低 Q(p) 操作,作者依算力情况决定要速度不要遍历
  4. 特别是在近乎空场的局面下(大平原很多位置评分相同)

外链