Tetriz 是一个使用 C++20 编写的终端版俄罗斯方块。项目直接在命令行里绘制游戏界面,包含完整的游戏循环、键盘输入、方块生成、消行计分和终端渲染逻辑。
- 经典 10x20 俄罗斯方块棋盘
- 7-bag 随机方块生成,保证每组 7 个方块各出现一次
- Next 队列预览,提前展示后续方块
- Hold 功能,可以暂存当前方块并在后续交换使用
- Ghost 影子方块,显示当前方块硬降后的落点
- 自动下落、软降、硬降、顺/逆时针旋转、180 度旋转和 SRS 墙踢
- Lock delay、方块落地锁定、满行清除、T-Spin、Combo、Back-to-back、Perfect Clear 和等级加速
- 本地 Top 5 高分榜保存分数、等级、消行数和时间,状态栏展示和 Game Over 榜单展示
- 暂停、继续、重开和 Game Over 状态
- 退出或 Ctrl+C 时恢复终端光标和颜色
- Windows 终端启用 ANSI 虚拟终端模式,支持基础尺寸检测和按键读取
- 输入线程缓冲按键,主循环统一处理命令
- 可配置 DAS/ARR、旋转重复控制、终端 bell 音效和视觉反馈
- 消行时短暂高亮对应行
- 使用局部刷新和 ASCII 边框,减少终端闪烁和字符错位问题
游戏运行后会在终端中显示以下区域:
Hold:暂存方块Tetriz:主游戏棋盘Status:分数、最高分、等级、消行数、T-Spin、Combo、Back-to-back、Perfect Clear、FPS 和当前状态High:本地最高分,默认保存到当前目录的.tetriz_high_scoreNext:后续方块预览Controls:按键提示
建议终端窗口至少保持 70 列 x 22 行。窗口太小时游戏会显示尺寸提示,恢复到足够尺寸后自动重绘。
| Key | Action |
|---|---|
A / D, ← / → |
左右移动 |
S, ↓ |
软降 |
W, ↑ |
顺时针旋转 |
Z |
逆时针旋转 |
X |
180 度旋转 |
Space |
硬降 |
C |
Hold |
P |
暂停/继续 |
R |
重开 |
Q, Ctrl+C |
退出 |
按键大小写都可以使用。
需要安装支持 C++20 的编译器和 CMake。
macOS 如果没有编译工具,先安装 Xcode Command Line Tools:
xcode-select --install构建:
cmake -S . -B build
cmake --build build运行:
./build/tetriz可以在当前目录创建 .tetrizrc 配置文件:
high_score_path = .tetriz_high_score
start_level = 1
hide_ghost = false
hide_fps = false
sound = false
visual_feedback = false
input_das_ms = 170
input_arr_ms = 35
rotation_repeat_ms = 120
key.left = a
key.right = d
key.down = s
key.rotate = w
key.rotate_ccw = z
key.rotate_180 = x
key.hard_drop = space
key.hold = c
key.pause = p
key.restart = r
key.quit = q高分榜默认保存到当前目录的 .tetriz_high_score,最多保留前 5 个分数。每条记录保存 score level lines timestamp,旧版纯分数文件仍可读取。也可以通过环境变量改保存路径:
TETRIZ_HIGH_SCORE_PATH=/tmp/tetriz_high_score ./build/tetriz可以通过环境变量设置起始等级:
TETRIZ_START_LEVEL=6 ./build/tetriz可以通过环境变量隐藏 Ghost 或 FPS:
TETRIZ_HIDE_GHOST=1 TETRIZ_HIDE_FPS=1 ./build/tetriz可以打开终端 bell 音效、视觉反馈或调整重复输入节奏:
TETRIZ_SOUND=1 TETRIZ_VISUAL_FEEDBACK=1 TETRIZ_INPUT_DAS_MS=170 TETRIZ_INPUT_ARR_MS=35 TETRIZ_ROTATION_REPEAT_MS=120 ./build/tetriz环境变量会覆盖 .tetrizrc 中的配置。旧的 input_repeat_ms 和 TETRIZ_INPUT_REPEAT_MS 仍可使用,会同时设置 DAS 和 ARR。rotation_repeat_ms 用于限制连续旋转输入,避免按住旋转键时过快触发。终端输入无法可靠提供按键释放事件,也没有通用硬件震动接口,因此这里基于终端自动重复事件实现首次重复延迟和后续重复间隔,并用可选终端 bell 与边框闪烁提供反馈。
测试:
ctest --test-dir build --output-on-failuremain.cpp:程序入口和主循环game.cpp/game.h:游戏状态、方块逻辑、碰撞、消行、计分和随机队列draw.cpp/draw.h:终端 UI 绘制和局部刷新control.cpp/control.h:键盘监听和操作映射terminal.cpp/terminal.h:终端控制、光标、颜色和输入模式封装utils.cpp/utils.h:FPS 统计和辅助函数define.h/color.h:全局常量和颜色定义
项目将游戏逻辑、配置、控制和渲染拆开:游戏层维护棋盘、当前方块、Hold、Next 队列、分数、清行动画事件和状态;配置层读取 .tetrizrc 和环境变量;控制层缓冲按键输入并应用 DAS/ARR 重复控制;渲染层只读取游戏快照并更新终端界面。主循环按固定节奏处理输入命令、驱动自动下落和画面刷新。
旋转规则使用 SRS 墙踢,落地后使用 lock delay 延迟锁定,并支持 T-Spin Mini/Full、Combo、Back-to-back 和 Perfect Clear 计分。T-Spin 使用 T 方块最后动作为旋转且中心四角至少三处被占用的判定,并根据前角占用区分 Mini 和 Full。
- ANSI Escape Sequences: https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797
- Unicode Box: https://en.wikipedia.org/wiki/Box-drawing_characters
- SRS: https://harddrop.com/wiki/SRS