C语言写的俄罗斯方块
2014年最后一天, 任天堂将风靡全球30年的经典游戏<<俄罗斯方块>>下架. 作为全球最畅销的游戏, 其移植版本遍布各个平台. 下面这个是我去年在51平台上实现的, 使用12864液晶做为显示器, 用矩阵键盘操作. 大家都知道标准51只有几百字节的RAM, 当时我用的那款单片机RAM只有512字节, 使用256字节做为显示缓存, 还剩下256字节, 最后居然也够用.
前段时间兄弟很好奇这个游戏是怎么运作的(他有C语言基础), 想让我给他讲一下, 然后我就整理了一下代码, 将其移植到PC平台, 后来又将其移植到MSP430 Launchpad上, 使用超级终端(PuTTy)作为游戏界面.
代码使用模块化编写, 简单且易于移植. Windows平台的控制台程序和MSP430 Launchpad上的绝大部分代码都是相同的, 只有UI模块根据平台进行了重写. 所以, 如果你想要移植它到其它平台, 或者使用其它显示设备, 只要简单的重写UI模块即可实现.
在游戏模块中会将消行的行数返回, 而计分和升级全是独立于模块之外的, 故可使用自己的计分方法.
Windows控制台版本中的dep文件夹中是依赖模块, 用于改变控制台字符颜色与其它一些属性. 来自己第三方, 详见文件开头的声明.
另外在Windos控制台还实现了一个彩色版本, 接口与单色版本兼容. 在编译参数中定义 TETRIS_USE_COLOR 宏即可编译为彩色版. Windows控制台版本由GCC编译, 详细见对应目录下的builder.bat批处理文件.
MSP430 Launchpad版本使用PuTTy做为显示终端, 用IAR For MSP430进行编译, 对应目录下有建立好的工程文件可直接使用.
代码位于Github, 主分支为单色版本, 彩色版本见 CTetris 分支.
原理说明(以单色版本为例, 彩色版略有区别):
游戏主要使用两个表和一个缓存区来配合进行.
两个表中一个为方块(包括各个变形)的点阵数据表, 另外一个为方块旋转时的掩码表.
在两个表中每个数据为无符号16位整数, 每4个一组, 可以排列为一个4 * 4 的点阵, 方块数据就记录于此点阵中. 旋转掩码表的结构相同, 是用于简化方块旋转时冲突判断, 里面记录的是方块旋转时经过的所有路径. 可以将某一类方块数据和掩码数据展开看一下就会很轻松明白了.
冲突检测. 游戏的运行过程就是根据输入不改变方块的坐标, 判断方块移动情况, 采取相应的措施. 为了方便判断方块的旋转, 故使用了旋转掩码表. 旋转掩码表中标为1的地方就是方块旋转到下一个变形所经过的路径, 其对应的位置不可位于地图外, 且不可被占用, 否则表示方块不可旋转, 详见代码.
消行. 经典的俄罗斯方块地图区是10 * 20大小的, 在单色模式下使用了一个uint16_t[20]的数组做为地图, 方块的每一步动作都在地图中表现出来. 其中每一位表示地图中的一个小方格, 数组的每一个元素实际上只用到10位(横向), 所以当数据中某一个元素值大于2^10即1023时即表明此行已满, 再进行消行处理即可.
另外其它一些相关信息可参考源代码目录下的readme.md.
查看位于Github的源代码: https://github.com/ykaidong/Tetris