Go语言实现1024终端游戏-不到400行代码

先放源码地址,喜欢看源码翻源码,喜欢看文章的继续继续看文章

https://github.com/taadis/go1024 - go1024

使用 go 语言实现的 1024 终端游戏,不到400行代码,代码简洁,以便理解和学习和掌握 go 语言开发.

安装和运行

要运行这个程序,你需要先安装依赖:

复制代码
go mod tidy

然后运行程序即可:

复制代码
go run main.go

游戏运行如下:

复制代码
     2     0     0     0

     4     2     0     0

     8    32     4     2

    32    16     8    16

Score: 380
请使用方向键操作,按快捷键 Ctrl+C 可退出游戏.

游戏实现

当前游戏实现了以下内容:

  1. 基于 go 语言的跨平台、可移植的终端游戏、包管理
  2. 1024游戏的核心逻辑
  3. 基于 ANSI 的终端颜色显示
  4. 键盘控制
  5. 得分计算
  6. 游戏结束检测
  7. 跨平台兼容性
  8. 基本的错误处理

随机数生成

我们使用 rand 来生成随机数。在本游戏中随机数主要有两个作用:

  1. 随机生成新数字的位置:
go 复制代码
slot := emptySlots[rand.Intn(len(emptySlots))]
  1. 随机决定生成2还是4:
go 复制代码
if rand.Float64() > 0.95 {
    value = 4  // 5%的概率生成4
} else {
    value = 2  // 95%的概率生成2
}

如果不设置随机数种子,每次运行游戏时随机数生成器都会使用相同的默认种子,这样:

  1. 每次游戏开始时数字出现的位置都会相同
  2. 新数字的值(2或4)的出现顺序也会相同
  3. 游戏失去了随机性,变得可预测

使用当前时间的纳秒数作为种子,可以确保每次运行游戏时都会得到不同的随机序列,使游戏更有趣和不可预测性。

颜色表示

根据数字的大小返回不同的颜色代码.

我们使用的数字是 ANSI 转义序列中的颜色代码。在终端中,我们使用 \033[ 开头的转义序列来控制文本的显示效果。

ANSI 转义序列的颜色代码是有限的,主要分为这几组:

  1. 基本前景色:30-37
  2. 基本背景色:40-47
  3. 高亮前景色:90-97
  4. 高亮背景色:100-107

98、99 和 108 以后的数字并不是标准的 ANSI 颜色代码,不会产生颜色效果。

具体解释:

  1. \033[ 是转义序列的开始标记(ESC 字符)
  2. 后面的数字是颜色代码:
    • 30-37:基本前景色(文字颜色)
      • 31: 红色
      • 32: 绿色
      • 33: 黄色
      • 34: 蓝色
      • 35: 紫色
      • 36: 青色
      • 37: 白色
    • 90-97:高亮前景色
      • 90: 亮灰色
      • 91: 亮红色
      • 92: 亮绿色
        等等...

在代码中:

go 复制代码
fmt.Printf("\033[%dm%6d\033[0m", color, g.Board[i][j])
  • \033[%dm 设置颜色
  • %6d 显示数字(6位宽度)
  • \033[0m 重置所有属性

所以当我们使用 color = 90 时,就会显示亮灰色文字,这在游戏中用来表示空位(值为0的格子)。

如果需要更丰富的颜色,可以使用:

  1. 24位真彩色:\033[38;2;R;G;Bm
  2. 256色:\033[38;5;Nm(N是0-255之间的数字)

例如:

go 复制代码
// 24位真彩色(红色)
fmt.Printf("\033[38;2;255;0;0m文本\033[0m")

// 256色(第100号颜色)
fmt.Printf("\033[38;5;100m文本\033[0m")

但这些高级颜色特性可能不是所有终端都支持,所以在通用程序中一般还是使用基本的 ANSI 颜色代码(30-37, 90-97)。

退出游戏

退出游戏主要通过监听取消信息来实现

  1. 添加了 os/signalsyscall
  2. 使用 signal.Notify 来捕获 SIGINT (Ctrl+C) 和 SIGTERM 信号
  3. 启动一个 goroutine 来处理信号,收到信号时:
    • 关闭键盘监听
    • 退出程序
  4. 移除了原有的 Ctrl+C 检查代码

这样修改后,无论在程序的任何时刻按下 Ctrl+C,都能正确退出程序。同时也会确保键盘资源被正确释放。

后面改为使用 github.com/eiannone/keyboard 包了,简化逻辑处理.

相关推荐
lekami_兰29 分钟前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
却尘4 小时前
一篇小白也能看懂的 Go 字符串拼接 & Builder & cap 全家桶
后端·go
ん贤5 小时前
一次批量删除引发的死锁,最终我选择不加锁
数据库·安全·go·死锁
mtngt1117 小时前
AI DDD重构实践
go
Grassto2 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
Grassto4 天前
11 Go Module 缓存机制详解
开发语言·缓存·golang·go·go module
程序设计实验室5 天前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go
我的golang之路果然有问题5 天前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo
啊汉7 天前
古文观芷App搜索方案深度解析:打造极致性能的古文搜索引擎
go·软件随想
asaotomo7 天前
一款 AI 驱动的新一代安全运维代理 —— DeepSentry(深哨)
运维·人工智能·安全·ai·go