说到“俄罗斯方块”,你是不是脑海里已经浮现出五彩方块下落、整行消除的画面?你可能以为这类游戏只能在 Web、桌面软件或手游中才能玩。
错!今天我就用 Go 语言教你,在终端里跑出一款炫酷的俄罗斯方块!
而且 ——
✔️ 无需图形库
✔️ 跨平台(macOS/Linux/Windows)
✔️ 轻松编译部署
✔️ 终端像素风,复古又解压
这个项目使用 Go 语言构建,主要依赖一个经典库: termbox-go
它能帮我们在终端中:
termbox.SetCell
画出一个个小方块err := termbox.Init()
if err != nil {
panic(err)
}
defer termbox.Close()
初始化 termbox 环境,准备在终端绘图。
var tetrominoes = [][][]int{
{{1, 1, 1, 1}}, // I
{{1, 1}, {1, 1}}, // O
{{0, 1, 0}, {1, 1, 1}}, // T
...
}
每个形状用二维数组表达,“1”表示方块像素,“0”表示空白。
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 }
}
判断是否能移动或旋转,不合法则忽略操作。
for {
<-ticker.C
if canMove(t, 0, 1) {
t.y++
} else {
merge(t)
clearLines()
t = newTetromino()
}
}
ticker
每 500ms 触发下落逻辑,方块合并后再随机生成一个新方块。
if !canMove(t, 0, 0) {
tbPrint(5, 10, termbox.ColorRed, termbox.ColorDefault, "Game Over!")
termbox.Flush()
time.Sleep(2 * time.Second)
return
}
方块生成初始位置就卡住了?说明没空间了,游戏结束!
████ ██
██ ████
████
█ █████ ██████
Game Over!
使用
█
字符画出方块 + 彩色填充 + 支持交互。终端也能这么玩!
# 安装 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
这个项目看似简单,但覆盖了:
如果你正在学习 Go,或者想做一个酷炫又轻量的项目,不如试试这个“终端俄罗斯方块”,带你轻松打开 Go 的游戏开发大门!
如果你觉得有趣,不妨点赞 / 收藏 / 分享,让更多人看到!
需要我帮你把它打包成 GitHub README 或项目介绍文档吗?或者做个图形版升级版?我都可以帮你搞定~