事情是这样子的,前阵子我想重新把算法学习一下,在看到动态规划的时候,莫名想到这些算法题目就跟游戏一样,每个游戏都有规则,要过关,就要在游戏规则下达到特定的目标。所以,我萌生了把算法题做成一个游戏的想法,不管什么算法都行,规则我可以自己定义。

那么,做个游戏,它总要有界面,自然我不会写gui,暂时也没有想用golang的gui库的想法。所以我的第一步是用终端先实现一个,在界面上能够显示出东西。这个要求对于golang来说一点都不高。

再来,是游戏规则的设定,这个游戏,我会分几个版本去完成它,多以第一个版本,我会设定得足够简单,规则如下:界面上会由n×m个点组成,通过键盘上的方向键控制点的移动,从起点到达终点即可完成看任务。如图:

界面.png

我们分析一下,完成这样一件事情,我们需要做的工作有哪些?

  1. 首先要监听键盘事件,要监听到方向键的点击事件;
  2. 要渲染界面,打印出圆圈和方块,并且方向键点击时,重新渲染界面;
  3. 要有路径,从起点到终点的路径要打印出来。

我用了一个库“github.com/nsf/termbox-go”,用来监听键盘事件,在监听到方向键事件时,将屏幕清屏,重新渲染界面,打印出方块和圆圈,方块形成了一个起点到终点的路径。看一下效果图:

示例.gif

这里的主要工作量在于路径的打印,这里我用一个链表来表示路径:

type Point struct {
	X         int
	Y         int
	LastPoint *Point
}

由这个链表就可以知道整条路径是什么样的了,当然这其中还包含了一些错误的处理,比如边界问题等等。具体实现,可以去github上看完整代码,文末附上地址。

我再介绍一下我的代码目录,有助于理解我这么划分的意义:

├─components
     └─types.go  # 存放一些属性的结构体,point
├─keyboard
    └─keyboard.go  # 键盘事件
├─render
    └─render.go  # 渲染界面
├─rounds
    └─rounds.go  # 界面有关参数,如长度、宽度等
└─main.go

这个目录结构主要是为了保持扩展性,如rounds这个目录是专门用来读取游戏的参数,之所以叫做rounds,是因为我希望这个游戏有几个关卡,每个关卡都可能有不同的参数。

第一个版本到此结束,后面的版本我会添加更多限制和规则,让这个游戏看起来不这么无聊。项目地址是:https://github.com/TomatoMr/boomboom.git。

欢迎关注我的公众号:onepunchgo,给我留言。

image