Go语言实现1024终端游戏-不到400行代码
开源君 /
03-30 /
50点赞 /
0评论 /
909阅读
使用 go 语言实现的 1024 终端游戏,不到400行代码,代码简洁,以便理解和学习和掌握 go 语言开发.
## 安装和运行
要运行这个程序,你需要先安装依赖:
```csharp
go mod tidy
```
然后运行程序即可:
```csharp
go run main.go
```
游戏运行如下:
```csharp
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/signal` 和 `syscall` 包
2. 使用 `signal.Notify` 来捕获 SIGINT (Ctrl+C) 和 SIGTERM 信号
3. 启动一个 goroutine 来处理信号,收到信号时:
- 关闭键盘监听
- 退出程序
4. 移除了原有的 Ctrl+C 检查代码
这样修改后,无论在程序的任何时刻按下 Ctrl+C,都能正确退出程序。同时也会确保键盘资源被正确释放。
后面改为使用 `github.com/eiannone/keyboard` 包了,简化逻辑处理.
本文来自投稿,不代表本站立场,如若转载,请注明出处:http//www.knowhub.vip/share/2/1844
相关资源
go语言开发1024游戏
查看内容
- 热门的技术博文分享
- 1 . ESP实现Web服务器
- 2 . 从零到一:打造高效的金仓社区 API 集成到 MCP 服务方案
- 3 . 使用C#构建一个同时问多个LLM并总结的小工具
- 4 . .NET 原生驾驭 AI 新基建实战系列Milvus ── 大规模 AI 应用的向量数据库首选
- 5 . 在Avalonia/C#中使用依赖注入过程记录
- 6 . [设计模式/Java] 设计模式之工厂方法模式
- 7 . 5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
- 8 . SQL 中的各种连接 JOIN 的区别总结!
- 9 . JavaScript 中防抖和节流的多种实现方式及应用场景
- 10 . SaltStack 远程命令执行中文乱码问题
- 11 . 推荐10个 DeepSeek 神级提示词,建议搜藏起来使用
- 12 . C#基础:枚举、数组、类型、函数等解析
- 13 . VMware平台的Ubuntu部署完全分布式Hadoop环境
- 14 . C# 多项目打包时如何将项目引用转为包依赖
- 15 . Chrome 135 版本开发者工具(DevTools)更新内容
- 16 . 从零创建npm依赖,只需执行一条命令
- 17 . 关于 Newtonsoft.Json 和 System.Text.Json 混用导致的的序列化不识别的问题
- 18 . 大模型微调实战之训练数据集准备的艺术与科学
- 19 . Windows快速安装MongoDB之Mongo实战
- 20 . 探索 C# 14 新功能:实用特性为编程带来便利
- 相关联分享
- Go语言实现1024终端游戏-不到400行代码