ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:153.90KB ,
资源ID:28432352      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/28432352.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(俄罗斯方块王安.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

俄罗斯方块王安.docx

1、俄罗斯方块王安 软件应用技术论文题 目: 俄罗斯方块 院系名称: 信息科学与工程学院 专业班级: 计算机科学与技术0702班 学生姓名: 王安 学 号: 20074140212 2010年 12 月 10 目录1功能描述 22 系统功能模块 22.1 外部功能图 22.2 主函数功能图 33 模块划分 33.1 整个游戏的流程图 34算法思想及代码 34.1 俄罗斯方块的构造和储存 34.2 方块的移动 34.3方块的变形 34.4 方块移动和变形中所做的一些判断 34.5 显示方块 34.6 图形的更新 34.7 其他 35 测试情况 35.1 游戏中的界面 35.2 消行前的界面 35.3

2、 消行后的界面 35.4 游戏结束时的界面 31功能描述(1)游戏区域上方不断地出现预定义形状的方块,下坠方块可以通过旋转改变其显示形状,并且不断地往下坠,直到它接触到游戏区域底部或者其它之前已经累叠起的下坠方块。当一个下坠方块到达游戏区域底部或者接触到其他之前已经累叠起的下坠方块后,其位置则确定下来并占有该空间的位置区域。(2)当游戏区域的某一行被下坠方块完全填充,则消除该行的所有下坠方块,垒在其上的方块将按照一定的算法掉下代替改行空间。(3)游戏的结束是以下坠方块的顶部到达游戏区域顶部作为判断依据。(4)在游戏区域产生一个新的方块的一瞬间,立即产生下一个下坠方块的形状并在提示区域的左上方有

3、预先提示。同时,在游戏界面的右下方,将显示玩家所得的分数,已经消除的行数以及游戏的级别。每当游戏玩家成功消除一行方块时,将按照一定的算法计算出所得分数,并修改游戏状态区域的分数和行数的数值。(5)另外,游戏可提供不同的游戏级别,用户可根据自己的兴趣选择相应的级别。游戏级别的信息也将显示在游戏状态区域。(6)本游戏通过键盘方向键操作。在游戏过程中,当游戏玩家按up键时,则改变方块的形状;按right键时,则方块向右移一个单元;按left键时,则方向块左移一个单元;当按down键时,加速下落。当方块堆满方框顶是游戏结束,游戏提示玩家是否继续。(7)从键盘输入的各按键的代码分别为:ESC 0x011

4、b、 UP 0x4800、 DOWN 0x5000、 LEFT 0x4b00、 RIGHT 0x4d00 、SPACE 0x3920、 Y 0x1579 、N 0x316e。本游戏通过键盘方向键操作。在游戏过程中,当游戏玩家按up键时,则改变方块的形状;按right键时,则方块向右移一个单元;按left键时,则方向块左移一个单元;当按down键时,加速下落。2 系统功能模块2.1 外部功能图 图2.1 外部功能图2.2 主函数功能图 图 2.2 主函数功能图3 模块划分3.1 整个游戏的流程图的等5pst1.co3+p.j - 1 = 0_图 3.1 整个游戏流程图 游戏开始进入游戏,玩家根据

5、自己的情况选择游戏速度,速度选择过后就开始游戏,由游戏生成两个随机产生的方块,一个是当前方块,一个是下一个将要落下的方块,方块下落的同时玩家按键移动,移动时判断是否越界或到底,再判断消行,到底消行后就回到生成方块的地方继续,还要判断是否到顶,到顶就结束游戏。4算法思想及代码4.1 俄罗斯方块的构造和储存定义了一个结构表示形状:typedef struct shape int co8;shape;用一个结构体里面包含了一个数组来储存方块的坐标,所有的各种形状都可以放在4x4的格子里。假定第二列,第四行的格子坐标为(0,0)(如上图中黑块所示),则每个形状的四个方块都可以用4个数对来表示。坐标x从

6、左向右依次增加,y从上到下依次增加。表示的时候,组成该形状的四个方块从左到右,从上到下(不一定非要按这个顺序)。如上面七种形状的第一个用数对来表示就是(-2,0)、(-1,0)、(0,0)、(1,0)。结构shape中的co就是用来表示这4个数对的。为了简化程序,用一维数组xy8来表示。co0、co1表示第一个数对,co2、co3表示第二个数对,依次类推。七种形状及它们旋转后的变形体一共有19种形状,用一个全局数组表示。假定旋转的方向是逆时针方向(顺时针方向道理一样)。4.2 方块的移动表示方块形状的点Co不变,改变动点i,j来实现方块的移动,i为纵坐标,j为横坐标,所以当方块向左移动的时候就

7、是p.j-,当方块向右移动就是p.j+,方块向下移动的时候就是p.i+,在程序中还可以按空格键使方块直接落到底端,用一个循环来做,判断是否接触到底端,如果没有就执行p.i+。4.3方块的变形在该程序中,把7中方块的总共19不同变形都用结构体储存下来了,前面四种为一种形状的不同变形,第5种到第六种为一种形状的不同变形,第七种为正方形方块,没有变形,第八到第九为一种形状的不同变形,第十到十一也为一种形状的不同变形,十二到十五和十六到十九分别为两种方块的不同变形。程序中把方块定义为参数t,当按上键时执行t+,即变化为下一种情况,但是会遇到一个问题,就是假如t为四的时候再做t+就会变成五,但是五不是前

8、面四种形状中的一种变形,不符合要求,所以我用一个判断语句做个判断,即if(t1 = 3) t1 = 0;,该语句的意思是,假如t1等于3的时候就把t1赋值为0,不让它继续加导致变成另外一种类型的方块;下面的依次类推,如果t1不等于3、5、6、8、10、14、18等就可以直接执行t+了。方块变形的程序代码如下:if(t1 = 3&check_change( p, ps0) t1 = 0;else if(t1 = 5&check_change( p, ps4) t1 = 4; else if(t1 = 6) t1 = 6 else if(t1 = 8&check_change(p, ps7) t1

9、 = 7;else if(t1 = 10&check_change( p, ps9) t1 = 9;else if(t1 = 14&check_change(p, ps11) t1 = 11;else if(t1 = 18&check_change( p, ps15) t1 = 15;else if(check_change( p, pst1+1) t1+; break;上面代码中有函数check_change( p, pst1+1),该函数是做一个判断,在下面讲会讲到。4.4 方块移动和变形中所做的一些判断把移动、变形放到一个死循环中,用_kbhit()判断是否有键盘消息,用_getch()

10、接收键盘消息,其中0x50、0x4B、0x4d、0x48分别代表下键、左键、右键和上键,32代表按空格。接受到从键盘输入的这些消息后,就做该消息所对应的操作。每做一次就会清屏一次,并显示出来它做过该操后的效果。以下是代码:while(1) for(int i = 1; i = 30; i+) if(_kbhit()/_kbhit()判断是否有键盘消息 switch(_getch()/接收数据 case 0x50: / 向下移动 if(check_buttom(p, pst1) p.i+; system(cls); show(p,pst1,pst2); break;case 0x4B: / 向左

11、移动 if(backpst1.co0+p.ipst1.co1+p.j-1=0&backpst1.co2+.ipst1.co3+p.j-1=0&backpst1.co4+p.ipst1.co5+p.j-1=0&backpst1.co6+p.ipst1.co7+p.j-1=0) p.j-; system(cls); show(p,pst1,pst2); break;case 0x4d: / 向右移动 if(backpst1.co0+p.ipst1.co1+p.j+1=0&backpst1.co2+ p.ipst1.co3+p.j+1=0&backpst1.co4+p.ipst1.co5+p.j+1

12、=0&backpst1.co6+p.ipst1.co7+p.j+1=0) p.j+; system(cls); show(p,pst1,pst2); break; case 0x48:/ 变换形状 if(t1 = 3&check_change( p, ps0) t1 = 0; else if(t1 = 5&check_change( p, ps4) t1 = 4; else if(t1 = 6) t1 = 6; else if(t1 = 8&check_change(p, ps7) t1 = 7; else if(t1 = 10&check_change( p, ps9) t1 = 9; el

13、se if(t1 = 14&check_change(p, ps11) t1 = 11; else if(t1 = 18&check_change( p, ps15) t1 = 15; else if(check_change( p, pst1+1) t1+; break; case 32: /空格 直接降到底端 while(check_buttom(p, pst1) p.i+; default: break; 其中还需要注意的就是移动的时候要判断是否到达边缘,到达边缘之后就不能继续移动了,上面代码中判断到达边缘的语句有:backpst1.co0+p.ipst1.co1+p.j - 1 = 0

14、 & backpst1.co2+ p.ipst1.co3+p.j - 1 = 0 & backpst1.co4+ p.ipst1.co5+p.j - 1 = 0 & backpst1.co6+ p.ipst1.co7+p.j 1等;其他大概都差不多。还有一个问题不容易被察觉,就是方块贴到方框边缘后变形的问题,在这儿也要做一个判断才行,要判断该形状变形后的形状是否超越过了边缘,如果没有做这个判断的话,方块变形后就会挂在方框边缘上,因为方框的边缘是赋值为1的,变形后移动的时候它会判断背景是否为1,如果为1的话便不会再移动了,所以图形块就挂在上面移动不了了。关于判断变形后的图形是否越界的函数是:in

15、t check_change(point p,shape s) if(backs.co0+ p.is.co1+p.j=1 | backs.co2+ p.is.co3+p.j = 1 | backs.co4+ p.is.co5+p.j =1 | backs.co6+ p.is.co7+p.j=1) return 0; else return 1;其中传递进来的一个参数是t1+1,即当前图形的下一个形状,if中的条件就是判断当前图形的下一个形状是否挨到边缘,是的话就返回0,没有就返回1。接下来便是判断是否到底,然后再进行输出或刷新。4.5 显示方块用一个双循环来输出,用s1.co0+p.i = i

16、 & s1.co1+p.j = j来判断,即用当前方块的坐标加上动点的坐标的值是否与当前的行或列相等,相等的时候就输出一个,不相等的时候输出空格。在外循环内写两个内循环,一个用于现实当前正在下落的方块,另一个用来显示下一个将要显示的方块。第二的内循环把jj初始化为-1是为了不让其与边框贴太近导致看不清,而用s2.co0+4 = i和 s2.co1+1 = jj中间加了4和1是为了让上下左右都有一定的空间让游戏界面更加美观,在这个循环里做一个判断然后显示分数和游戏级别。程序源代码如下:void show(point p, shape s1,shape s2)/显示方块 for(int i = 0

17、; i = 20; coutendl,i+) for(int j = 0; j = 14;j+) if (s1.co0+p.i = i & s1.co1+p.j = j) cout; else if (s1.co2+p.i = i & s1.co3+p.j = j) cout; else if (s1.co4+p.i = i & s1.co5+p.j = j) cout;else if (s1.co6+p.i = i & s1.co7+p.j = j) cout; else if (backij = 1 ) cout; else cout ; if(i=2) cout 下一个图形; for(i

18、nt jj = -1; jj = 4;jj+) if (s2.co0+4 = i & s2.co1+1 = jj) cout; else if (s2.co2+4 = i & s2.co3+1 = jj) cout; else if (s2.co4+4= i & s2.co5+1 = jj) cout; else if (s2.co6+4 = i & s2.co7 +1= jj) cout; else if(i=8&jj=1 ) cout分数: score; else if(i=10&jj=1 ) coutlevel level; else cout ; 4.6 图形的更新方块每移动一个坐标的

19、位置,图形都会更新一次,其中的循环和显示方块中的循环一样,只是执行的内容改变了,在判断方块的坐标加上动点的坐标是否等于背景的坐标后,就把该坐标的值赋值为一,当下一个图形移动到该图形处由于该图形的背景坐标为一,所以图形便会停止移动了。该工作做完后便判断是否要消行,判断消行也要用一个双循环,在外循环中定义一个标志flag并赋值为1,在内循环中判断,看是否有一个坐标处为0,如果有一个为0的话,就把flag的值改为0;该循环结束后就进行下一个内循环,先判断flag的值,值为1的话就进行消行操作,即把上面一行的值赋给下面一行。在更新这个函数的开始定义一个变量,用来记消去的行数,如果一次消去一行,分数就加

20、上10,一次消去两行,分数加上30,一次消去三行,分数加上50,消去四行分数就加上100。在该函数中还要判断游戏是否结束,即是检查第一列的没行的开始一个坐标是否等于1,如果等于1方块累积到了顶端,游戏便结束了,在方框底端输出“Game over!”字样。该部分代码如下:void update(point p, shape s)/更新 int i,j, count = 0; for(i = 0; i = 19;i+) for(j = 1; j = 13;j+) if (s.co0+ p.i = i & s.co1+ p.j = j) backij = 1; else if (s.co2+ p.i

21、 = i & s.co3+p.j = j) backij = 1; else if (s.co4+p.i = i & s.co5+ p.j = j) backij = 1; else if (s.co6+ p.i = i & s.co7+ p.j = j) backij = 1; else if(count = 4) score += 100;for(i = 0;i = 19; i+) /消行 int flag = 1; for(j = 1; j = 1;k-) for(j=1;j=13;j+) backkj = backk-1j;/把上面一行赋值给下面一行 count+; if(count

22、= 1) score += 10; else if(count = 2) score += 30; else if(count = 3) score += 50;else if(count = 4) score += 100; for(j = 1; j =13; j+) if(back0j = 1) coutGame over!n; exit(0); 4.7 其他在程序中的方块是随机产生的,用srand(time(NULL)做随机种子,然后用rand%19随机选取十九中图形的一种。程序中的system(“cls”)是用于清屏。在开始还有一个chioce函数,是用来游戏玩家根据自己的需要选择游戏

23、级别的,在选择中要按照游戏中提示的来选择,否则将按默认的速度来处理。5 测试情况5.1 游戏中的界面图 5.1 游戏开始时的界面5.2 消行前的界面图5.2 消行前的界面5.3 消行后的界面5.3 消行后的界面5.4 游戏结束时的界面图 5.4 结束时的界面7、 总 结在这次试验中,课设题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力。在写程序的过程中遇到很多麻烦,最开始都不知道怎么下笔,理清思路后才开始慢慢能自己动手了,当方块能自己移动的时候又出现问题了,就是把方块移动到右边的时候再变形的话下个方块就容易挂在边上,最后写了一个函数,判断当前方块变形后的下一个

24、方块是否越界,在变形的时候便调用这个函数就可以了。做课程设计不仅让我修补了以前学习的漏洞,也让我知道一个道理:编程需要兴趣和实际动手。这应该可以借鉴在老师的教学工作上。创新思维至关重要,这不仅能让我们写出精简的代码,也有助于开发出高效的程序。参考文献1 陆宗骐. C/C+图像处理编程. 北京:清华大学出版社,20052 钱能. C+程序设计教程. 北京:清华大学出版社,20053 吕凤翥. C+语言基础教程题解与上机指导. 北京:清华大学出版社,20064 杨祥金等. Windows程序设计教程. 北京:清华大学出版社,20075 Peter Norton,Rob McGregor著. MFC开发Windows95/NT4应用程序. 孙凤英,魏军,叙京等译. 北京:清华大学出版社, 1988

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1