Tetrigo如何用SQLite记录你的高光时刻:本地排行榜从零到完整实现
【免费下载链接】tetrigoPlay Tetris in your terminal.项目地址: https://gitcode.com/gh_mirrors/te/tetrigo
Tetrigo 是一款用 Go 语言编写的终端俄罗斯方块游戏,它最大的亮点之一就是内置了基于 SQLite 的本地排行榜系统——每一局比赛的分数、时间、消行数和等级都会自动落库,让你随时回顾自己的高光时刻。本文将带你从数据库文件位置、表结构设计到分数入库的完整流程,看懂 Tetrigo 本地排行榜是如何从零搭起来的。
💾 为什么选择 SQLite 记录游戏分数?
终端游戏最大的优势是"轻"。Tetrigo 的本地排行榜没有引入任何数据库服务器,而是直接选择了 SQLite:
- 零配置:不需要安装、启动或维护任何服务,一个文件就是整个数据库
- 单机自足:排行榜数据完全保存在本地,断网也能随时查看
- 实现极简:通过 Go 标准库
database/sql+ SQLite 驱动,几十行代码就能完成全部存储逻辑
核心入口在 internal/data/data.go:程序启动时调用NewDB()打开数据库文件,并自动确保排行榜表存在,用户完全无感知。
📂 数据库文件在哪里?XDG 数据目录自动管理
你不需要手动创建数据库文件。Tetrigo 遵循 Linux 的 XDG 规范,在 cmd/tetrigo/main.go 中通过xdg.DataFile自动定位数据库路径:
| 平台 | 默认数据库位置 |
|---|---|
| Linux | ~/.local/share/tetrigo/tetrigo.db |
| 其他平台 | 对应用户数据目录下的tetrigo/tetrigo.db |
如果第一次运行,文件会自动创建。你也可以用--db参数指定自定义路径,配置文件则支持--config参数覆盖,详见 cmd/tetrigo/main.go 中的GlobalVars定义。
🗂️ 排行榜表结构:6 个字段完整保存一局比赛
整个排行榜就是一张leaderboard表,建表语句在 internal/data/data.go 的EnsureTablesExist()中:
CREATE TABLE IF NOT EXISTS leaderboard (id INTEGER PRIMARY KEY, game_mode TEXT, name TEXT, time INTEGER, score INTEGER, lines INTEGER, level INTEGER)每个字段的含义如下:
- game_mode:游戏模式(Marathon / Sprint / Ultra),不同模式独立排行
- name:玩家昵称,缺省为
Anonymous - time:本局用时
- score:总得分,是排名的第一依据
- lines:累计消行数
- level:最终达到的等级
对应的 Go 结构体Score和数据访问层LeaderboardRepository定义在 internal/data/leaderboard.go,职责非常清晰:Save()负责写入一局成绩,All()负责按模式取出全部记录。
⏱️ 高光时刻如何入库?从游戏结束到分数落库的完整流程
这是整个排行榜最精彩的部分,流程一共 4 步:
- 游戏结束触发:当方块堆顶或计时器耗尽时,internal/tui/views/single.go 中的
gameOverUpdate()拦截退出按键 - 组装成绩:从对局引擎
single.Game中取出总分、消行数、等级,连同玩家昵称打包成一个data.Score - 写入数据库:切换到排行榜模式时,internal/tui/views/leaderboard.go 的
NewLeaderboardModel()调用repo.Save()完成 INSERT,并拿到新记录的 ID - 高亮展示:排行榜表格会定位到你这条新记录,选中行用醒目的颜色标出——你的高光时刻,一眼就能看到
排序规则也很合理:All()的 SQL 使用ORDER BY score DESC, time ASC,分数高者优先,同分比用时,完全符合竞速类游戏排行惯例。
⌨️ 如何查看本地排行榜?两种进入方式
方式一:游戏自然流转。任何一局结束后按 EXIT 键,就会自动进入对应模式的排行榜页面。
方式二:命令行直达。Tetrigo 提供了独立的leaderboard子命令(定义在 cmd/tetrigo/subcommands.go):
# 直接查看 Marathon 模式的本地排行榜 tetrigo leaderboard marathon # 查看 Sprint 模式排行榜 tetrigo leaderboard sprint进入后支持方向键上下滚动浏览长榜单(测试用例中 50 条记录的滚动场景可见 internal/tui/views/leaderboard_test.go),按?查看按键帮助,按Esc返回主菜单。
🎮 三种游戏模式独立计分,支持自定义玩家昵称
Tetrigo 内置三种模式,各自维护独立的排行榜:
| 模式 | 玩法 | 结束条件 |
|---|---|---|
| Marathon | 经典马拉松 | 方块堆到顶部,上限 15 级 |
| Sprint | 40 行冲刺 | 消满 40 行或堆顶 |
| Ultra | 限时挑战 | 2 分钟内尽可能得分 |
命令行方式开局时,可以用-n参数指定玩家昵称,它会被记录到排行榜的name字段:
# 以 "Ace" 的名字开始一局 Sprint,记录会写入本地排行榜 tetrigo play sprint -n Ace如果不通过菜单设置昵称,默认以Anonymous身份上榜。
🚀 如何安装 Tetrigo 并快速体验本地排行榜?
Tetrigo 是一个纯 Go 项目,安装非常直接:
# 克隆仓库 git clone https://gitcode.com/gh_mirrors/te/tetrigo cd tetrigo # 构建并启动 go build -o tetrigo ./cmd/tetrigo ./tetrigo启动后进入主菜单,填写用户名、选择模式和起始等级,开玩。一局结束后你的成绩就会自动存入 SQLite 排行榜——下次打开leaderboard子命令,就能看到它在那里等你。
✨ 小结:一个极简但完整的本地排行榜
Tetrigo 的 SQLite 排行榜实现堪称"小而美"的范本:
- 一个文件搞定存储,XDG 目录自动管理,零配置
- 一张表完整记录 6 个维度的比赛数据
- 两个方法(
Save/All)覆盖全部读写需求 - 分数降序 + 用时升序的排序规则简单且公平
想深入了解游戏引擎层面的计分规则,可以看看 pkg/tetris/scoring.go;想研究排行榜视图的表格渲染细节,internal/tui/views/leaderboard.go 是最直接的入口。
【免费下载链接】tetrigoPlay Tetris in your terminal.项目地址: https://gitcode.com/gh_mirrors/te/tetrigo
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考