写个TERTRIS
用go写了个TETRIS
突发奇想闲来无事情想用go写一个Tertris(俄罗斯方块)玩
上网小小检索了一下,确实有很多可以实现游戏ui的2D引擎,但比较懒,不是很像搞明白怎么去用,所以选择了直接在终端打印出来。
既然想做,那就想想应该如何设计
先看看正版到底长啥样
分析一下:
- 有个方方的游戏区域(显而易见)
- 方块会自然下落(这个嘛,没想好怎么处理就设计成直接放置的那种)
- 一行满了消去一行,然后下落
开始写吧
先定义一个游戏结构
1 | type Game struct { |
第一步当然是初始化了
1 | func BoardInit(g *define.Game) { |
然后就是打印出游戏区域
1 | // 打印游戏板 |
就可以看到像这样的输出
然后就应该在上方形成方块了
因为只有7种基本形状,于是为决定直接定义7个基本形状
至于为什么定义为4x4,是因为在游戏中这些方块是可以旋转的,为了简单起见,决定统一定义成4x4的结构,在旋转中只需修改它们的位置就好了
1 | var Tetrominoes = [][][]int{ |
每次获取的方块都是随机的于是
1 | func RandomTetromino() [][]int { |
就可以打印出类似于这样的界面
至于移动或旋转就很简单了,只需找到生成的方块再作相应处理就好了,这里就不贴出代码了。
下面处理消去一行的操作
其实就是每次遍历一下
1 | func ClearFullRows(g *define.Game) { |
这时候就有了个问题
如何下落?
- 首先,相互连接的方块是不可以掉到底部的
- 消去的不一定是下一行
- 所有相连的方块是一个整体
那这有有点头疼了,首先就是如何找到掉落方块整体,然后如何确定掉落高度
那就先处理如何找到掉落方块整体区间
由于只需要确定最小下落值,所以只用确定方块的左右范围就好了,但如何区查找呢?
因为整体说明这些方块左右上下想连,所以可以使用DFS算法去查找!
这里格外传入了i
和j
两个值代表开始检索的左下角,因为只有在清除行上的部分才会发生掉落,所以要传入坐标以确定起始位置
而传入的left
和right
就修改为得到的数值而继续使用
1 | func Dfs(grid [][]int, i int, j int, visited [][]bool, left *int, right *int) { |
关于掉落块的掉落高度
emmm好像没啥好分析的,直接给出代码
1 | // 从左往右查找,这个方法比较蠢 |
运行例子,可能一定还有一堆bug,不过能跑就好
这是我的代码仓库,还有许多不足,望日后逐步修正