前言:终端不止能跑命令,还能跑游戏!
说到“俄罗斯方块”,你是不是脑海里已经浮现出五彩方块下落、整行消除的画面?你可能以为这类游戏只能在 Web、桌面软件或手游中才能玩。
错!今天我就用 Go 语言教你,在终端里跑出一款炫酷的俄罗斯方块!
而且 ——
✔️ 无需图形库
✔️ 跨平台(macOS/Linux/Windows)
✔️ 轻松编译部署
✔️ 终端像素风,复古又解压
技术栈 & 项目介绍
这个项目使用 Go 语言构建,主要依赖一个经典库: termbox-go
它能帮我们在终端中:
- • 获取键盘事件(如方向键、退出)
- • 实现彩色字符绘制(ASCII 像素画)
- • 实现无 flicker 的刷新绘图
项目结构核心思路
- • 使用二维数组模拟游戏棋盘
- • 使用结构体定义“方块”形状与位置
- • 用
termbox.SetCell画出一个个小方块 - • 方向键控制移动、旋转,定时下落
- • 方块到底后合并并检测是否消行
- • 支持游戏结束提示
核心代码片段剖析
1. 初始化终端和棋盘
err := termbox.Init()
if err != nil {
panic(err)
}
defer termbox.Close()
初始化 termbox 环境,准备在终端绘图。
2. 定义七种俄罗斯方块
var tetrominoes = [][][]int{
{{1, 1, 1, 1}}, // I
{{1, 1}, {1, 1}}, // O
{{0, 1, 0}, {1, 1, 1}}, // T
...
}
每个形状用二维数组表达,“1”表示方块像素,“0”表示空白。
3. 控制移动 & 旋转逻辑
switch ev.Key {
case termbox.KeyArrowLeft:
if canMove(t, -1, 0) { t.x-- }
case termbox.KeyArrowRight:
if canMove(t, 1, 0) { t.x++ }
case termbox.KeyArrowUp:
rotated := rotate(t)
tmp := Tetromino{shape: rotated, x: t.x, y: t.y}
if canMove(tmp, 0, 0) { t.shape = rotated }
}
判断是否能移动或旋转,不合法则忽略操作。
4. 自动下落 + 消行检测
for {
<-ticker.C
if canMove(t, 0, 1) {
t.y++
} else {
merge(t)
clearLines()
t = newTetromino()
}
}
ticker每 500ms 触发下落逻辑,方块合并后再随机生成一个新方块。
5. Game Over 处理
if !canMove(t, 0, 0) {
tbPrint(5, 10, termbox.ColorRed, termbox.ColorDefault, "Game Over!")
termbox.Flush()
time.Sleep(2 * time.Second)
return
}
方块生成初始位置就卡住了?说明没空间了,游戏结束!
实际运行效果(终端界面)
████ ██
██ ████
████
█ █████ ██████
Game Over!
使用
█字符画出方块 + 彩色填充 + 支持交互。终端也能这么玩!
项目运行指南(适用于 macOS)
# 安装 termbox
go get github.com/nsf/termbox-go
# 运行游戏
go run main.go
如果你遇到 open /dev/tty: device not configured 或 exec format error:
请执行以下清理命令确保运行环境正确:
go clean
unset GOARCH
unset GOOS
go run main.go
可拓展功能(进阶挑战)
- • 增加得分系统
- • 音效支持(如 Beep、消行提示音)
- • 使用 Ebiten 改成图形版本
- • 支持存档与排行榜
总结
这个项目看似简单,但覆盖了:
- • 数组处理
- • 协程并发
- • 键盘事件捕获
- • 游戏引擎基本逻辑
如果你正在学习 Go,或者想做一个酷炫又轻量的项目,不如试试这个“终端俄罗斯方块”,带你轻松打开 Go 的游戏开发大门!
如果你觉得有趣,不妨点赞 / 收藏 / 分享,让更多人看到!
需要我帮你把它打包成 GitHub README 或项目介绍文档吗?或者做个图形版升级版?我都可以帮你搞定~