基于C语言的俄罗斯方块游戏的设计与实现

  • 格式:pdf
  • 大小:1.20 MB
  • 文档页数:2

软件开发与应用Software Development And Application电子技术与软件工程Electronic Technology & Software Engineering

1 引言俄罗斯方块游戏是1984年由俄罗斯人阿列克谢•帕基特诺发明的。他是苏联科学院一名普通的软件工程师。他非常喜欢开发电脑游戏,俄罗斯方块是不同形状的方块落在矩形框中,如果某一行没有空格,就可以将该行删除。这一特点不仅需要玩家开动脑筋,也可以释放玩家的压力,同时还有一定的挑战。最主要的是该游戏符合“整理心理学”,即人们需要通过下落的新的方块来整理已有的混乱局面。所以游戏开发出来后很快就风靡全球。2 总体设计该游戏基本规则[3]是通过一定的旋转和移动来放置方块,方块在下落、旋转或左右移动前要判断方块的下一个位置是否全部位置都没有方块,并且没有超出界限,如果满足条件即可移动,否则不能移动。当方块不能继续下落时,要判断所有行是否有满行,如果有则要消除所有的满行,将剩下行整行下降,并给玩家适当加分。该游戏包含5大功能:方块预览、等级设置、方块移动、行满消除、游戏帮助。方块预览提示:因为下一个将要出现的方块是随机[4]的,所以设置了方块预览功能。玩家在移动控制当前的方块时,可以在界面中看到下一个将要出现的方块的形状。这样有利于玩家在下一个出现时第一时间做出反应。等级设置:如果游戏设置太快难度大的话,玩家会因为受挫而放弃;如果游戏太简单可以一直玩下去,玩家会因为没有挑战而失去兴趣。方块移动控制:方块左右下和旋转移动的前提有两点:(1)不出界;(2)无方块阻拦。行满消除:从下往上判断,如果某一行满行则先将该行擦除,再将上面行下移。游戏帮助:如果玩家需要看游戏规则,会弹出按键使用说明。3 关键代码与功能实现3.1 关键代码 方块预览提示:当前方块不能再移动时,将下一个方块变成当前方块,使用随机函数确定一个随机值,通过该随机值确定下一个方块,并在具体位置显示。 next=rand()%3; //使用随机函数取一个数来决定下一个方块的形状 clearAll(30,6);//显示前先消除 switch(next)//在固定的位置打印下一个 { case 0: printF1(30,6); break; case 1:printI1(30,6); break; case 2:printD1(30,6); break;基于C语言的俄罗斯方块游戏的设计与实现

赵素萍(山西农业大学信息学院 山西省晋中市 030800)

}switch(before)//下落的方块 { case 0: printF(x,y); break; case 1:printI(x,y); break; case 2:printD(x,y); break; } before=next;//下落完后将未来的变成过去需要注意的是,在变化形状前,需要先将之前的图形擦除后再重新移动或变换。以F方块的一种形状打印及擦除为例,其代码如下:void printF3(int x,int y)//F方块第3种形状的打印{ height=2;width=6; gotoxy(x,y); printf("■■■"); gotoxy(x+4,y+1); printf("■");}void clearF3()//F方块第3种形状的擦除{ gotoxy(beforex,b); printf(" "); gotoxy(beforex,b+1); printf(" ");}等级设置:为了鼓励一次消除多行,一次满行行数越多得到的分越高。当分数到达不同值后,增加相应等级、并提高一定的下降速度。void hardset(int x)//难度设置 { if(score<10){Sleep(500-x);gotoxy(36,18);printf(" %d ",1);} else if(score>=10&&score<50){Sleep(400-x);gotoxy(36,18);printf(" %d ",2);} else if(score>=50&&score<100){Sleep(300-x);gotoxy(36,18);printf(" %d ",3);} else {Sleep(200-x);gotoxy(36,18);printf(" %d ",4);}}方块移动控制:移动规则:(1)移动前先判断能否移动;(2)移动前需要先擦除旧方块;(3)左右移动时不下移;(4)不能移动则判断能否消除。begin:change=0; if(kbhit())//通过该函数实时监测按键情况 { key=getch();摘 要:本文基于C语言开发的俄罗斯方块游戏,涉及C语言中顺序、分支和循环三种结构;数组与函数等知识点。可作为高校学生课程设计的内容,同时也可作为程序爱好者的项目设计开发练习。关键词:C语言;俄罗斯方块;游戏设计开发软件开发与应用Software Development And Application电子技术与软件工程Electronic Technology & Software Engineering

if(key==52)change=2;if(key==54)change=3; if(key==56){change=1; f++; }if(key==50){t=200;} } switch(f%2)//只有两种情况 { case 0:if(moveI1OrNot(x,y))//先判断能否移动, 包括左右和下 { if(change==2)if(moveI1OrNot(x-2,y)&&x>FrameX+3)x-=2; if(change==3)if(moveI1OrNot(x+2,y)&&x+width<22)x+=2; if(change==1)clearI2();else clearI1(); printI1(x,y); break; } else{sitI1();return;//不能移动则占位 } case 1:if(moveI2OrNot(x,y)){/*同上*/} } if(x!=beforex){beforex=x; beforey =y;goto begin;}//横向移动不下落 beforex=x;beforey=y;//为了擦除之前的,需要保留位置 y++;//下落行满消除:下移后要从刚才的消除行继续判断,否则会出现连续两个满行只消除一行的情况。for(j=17;j>=0;j--){ for(i=0;i<13;i+=2)//只要该行有0则下一行 if(array[i][j]==0)break; //退出所在循环 if(i==14)//该行满了,应该消除 { r++; for(k=j-1;k>0;k--)for(i=0;i<13;i++)array[i][k+1]=array[i][k]; j++;/*连续消除两行,如果不加1,则刚消除行的上一行到了该行,会跳过该行是否满的判断而导致出错*/}} if(r!=0)//行满先清除,再根据数组中的内容,将上面的移下来{ for(j=0;j<18;j++)for(i=0;i<13;i+=2) {gotoxy(i+8,j+4);printf(" ");} for(j=0;j<18;j++)for(i=0;i<13;i+=2) if(array[i][j]==1){gotoxy(i+8,j+4);printf("■");}}score+=3*r-2;gotoxy(31,14);printf("%d",score);}3.2 游戏实现好的玩家应该掌握以下几点:一次消除的行数越多越好、空洞数越少越好,堆的越低越好。游戏界面如图1所示。玩家为了使得界面更加整齐,可以根据界面的布局以及下一个方块的预览,通过按上键来调整方块的形状。如图2中的F方块有4种形状可以变化。图3为变化后的一种情况。当游戏结束时,会根据用户的得分给出相应的等级,分别为A+,A,B,C。如图4所示。4 结论通过该游戏的设计与开发,能够让开发者更熟练的掌握C语言中的数组、循环、函数等知识点。在开发的过程中也遇到了很多问题,由于需求分析阶段没有打下很好的基础,导致在后期开发的过程中出现了很多问题。通过该游戏的开发,更熟练的掌握了项目开发的流程。参考文献[1]孟芸,朱肖安,罗刘敏.基于C语言的俄罗斯方块的设计与实现[J].硅谷,2014(23):19-20.[2]翟亚静,成丽君.基于Android的2048小游戏的简单实现[J].电子技术与软件工程,2017(12):251-252.[3]马丽,薛根奇,吕海莲.基于QT组件的俄罗斯方块设计[J].电子设计工程,2016(12):27-30.[4]温涛,陈够喜,李瑞林.互动式《俄罗斯方块》游戏安全隐写[J].电子技术应用

,2016(4):120-123.

作者简介

赵素萍(1986-),女,山西省太原市人。硕士研究生学历,现供

职于山西农业大学信息学院。研究方向为软件工程。图1:游戏界面图2:形状变换前

图3:形状变换后图4:结束界面