news 2026/8/22 14:12:15

Tetrigo如何用SQLite记录你的高光时刻:本地排行榜从零到完整实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Tetrigo如何用SQLite记录你的高光时刻:本地排行榜从零到完整实现

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 步:

  1. 游戏结束触发:当方块堆顶或计时器耗尽时,internal/tui/views/single.go 中的gameOverUpdate()拦截退出按键
  2. 组装成绩:从对局引擎single.Game中取出总分、消行数、等级,连同玩家昵称打包成一个data.Score
  3. 写入数据库:切换到排行榜模式时,internal/tui/views/leaderboard.go 的NewLeaderboardModel()调用repo.Save()完成 INSERT,并拿到新记录的 ID
  4. 高亮展示:排行榜表格会定位到你这条新记录,选中行用醒目的颜色标出——你的高光时刻,一眼就能看到

排序规则也很合理: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 级
Sprint40 行冲刺消满 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/22 14:06:17

sg-exam:从克隆到跑通的在线考试平台完整部署教程

sg-exam:从克隆到跑通的在线考试平台完整部署教程 【免费下载链接】sg-exam 基于Spring Boot搭建的新一代教学管理平台,提供权限管理、考试、问卷、练习等功能 项目地址: https://gitcode.com/gh_mirrors/sg/sg-exam sg-exam 是一个基于 Spring B…

作者头像 李华