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 ...
随机推荐
- android网络编程之HttpUrlConnection的讲解--实现文件的断点上传
1.网络开发不要忘记在配置文件中添加访问网络的权限 <uses-permission android:name="android.permission.INTERNET"/& ...
- project文件问题
到编译文件中看看,红色的删除,坤哥这样做的 .
- 解决scrollview不滚动
scrollView不滚动的时候 试试这个,有时候药到病除:
- to_date()与to_char()
1.以时间(Date类型)为查询条件时,可以用to_date函数实现: select t.* from D101 t where t.d101_40 = to_date('2013/9/12', 'y ...
- runtime——消息机制
本文授权转载,作者:Sindri的小巢(简书) 从异常说起 我们都知道,在iOS中存在这么一个通用类类型id,它可以用来表示任何对象的类型 —— 这意味着我们使用id类型的对象调用任何一个方法,编译器 ...
- How To Install Apache Kafka on Ubuntu 14.04
打算学习kafka ,接触一些新的知识.加油!!! 参考:https://www.digitalocean.com/community/tutorials/how-to-install-apache- ...
- windows ORA-12560: TNS: 协议适配器错误
1.first it report ORA-12560: TNS: 协议适配器错误 手工设定环境变量如下: set ORACLE_HOME=d:\app\OAadmin\product\11.2.0\ ...
- regress
#! /bin/ksh ############### ### UAT ### ############### export ENVS=/test/change/env/env_test.sq ...
- javaweb作業中的幾個要點
1.DDoS攻击原理DDoS是指分布式拒绝服务(Distributed Denial of Service):试图通过恶意请求使系统或者网络超载进而无法继续提供服务.对于一个网站来说,这意味着,该网站 ...
- hdu1950 Bridging signals 最长递增子序列
用一个数组记下递增子序列长度为i时最小的len[i],不断更新len数组,最大的i即为最长递增子序列的长度 #include<cstdio> #include<algorithm&g ...