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
C语言写的俄罗斯方块的更多相关文章
- 自己用C语言写dsPIC / PIC24 serial bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). HyperBootlo ...
- 自己用C语言写单片机PIC18 serial bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). HyperBootlo ...
- 自己用C语言写单片机PIC16 serial bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 为什么自己写bootl ...
- C语言写的流氓关机程序及破解
记得大二刚开始接触电脑的那个时候,偶尔会弹出一个强制关机的窗口,当时没有办法,如下: 现在看来只是一个小程序而已,用C语言编写的: #include<windows.h> int main ...
- php调用一个c语言写的接口问题
用php调用一个c语言写的soap接口时,遇到一个问题:不管提交的数据正确与否,都无法请求到接口 1.用php标准的soap接口去请求 2.拼接xml数据去请求 以上两种方式都不正确 解决办法:php ...
- PIC12F629帮我用C语言写个程序,控制三个LED亮灭
http://power.baidu.com/question/240873584599025684.html?entry=browse_difficult PIC12F629帮我用C语言写个程序,控 ...
- JAVA调用C语言写的SO文件
JAVA调用C语言写的SO文件 因为工作需要写一份SO文件,作为手机硬件IC读卡和APK交互的桥梁,也就是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例 // 用JNI实现 // 实例: ...
- 用C语言写个程序推算出是星期几?(用泰勒公式实现)
在日常生活中,我们常常遇到要知道某一天是星期几的问题.有时候,我们还想知道历史上某一天是星期几.比如: “你出生的那一天是星期几啊?” “明年五一是不是星期天?我去找你玩?” 通常,解决这个问题的最简 ...
- 一个用 C 语言写的迷你版 2048 游戏,仅仅有 500个字符
Jay Chan 用 C 语言写的一个迷你版 2048 游戏,仅仅有 487 个字符. 来围观吧 M[16],X=16,W,k;main(){T(system("stty cbreak&qu ...
随机推荐
- PHP xdebug的安装
xdebug实际上就是PHP的一个第三方扩展 安装xdebug步骤和添加一个PHP扩展一样 linux:去xdebug官网下载对应版本的源码,然后像编译其他linux扩展一样,详解我的一篇关于Linu ...
- PHP配置安全小技巧
- UIImage图片拉伸方法
纵观移动市场,一款移动app,要想长期在移动市场立足,最起码要包含以下几个要素:实用的功能.极强的用户体验.华丽简洁的外观.华丽外观的背后,少不了美工的辛苦设计,但如果开发人员不懂得怎么合理展示这些设 ...
- Zookeeper: configuring on centos7
thispassage is referenced, appreciated. ZooKeeper installation: Download from this site Install java ...
- druid 文档 和 源码地址
Druid文档 :https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98 maven仓库:http://c ...
- UVALive 7299 Boggle(深搜的姿势)
一开始确实是我的锅,我把题意理解错了,以为是一个q周围没有q的时候才可以当时qu,其实是只要碰到q,他就是qu,所以我们也可以通过预处理的方式,把字典中的不满足qu连在一起的直接去掉. 后来的各种TI ...
- EM阅读资料
1,从最大似然到EM算法浅解 2,(EM算法)The EM Algorithm 3,数据挖掘十大算法----EM算法(最大期望算法) (番外)最大后验估计(MAP)
- hadoop伪分布式安装
hadoop的伪分布安装:一台实体机或虚拟机的安装. 环境:Windows7.VMWare.CentOS 1.1 设置ip地址 说明:在CentOS中的网络的类型: 仅主机模式:虚拟机在Windows ...
- 用telnet命令,POP3接收邮件
昨天已经成功利用telnet命令发送了邮件,今天接着来,只能发送不能接收多郁闷. 邮件的接收这里是基于pop3协议的,pop3协议共定义了12条与接收相关的邮件,如下面简单解释: 首先是与登陆验证相关 ...
- codeforces div2 677 D
http://codeforces.com/problemset/problem/677/D 题目大意: 给你一个n*m的图,上面有p种钥匙(p<=n*m),每种钥匙至少有一个,期初所有为1的钥 ...