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 ...
随机推荐
- 第3章 Java语言基础----成员变量与局部变量
在对局部变量进行赋值时,不能对非静态字段age进行静态引用,图1错误,加上static后图二正确,图3与图4类似,如下图所示: 图1图2 图3图4 2.成员变量times在类中定义,局部变量times ...
- Linux KVM 安装配置
--------------------------一.前言二.环境三.安装与配置四.创建kvm虚拟机 一.前言 KVM,即Kernel-based Virtual Machine的简称,是一个开源的 ...
- u盘烧写后实际容量变小了
百度了一下 : http://jingyan.baidu.com/article/d45ad148f383ea69552b808a.html 百度下载 USBoot 打开软件 列表中选择你的U盘,点击 ...
- java 静态方法和单例模式的区别
1.加载时间 首先明白内存问题 Java内存分为:堆内存.栈内存.方法区(静态区和非静态区).本地方法区 无论是静态方法还是非静态方法,在内存中都只有一份分别位于方法区的静态区和非静态区:非静态方法在 ...
- mysql主从数据库
Mysql主从配置,实现读写分离 大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库 ...
- java设计模式案例详解:工厂模式
1.简单工厂模式 在不考虑扩展的情况下还是很好用的,其实我们写代码也很经常用到,其主要理解在于传入不同参数则构建不同对象,只有一个工厂,如需添加产品涉及到扩展需要修改比较多的东西,不符合开闭原则,如下 ...
- linux ubuntu下如何安装并且切换java版本(Unsupported major.minor version 52.0)
最近在做一个dcos(数据中心操作系统)的东西,需要用marathon来做进程管理.遗憾的是0.6版本的marathon在API方面很是缺少,换成了0.15版本之后,运行时提示“Unsupported ...
- Socks
Socks time limit per test 2 seconds memory limit per test 256 megabytes input standard input output ...
- 第一个python实例程序
#!/usr/bin/python2.7 import os ls = os.linesep fname = raw_input("fname:"); while True: if ...
- Viewpager实现图片轮播
//-------------主布局文件------------------------------------- <LinearLayout xmlns:android="http: ...