在Linux系统下基于ARM嵌入式的俄罗斯方块.doc
《在Linux系统下基于ARM嵌入式的俄罗斯方块.doc》由会员分享,可在线阅读,更多相关《在Linux系统下基于ARM嵌入式的俄罗斯方块.doc(23页珍藏版)》请在沃文网上搜索。
1、目录一、 摘要3二、 各种问题的具体介绍(1)图形的如何存储问题3(2)图形的染色问题3(3)游戏的屏幕显示问题3(4)方块图形的自动下移问题3(5)方块图形的左右移动问题3(6)方块图形的如何翻转问题3(7)图形移动时的自动消行问题3(8)图形移动翻转时的边界判断问题3(9)如何实现一键到底的问题3(10)各种移动的用键问题3(11)游戏时的自动冒行问题3(12)游戏时的作弊消行问题3(13)游戏时作弊方块出现问题3(14)游戏时的作弊炸弹使用问题4三、流程图 流程图5四、 实习总结 实习总结6五、附件(1)程序源代码6(2)操作截图18六、参考文献21一、摘要在Linux系统下使用vim编
2、辑器实现如手机上的游戏俄罗斯方块,利用所学知识实现以下的各个问题。二、各种问题的具体介绍(1)图形的存储问题:每个方块采用一个4 * 4的小数组存储,不同的方块给对应的数组赋不同的值,从17,以便打印是染不同的颜色,实现每种方块都有不同的颜色。(2)图形的染色问题:使用VT控制码对不同的图形涂不同的颜色。(3)游戏屏幕的显示问题:采用一个20 * 12的大数组,数组元素全部赋值为0,在终端打印空格,形成一片矩形区域,每个俄罗斯方块(以下简称方块)占4 * 4个空格的区域,赋值给大数组即可在终端打印出方块。在大数组的上方再打印一个4 * 4的小数组,以显示下一个将出现的方块,并打印出得分,等级,
3、计时等。(4)方块图形的自动下移问题:有一个变量记录方块下移的行数,并像左右移动一样打印向下移动的方块,设置一个信号,每一秒发送一个信号,进程每收到一次信号变量加一实现自动下移。(5)方块图形的左右移动问题:有一个变量记录方块第一行一列的坐标,左移时变量减一,右移时变量加一,把小数组原来在大数组的位置清零,在把小数组赋值到大数组相应坐标的位置即可打印出移动后的方块的位置,实现方块的左右移动。(6)方块图形的如何翻转问题:为了实现方块不同方向的转动,要新建一个4 * 4的新的小数组new,将存放方块的小数组按逆向旋转90度的方向存进new,把小数组清空,并把new的值重新赋值给小数组,大数组里方
4、块原来的位置置零,把旋转后的小数组复制给大数组,即可打印出旋转后的方块。(7)图形移动时的自动消行问题:当大数组的某一行全部不为零时,既是达到了消行的条件,将大数组这样的行置零,其上的所有行下移一行(或多行),以实现消行的操作。系统会根据消行的行数打印出鼓励语句,例如come on, good,perect等。(8)图形移动翻转时的边界判断问题:方块左右移动或向下运动,当遇到左右边界或到底时应不再继续左移,右移或下移,此时要判断边界。找出存放方块的小数组中所有不为0元素的元素在大数组的位置,判断大数组相应位置是否不为0,是否为边界,若满足两者之一即为到达边界(9)如何实现一键到底的问题:实现按
5、一下x或向下键使方块从当前位置一下移到最后一行,先将方块当前位置清零,把小数组的值赋给大数组的最底,即可打印出移到最底的状态,即可实现一键到底。(10)各种移动的用键问题:左移使用d键或者向左的箭头键,右移使用a键或者向右的箭头键,翻转使用w键或者向下的箭头键,一键到底使用x键或者向下的箭头键。(11)游戏时的自动冒行问题:当玩家每累计得20分时会从底部随机冒出一行一增加难度。大数组所有行向上移动一行,最后一行随机赋07的值。(12)游戏时的作弊消行问题:按e消去最后一行,当玩家希望减少行数时可使用此种方法。将大数组的最后一行置零,并将除第一行的所有行下移一行,此时屏幕的最后一行被消除。(13
6、)游戏时作弊方块出现问题:按m在按数字键17可以出玩家希望得到的方块。数字17分别对应7种方块,当进程得到相应方块的命令时会把相应方块赋值给下一个将出现的方块小数组,打印到终端即可得到。(14)游戏时的作弊炸弹使用问题:按z键可在当前方块到底时炸掉它周围一些方块。当方块到底时将其周围一些大数组置零。三、流程图按操作键a或?x或向下键? e? 左移 右移一键到底作弊消行是是是是停止下移 出方块 下移?否 自动下移是 消行? 炸弹? 期望方块? 输了?消行,计算得分使用炸弹得到期望的图形游戏结束否 开始否是是是是四、实习总结 在Linux下使用红帽系统做出俄罗斯方块,最一开始接到这个项目时只知道游
7、戏怎么玩,但是却不知道该怎么用所学的知识实现它,当时是如此的纠结。我们的项目是要求以组为单位的,每个小组由4个人组成,以便训练我们与人的协同合作能力,所以接到项目以后我们小组四个人就聚在一起开始讨论,大概讨论了一下午才确定了项目的基本结构和大体流程,然后简单的分派了一下任务,把几个模块分派给不同的人来做,然后再把每个人写的组合在一起。在写图形的翻转问题时遇到了好多问题,开始时我想了一种方法,可是写着写着突然发现写不下去了,如果用这种方法会出现好多连带的问题,可是我的思路已经固定在那了,再想其他的方法也会不知不觉的绕道以前带的问题上去,后来没办法,只能求助小组其他成员,因为我们是在协同作战,最后
8、经过我们的一起努力完成的图形的翻转。等游戏功能基本完成以后,我们又加上了一些自己的创意,比如作弊键。完成以后再往前回顾后发现,有了思路以后项目是很容易完成的,最主要的是开始的思路混乱问题,那段时间时那么的心酸纠结,但是我的收获却也很多,例如,完成后的那种成就感是什么也没法替代的,再就是我们小组成员之间的合作也是相当值得骄傲的,这次的项目不仅使我们的知识更加牢固,也是我们小组成员间的交流更加顺畅,赢得了知识也赢得了友谊。五、附件1.程序源代码#include #include #include #include #include #define M 20#define N 12int a144
9、= 0,1,1,0,/方块模型0,0,1,0,0,0,1,0;int a244 = 0,2,2,0,0,2,0,0,0,2,0,0;int a344 = 0,3,0,0,3,3,3,0,0,0,0,0;int a444 = 4,4,0,0,4,4,0,0,0,0,0,0;int a544 = 5,5,5,5;int a644 = 0,6,0,0,0,6,6,0,0,0,6,0;int a744 = 0,0,7,0,0,7,7,0,0,7,0,0;int aMN = 0;/控制屏幕显示int aa44 = 0;/存放旋转后的方块模型int new44 = 0;/存放下一个将要出现的方块模型int
10、 blow = 0;/计向下移动,行坐标int leftright = 0;/计左右移动int sum = 0;/记录消行总数int score = 0;/记录总分数char rank = A;/等级int second = 0;/记录开始游戏的时间int mflag = 0,v; /作弊出任意想要的方块模型的标志,V对应相应的方块模型int zflag = 0; struct termios termios_p1/*指针*/,termios_pb1/*副本*/;/键盘控制void output(int n,int s)/若s为1输出大数组,s为0输出next方块switch(n)case 0
11、:if(s)printf(* );elseprintf( );break;case 1:printf(3340m 330m);break;case 2:printf(3341m 330m);break;case 3:printf(3342m 330m);break;case 4:printf(3343m 330m);break;case 5:printf(3344m 330m);break;case 6:printf(3345m 330m);break;case 7:printf(3346m 330m);break;void configure()/计算得分,等级score = sum*10;
12、rank = A+score/50;void show()/显示屏幕int i,j;configure();printf(t=n);printf(t$3331m334m331mScore:%3dtRank:%cttTime:%3d330m$n,score,rank,second);printf(t$tt3331m334m331mNext:330m $n);for(i = 0;i 4;i+)printf(t$tt);for(j = 0;j 4;j+)output(newij,0);/输出next方块printf( $n);printf(t$t- $n);for(i = 0;i M;i+)prin
13、tf(t$t|);for(j = 0;j N;j+)output(aij,1);/输出大数组组成的屏幕printf(|t$n);printf(t$t- $n);printf(t=n);void copy(int des44,int sor44)/小数组复制到另一个小数组int i,j;for(i = 0;i 4;i+)for(j = 0;j = 0;i-)for(j = 3;j = 0;j-)if(aaji & flag)am+jn+i = aaji;else if(aaji & !flag)am+jn+i = 0;int isbottom()/判断是否到底及模型下是否有其他方块int m =
14、 blow;int n = N/2-1+leftright;int i,j,k;int l42= -1,-1,-1,-1,-1,-1,-1,-1;for(i = 0,k = 0;i 4;i+,k+)for(j = 0;j 4;j+)if(aaji)lk0=j+m;/每列最后一个元素的横坐标lk1=i+n;/每列最后一个元素的纵坐标for(i=0;i=M|ali0+1li1)/最后一行是否到底,下一行是否有其他元素return 1;return 0;int isleft()/判断是否到左边界int m = blow;int n = N/2-1+leftright;int i,j,k = 0;in
15、t l42= -1,-1,-1,-1,-1,-1,-1,-1;for(i = 0,k = 0;i =0;j-)if(aaij)lk0=i+m;/每行最左边元素的横坐标lk1=j+n;/每行最左边元素的纵坐标for(i=0;ik ;i+ )if(li0 = -1)continue;if(li1-1 0|ali0li1-1)return 1;return 0;int isright()/判断是否到右边界int m = blow;int n = N/2-1+leftright;int i,j,k = 0;int l42= -1,-1,-1,-1,-1,-1,-1,-1;for(i = 0,k = 0
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 系统 基于 ARM 嵌入式 俄罗斯方块