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

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. 随机生成新数字的位置:
slot := emptySlots[rand.Intn(len(emptySlots))]
  1. 随机决定生成2还是4:
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: 亮绿色

        等等...

在代码中:

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之间的数字)

例如:

// 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 包了,简化逻辑处理.

Go语言实现1024终端游戏-不到400行代码的更多相关文章

  1. HTML5游戏实战(4): 20行代码实现FlappyBird

    这个系列很久没有更新了.几个月前有位读者调侃说,能不能一行代码做一个游戏呢.呵呵,接下来一段时间,我天天都在想这个问题,怎么能让GameBuilder+CanTK进一步简化游戏的开发呢.经过几个月的努 ...

  2. HTML5游戏实战之20行代码实现打地鼠

    之前写过一篇打地鼠的博客70行的代码实现打地鼠游戏,细致思考过后,发现70行代码都有点多余了,应用tangide的控件特性,能够将代码量缩减到20行左右. 先show一下终于成果,点击试玩:打地鼠.或 ...

  3. JQuery实现1024小游戏

    最近用Jqery写了一个1024小游戏,由于是第一次写小游戏,所以就选了一个基础的没什么难度游戏.具体实现如下: 首先在开发时将整个游戏分成两层(自认为),底层是游戏的数据结构以及对数据的操作,上层是 ...

  4. 使用 Go 语言开发大型 MMORPG 游戏服务器怎么样?(非常稳定、捕获所有异常、非常适合从头开始,但大公司已经有现成的C++框架、所以不会使用)

    使用 Go 语言开发大型 MMORPG 游戏服务器怎么样?和C Socket服务器比起来有什么优劣?可行性怎么样? 从2013年起,经朋友推荐开始用Golang编写游戏登陆服务器, 配合C++做第三方 ...

  5. C语言实现推箱子游戏完整代码

    C语言实现推箱子游戏完整代码 前言 自己做的,可能有些代码不够工整,或者有些小问题,但游戏的基本操作是可以实现的 代码效果 代码一共分为8个部分,4个控制上下左右移动,2个判断输赢,1个统计归为的个数 ...

  6. 3行代码,为QQ轻游戏加上语音互动能力

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云 发表于云+社区专栏 游戏和社交往往有着密不可分的关系,QQ轻游戏就是一款集成在手Q里面的游戏平台,直接通过手Q入口就能随开 ...

  7. 37行代码实现一个简单的打游戏AI

    不废话,直接上码,跟神经网络一点关系都没有,这37行代码只能保证电脑的对敌牺牲率是1:10左右,如果想手动操控,注释掉autopilot后边的代码即可. 哪个大神有兴趣可以用tensorflow或者s ...

  8. Html5游戏开发-145行代码完成一个RPG小Demo

    lufy前辈写过<[代码艺术]17行代码的贪吃蛇小游戏>一文,忽悠了不少求知的兄弟进去阅读,阅读量当然是相当的大.今天我不仿也搞一个这样的教程,目地不在于忽悠人,而在于帮助他人. 先看de ...

  9. 在 mongodb 终端环境下写多行 javascript 代码、函数

    工作中碰到一个问题,需要把某个 collection 中的某些符合条件的数据取出来,逐行处理其中某些字段.mongodb 终端下支持直接写 js 代码.函数,也可以运行 js 文件.1 首先需要设置 ...

  10. 写一个程序,统计自己C语言共写了多少行代码。ver2.00

    概要 完成一个程序,作用是统计一个文件夹下面所有文件的代码行数.输入是一个文件夹的绝对路径,输出是代码行数.所以此程序的新特点有两个: 统计某一文件夹下的所有文件: 可以任意指定本机硬盘上任何位置的某 ...

随机推荐

  1. 关于前端上传excell时间的问题

    当前端导入excell里的数据时,只能获取到下面类似的这种数据 Excel存储的日期是从1900年1月1日开始按天数来计算的,也就是说1900年1月1日在Excel中是1. 转化的思路和对Excel中 ...

  2. Solution Set -「AGC 007~009」C~F

    目录 「AGC 007C」Pushing Balls 「AGC 007D」Shik and Game 「AGC 007E」Shik and Travel ^ 「AGC 007F」Shik and Co ...

  3. .NET CORE 中用AutoMapper将实体转Dto

    .NET CORE 中用AutoMapper将实体转Dto 星速云 2019-08-31 10:06:02 193 收藏展开在开发过程中,经常会碰到数据实体对象(Entity)和数据传输对象(Dto) ...

  4. runoob-Android 基础入门教程-1

    https://www.runoob.com/w3cnote/android-tutorial-interface-design.html 公司的话,大部分使用的都是Axure Rp,但是这个东西比较 ...

  5. 隐私集合求交(PSI)-两方

    在知乎上看到大佬写的关于论文:Efficient Batched Oblivious PRF with Applications to Private Set Intersection的讲解,循序渐进 ...

  6. 使用kNN算法改进约会网站配对效果(尺度归一化问题)

    简单匹配:

  7. dart 中在实例化 new 关键字可以省略不写

    dart 中在实例化 new 关键字可以省略不写 class Person { String name; int age; String sex; Person(this.name, this.age ...

  8. 国产开源跨平台软件开发框架新选择:SOUI5

    一.SOUI5跨平台解决方案的实现框架介绍 SOUI5 是一款专为跨平台客户端开发设计的国产框架,源代码:Github or Gitee, 其核心优势在于通过自主实现的 Swinx,在 Linux 平 ...

  9. Codeforces 319B Psychos in a Line 题解 [ 绿 ] [ 单调栈 ] [ 动态规划 ] [ adhoc ]

    Psychos in a Line:很好的单调栈优化 dp 题! 观察 我们先观察,一个精神病人会一直杀到什么时候.显然,会杀到右边第一个比他大的精神病人那里,然后他就杀不动了. 因此我们可以从右往左 ...

  10. ORACLE 分页排序后的数据重复或缺失问题

    今天一大早业务人员就反映说用户导出的订单数据,有好几单是重复,并且缺失了某一单. 第一步:查询数据表.表里实际数据没有重复,也没有缺失.那么就可能是导出过程出错了(因为是异步分页导出,所以最先怀疑这部 ...