您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 在Linux系统下基于ARM嵌入式的俄罗斯方块
在Linux系统下基于ARM嵌入式的俄罗斯方块目录一、摘要…………………………………………………………………………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六、参考文献………………………………………………………………………212一、摘要在Linux系统下使用vim编辑器实现如手机上的游戏俄罗斯方块,利用所学知识实现以下的各个问题。二、各种问题的具体介绍(1)图形的存储问题:每个方块采用一个4*4的小数组存储,不同的方块给对应的数组赋不同的值,从1~7,以便打印是染不同的颜色,实现每种方块都有不同的颜色。(2)图形的染色问题:使用VT控制码对不同的图形涂不同的颜色。(3)游戏屏幕的显示问题:采用一个20*12的大数组,数组元素全部赋值为0,在终端打印空格,形成一片矩形区域,每个俄罗斯方块(以下简称方块)占4*4个空格的区域,赋值给大数组即可在终端打印出方块。在大数组的上方再打印一个4*4的小数组,以显示下一个将出现的方块,并打印出得分,等级,计时等。(4)方块图形的自动下移问题:有一个变量记录方块下移的行数,并像左右移动一样打印向下移动的方块,设置一个信号,每一秒发送一个信号,进程每收到一次信号变量加一实现自动下移。(5)方块图形的左右移动问题:有一个变量记录方块第一行一列的坐标,左移时变量减一,右移时变量加一,把小数组原来在大数组的位置清零,在把小数组赋值到大数组相应坐标的位置即可打印出移动后的方块的位置,实现方块的左右移动。(6)方块图形的如何翻转问题:为了实现方块不同方向的转动,要新建一个4*4的新的小数组new,将存放方块的小数组按逆向旋转90度的方向存进new,把小数组清空,并把new的值重新赋值给小数组,大数组里方块原来的位置置零,把旋转后的小数组复制给大数组,即可打印出旋转后的方块。(7)图形移动时的自动消行问题:当大数组的某一行全部不为零时,既是达到了消行的条件,将大数组这样的行置零,其上的所有行下移一行(或多行),以实现消行的操作。系统会根据消行的行数打印出鼓励语句,例如comeon,good,perect等。(8)图形移动翻转时的边界判断问题:方块左右移动或向下运动,当遇到左右边界或到底时应不再继续左移,右移或下移,此时要判断边界。找出存放方块的小数组中所有不为0元素的元素在大数组的位置,判断大数组相应位置是否不为0,是否为边界,若满足两者之一即为到达边界(9)如何实现一键到底的问题:实现按一下x或向下键使方块从当前位置一下移到最后一行,先将方块当前位置清零,把小数组的值赋给大数组的最底,即可打印出移到最底的状态,即可实现一键到底。(10)各种移动的用键问题:左移使用‘d’键或者向左的箭头键,右移使3用‘a’键或者向右的箭头键,翻转使用‘w’键或者向下的箭头键,一键到底使用‘x’键或者向下的箭头键。(11)游戏时的自动冒行问题:当玩家每累计得20分时会从底部随机冒出一行一增加难度。大数组所有行向上移动一行,最后一行随机赋0~7的值。(12)游戏时的作弊消行问题:按e消去最后一行,当玩家希望减少行数时可使用此种方法。将大数组的最后一行置零,并将除第一行的所有行下移一行,此时屏幕的最后一行被消除。(13)游戏时作弊方块出现问题:按m在按数字键1~7可以出玩家希望得到的方块。数字1~7分别对应7种方块,当进程得到相应方块的命令时会把相应方块赋值给下一个将出现的方块小数组,打印到终端即可得到。(14)游戏时的作弊炸弹使用问题:按z键可在当前方块到底时炸掉它周围一些方块。当方块到底时将其周围一些大数组置零。4三、流程图按操作键a或-?d或-?x或向下键?e?左移右移一键到底作弊消行是是是是停止下移出方块下移?否自动下移是消行?炸弹?期望方块?输了?消行,计算得分使用炸弹得到期望的图形游戏结束否开始否是是是是5四、实习总结在Linux下使用红帽系统做出俄罗斯方块,最一开始接到这个项目时只知道游戏怎么玩,但是却不知道该怎么用所学的知识实现它,当时是如此的纠结。我们的项目是要求以组为单位的,每个小组由4个人组成,以便训练我们与人的协同合作能力,所以接到项目以后我们小组四个人就聚在一起开始讨论,大概讨论了一下午才确定了项目的基本结构和大体流程,然后简单的分派了一下任务,把几个模块分派给不同的人来做,然后再把每个人写的组合在一起。在写图形的翻转问题时遇到了好多问题,开始时我想了一种方法,可是写着写着突然发现写不下去了,如果用这种方法会出现好多连带的问题,可是我的思路已经固定在那了,再想其他的方法也会不知不觉的绕道以前带的问题上去,后来没办法,只能求助小组其他成员,因为我们是在协同作战,最后经过我们的一起努力完成的图形的翻转。等游戏功能基本完成以后,我们又加上了一些自己的创意,比如作弊键。完成以后再往前回顾后发现,有了思路以后项目是很容易完成的,最主要的是开始的思路混乱问题,那段时间时那么的心酸纠结,但是我的收获却也很多,例如,完成后的那种成就感是什么也没法替代的,再就是我们小组成员之间的合作也是相当值得骄傲的,这次的项目不仅使我们的知识更加牢固,也是我们小组成员间的交流更加顺畅,赢得了知识也赢得了友谊。五、附件1.程序源代码#includestdio.h#includetime.h#includestdlib.h#includetermios.h#includesignal.h#defineM20#defineN12inta1[4][4]={0,1,1,0,//方块模型0,0,1,0,0,0,1,0};inta2[4][4]={0,2,2,0,0,2,0,0,0,2,0,0};inta3[4][4]={0,3,0,0,63,3,3,0,0,0,0,0};inta4[4][4]={4,4,0,0,4,4,0,0,0,0,0,0};inta5[4][4]={5,5,5,5};inta6[4][4]={0,6,0,0,0,6,6,0,0,0,6,0};inta7[4][4]={0,0,7,0,0,7,7,0,0,7,0,0};inta[M][N]={0};//控制屏幕显示intaa[4][4]={0};//存放旋转后的方块模型intnew[4][4]={0};//存放下一个将要出现的方块模型intblow=0;//计向下移动,行坐标intleftright=0;//计左右移动intsum=0;//记录消行总数intscore=0;//记录总分数charrank='A';//等级intsecond=0;//记录开始游戏的时间intmflag=0,v;//作弊出任意想要的方块模型的标志,V对应相应的方块模型intzflag=0;structtermiostermios_p[1]/*指针*/,termios_pb[1]/*副本*/;//键盘控制voidoutput(intn,ints)//若s为1输出大数组,s为0输出next方块{switch(n){case0:if(s)printf(*);elseprintf();break;case1:printf(\33[40m\33[0m);break;case2:printf(\33[41m\33[0m);break;case3:printf(\33[42m\33[0m);break;case4:printf(\33[43m\33[0m);break;case5:printf(\33[44m\33[0m);break;case6:printf(\33[45m\33[0m);break;7case7:printf(\33[46m\33[0m);break;}}voidconfigure()//计算得分,等级{score=sum*10;rank='A'+score/50;}voidshow()//显示屏幕{inti,j;configure();printf(\t========================================\n);printf(\t$\33[31m\33[4m\33[1mScore:%3d\tRank:%c\t\tTime:%3d\33[0m$\n,score,rank,second);printf(\t$\t\t\33[31m\33[4m\33[1mNext:\33[0m$\n);for(i=0;i4;i++){printf(\t$\t\t);for(j=0;j4;j++){output(new[i][j],0);//输出next方块}printf($\n);}printf(\t$\t--------------------------$\n);for(i=0;iM;i++){printf(\t$\t|);for(j=0;jN;j++){output(a[i][j],1);//输出大数组组成的屏幕}printf(|\t$\n);}printf(\t$\t--------------------------$\n);printf(\t========================================\n);}voidcopy(intdes[4][4],intsor[4][4])//小数组复制到另一个小数组{inti,j;for(i=0;i4;i++){for(j=0;j4;j++){des[i][j]=sor[i][j];8}}}voidpaint(intflag)//小数组(方块模型)画到大数组里{inti,j;intm=blow;intn=N/2-1+leftright;for(i=3;i=0;i--){for(j=3;j=0;j--){if(aa[j][i]&&flag)a[m+j][n+i]=aa[j][i];elseif(aa[j][i]&&!flag)a[m+j][n+i]=0;}}}intisbottom()//判断是否到底及模型下是否有其他方块{intm=blow;intn=N/2-1+leftright;inti,j,k;intl[4][2]={-1,-1,-1,-1,-1,-1,-1,-1};for(i=0,k=0;i4;i++,k++){for(j=0;j4;j++)if(aa[j][i]){l[k][0]=j+m;//每列最后一个元素的横坐标l[k][1]=i+n;//每列最后一个元素的纵坐标}}for(i=0;ik;i++){if(l[i][0]==-1)continue;if(l[i][0]+1=M||a[l[i][0]+1][l[i][1]])//
本文标题:在Linux系统下基于ARM嵌入式的俄罗斯方块
链接地址:https://www.777doc.com/doc-2600825 .html