俄罗斯方块讲解.doc
上传人:sy****28 上传时间:2024-09-15 格式:DOC 页数:3 大小:41KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

俄罗斯方块讲解.doc

俄罗斯方块讲解.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

俄罗斯方块代码2006-1-1710:20:00【收藏】【评论】【打印】【关闭】先写原理:本次的俄罗斯方块代码出其的简单比我去年写的四十几K要小得多实际上核心代码只有3-4K而且很容易理解适合有一点C语言基础并对此有兴趣的人.这前面只粗略讲解核心算法:这里把游戏的关键设计放在三个盒子和一个坐标上:大盒子:一个两维数组记录着方块点阵的开与关把游戏的舞台想像成一个点阵在下面也把这个东西称为地图两个55小盒子:两维数组一个盛放着正在下落的方块一个盛放在下一个下落的方块即next当然这两个也必须想像成一个点阵:如长条的点阵为:0000000100001000010000100现在你只要有这么一个概念:一个不断定时下落的小盒子从大盒子顶部下降到底部之后再将next盒子放在下落盒子再进行下一轮的下落...中间的控制等尚不要太着急.现在面临着一个问题:下落的盒子和地图之间要怎么联系起来一个好的方法是再定义一个坐标:xy保存着小盒子左上角在地图上对应的下标位置即当x0y0时小盒子处于地图的左上部.如此当小盒子需要移动时即只须要改变xy的值.现在说说旋转.小盒子保存着当前下落形状的点阵那么旋转就只须要将这个点阵旋转90度:例如:0000000000001000000000100-gt0111100100000000010000000这一点实现起来还是不太难的.判断碰撞通常这种情况只须要在有移动小盒或旋转盒子时发生:也即点阵非空是互斥的当小盒要向下移x时如果小盒里的点阵与地图上的点阵非空的地方重叠则不能下移卡住了旋转则转换后的形状与地图有冲突则要放弃旋转.到了这里你应该有一个大概的了解了至于怎样在屏幕上画出来这个是比较简单的下面的代码会慢慢与你解释.//接下一贴/此帖尚未评分作者:clbaker发表时间:2006-1-1214:16:00回复引用专家分:80第2楼includeltstdio.hgt会员信息includeltstdlib.hgt发短消includeltbios.hgt/这里须要读取系统运行时间来作为定时器/息includeltgraphics.hgt/很不幸TC2的简单图形让我放弃了用/所属BLOGincludeltconio.hgt/win32openGL来讲解./defineMAX_X14/可见最大X/defineMAX_Y21/可见最大Y//我们定义了最大的可见X和Y那么即还有不可见的部分事实上地图大盒子里的左右两侧和底部各两行都被1填充这样大大简化出界的判断事实上在本例中没有这样的代码因为旁边有一圈1阻止小盒子越出大盒子的按制范围/defineMAX_C7/最大种类这个无须解释/defineKEY_UPw/定义上下左右按按键/defineKEY_DOWNsdefineKEY_LEFTadefineKEY_RIGHTddefineKEY_ESC27/退出/typedefintBOOLdefineFALSE0defineTRUE1/这几个TC中没有...自己定义一下吧://时钟结构/typedefstruct/时钟结构/BOOLenabled/时钟是否开启/unsignedintintervel/定时间隔/unsignedintlasttime/这个属于内部使用变量/Timer/现在进入了编程的初质阶段在开始处我会写出所有的函数原形以及它们的作用main函数在程序的最后你可以在这里看到整个游戏的组织架构很好它只有几十行并且非常容易理解当然还是先看一下函数原形及解释//函数原形及说明//以下三个函数可以参照Timer结构体.在函数声明后面/intGetTickCount/返回电脑或操作系统运行逝去的时间//在win32环境下已包含在windows.h里边返回的是4byte//在DOS本代码环境下要自己编写使用到BIOS.h内容/intsetTimerTimertunsignedintintvBOOLen/设置时钟t参数分别为时钟指针时间间隔是否活动//时间间隔win32下为毫秒DOS下为1/18秒有点低/BOOLtestTimerTimert/测试时钟t是否到达定时时间//如下面这段代码://setTimerampt11设置1个单位的间隔while1iftestTimeramptprintfquotActivenquot将会定时1个单位在屏幕上打印Active一般来说testTimer必须放在循环中反复执行激活时返回1/voidrendervoid/唯一的绘图函数//注意此函数重画整个地图根据地图中的点阵以及根据小盒在地图的中坐标在恰当位置画出小盒子//DOS的图形当然是很低的但全屏绘图在这里还是过得去的我用的是双缓冲交换绘图这样感觉好点/voidinitMapvoid/初始化地图大盒子//之前提到过在这个两维数组中有一圈为1的