Skip to content

Repository files navigation

Tetriz

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_score
  • Next:后续方块预览
  • 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_msTETRIZ_INPUT_REPEAT_MS 仍可使用,会同时设置 DAS 和 ARR。rotation_repeat_ms 用于限制连续旋转输入,避免按住旋转键时过快触发。终端输入无法可靠提供按键释放事件,也没有通用硬件震动接口,因此这里基于终端自动重复事件实现首次重复延迟和后续重复间隔,并用可选终端 bell 与边框闪烁提供反馈。

测试:

ctest --test-dir build --output-on-failure

代码结构

  • main.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。

参考

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages