1、voidplay();/开始游戏sets();/设置highscores();/排行榜copyright();/作者/功能mapsetup();/准备地图boolnewsqr();/放置方块,返回是否游戏结束intmove(intdirection);/移动方块,返回定义表movetomap();/把当前方块移动到地图上wholeline();/检查是否组成了一层,返回层数,-1表示没有deleteline(intwhich);/删除一行endup();/结束游戏,清理内存/显示show();/刷新画面showmenu(char*menu);/显示菜单/文件loadset();/加载设置sav
2、eset();/保存设置loadhs();/加载排行榜addscores(intscore,charname50);/增加一个分数,返回是否是高分savehs();/保存排行榜/坐标变换get(intx,inty);set(inty,intdate);/结构structxs,ys;/屏幕大小speed;/速度charsqr3,no3,frame3;/方块、空白处、边框的样式gameset;name50;score;rating10;/全局变量/变量int*map=NULL;/地图now44;/当前方块xnow,ynow;/当前位置guide;/分数/常量constshap744=/形状0,0,
3、0,0,1,1,1,1,0,1,1,0,0,1,1,1,0,0,1,0,1,0,0,0,1,1,1,0,0,0,0,1,0,1,0,0,;errword450=程序没能取得足够的内存,无法打开或找不到设置文件set.ini无法打开或找不到排行榜数据highscore.dat您设置的参数太大或者太小/控制台HANDLEhout;/控制台句柄COORDcurpos=0,0;/光标坐标/主函数main()start1:tryhout=GetStdHandle(STD_OUTPUT_HANDLE);/获取控制台句柄,以便移动光标srand(time(0);/用当前时间初始化随机数生成器/加载start
4、2:while(1)showmenu(俄罗斯方块n请选择菜单:n1.开始游戏n2.设置n3.排行榜n4.帮助n5.保存并退出n);switch(getch()case1:system(cls/play函数覆盖界面而不是清屏,所以需要先清屏break;2345/保存数据return0;catch(interrnum)/错误处理printf(o()o出错啦!n程序收到了一条错误信息,错误码是:%d(%s)n您可以联系我们解决这个问题。n,errnum,errworderrnum);n你可以选择以下操作:n1.重启程序n2.以默认设置重启程序n3.向设置和数据文件写入默认设置然后重启n4.退出ngo
5、tostart1;gameset.xs=20;gameset.ys=20;gameset.speed=100;strcpy(gameset.sqr,/无法直接给数组复制数据strcpy(gameset.no,strcpy(gameset.frame,i;for(i=0;i10;i+)strcpy(ratingi.name,未命名),ratingi.score=0;start2;ofstreamfout;fout.open(set.inifout20n20n100nn:;fout.close();fout.clear();highscore.datj;for(j=0;jj+)未命名n0ndefa
6、ult:-1;/返回异常退出play()/初始化/*for(inti=0;20;set(i,19,SQR);*/while(newsqr()/不断新建方块,直到返回NOwhile(move(DOWN)!=CANTMOVE)/每次向下移动方块,直到不能移动guide+=1;/向下移动一次加1分while(kbhit()/不断处理键盘,直到没有按键switch(getch()/获取按键wmove(UP);smove(DOWN);amove(LEFT);dmove(RIGHT);Sleep(gameset.speed);/延时/退出循环时无法向下移动,把当前方块移动到地图上line;while(li
7、ne=wholeline()!=-1);/不断检查是否出现整行,直到没有deleteline(line);/删除整行/无法新建方块,游戏结束return;/结束/函数定义mapsetup()map=newintgameset.xs*gameset.ys;/申请内存if(!map)/如果申请到0throwno_enough_memory;/抛出异常/初始化地图i,j;gameset.xs;gameset.ys;set(i,j,NO);guide=0;/分数清零y)if(y=0&xy0&*(map+y*gameset.xs+x)=date;/写入newsqr()4;i+)/检查下一个方块要出现的地
8、方是否有方块if(get(gameset.xs/2+i,0)=SQR)false;/有方块,创建失败which=rand()%7;/随机选择形状nowij=shapwhichij;/复制形状for(i=rand()%4;ii-)/旋转随机0-3次xnow=gameset.xs/2;/设置坐标ynow=-4;true;direction)x,y;/储存坐标偏移量switch(direction)UP:/上键是旋转newshap44;/储存旋转后的图形newshapij=nowj3-i;if(newshapij=true&get(xnow+i,ynow+j)=SQR)/对新图形碰撞检测CANTMO
9、VE;/不能旋转nowij=newshapij;/检测完毕,复制形状OK;DOWN:/先记录坐标的偏移量,确定没有碰撞以后移动x=0,y=1;LEFT:x=-1;y=0;RIGHT:x=1,y=0;if(nowij=true&get(i+x+xnow,j+y+ynow)=SQR)/如果和地图上的方块重合(边缘以外get函数也返回SQR,不必单独处理)/if(get(i+x,j+y)=SQR)/if(nowi+xj+y=SQR)/无法移动xnow+=x;/检测完毕,更改坐标ynow+=y;movetomap()guide+=10;/成功放置方块,加10分if(nowij=true)set(xno
10、w+i,ynow+j,SQR);/复制方块到地图wholeline()whole;/储存是否是整行j+)/for(i=0;whole=true;/假设是整行i+)/for(j=0;if(get(i,j)=NO)whole=false;/有空,不是整行if(whole)/是整行,返回/没找到整行,返回which)guide+=1000;/消方块,奖励分数for(i=which;=0;i-)set(j,i,get(j,i-1);/移动上面的所有方块,覆盖这一行。最上面虚拟成了空,不必特殊处理endup()deletemap;/清理内存while(kbhit()/清除所有未处理的按键getchar(
11、);游戏结束,请输入您的姓名:name50=nonamescanf(%s,&name0);/输入word1000;/储存格式化以后的字符串sprintf(&word0,游戏结束!nn您(%s)的积分是:%dnn%snn请按任意键继续,name,guide,(addscores(guide,name)?你进入了排行榜你没有进入排行榜);showmenu(&word0);getch();/显示排行榜show()SetConsoleCursorPosition(hout,curpos);/system(/光标移至左上角,覆盖之前的图案当前积分:%dn,guide);gameset.xs+2;i+)/输出上边框printf(gameset.frame);/左边框if(i=xnow&(xnow+4)&j=ynow&(ynow+4)/if(i(xnow+1)&(ynow+1)/在当前方块范围内if(nowi-xnowj-ynow=true)/如果有方块printf(gameset.sqr);elseif(get(i,j)=SQR)/如果地图有方块else/否则,空白printf(gameset.no);else/不在当前方块范围内,输出地图if(get(i,j)=SQR)/有方块else/否则,没方块/右边框和换行i+)/下边框menu)output100;/储存本行的文字g
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1