已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
先是效果图:主菜单:游戏:设置:错误处理:627行,代码如下:#include#include#include#include#include#include#include#pragmacomment(lib,winmm.lib)/定义/方块#defineNO0#defineSQR1/碰撞检测#defineOK0#defineCANTMOVE1/方向#defineUP0#defineDOWN1#defineLEFT2#defineRIGHT3/错误码#defineno_enough_memory0#defineset_no_found1#definedat_no_found2#defineerror_argument3/函数声明/模块voidplay();/开始游戏voidsets();/设置voidhighscores();/排行榜voidcopyright();/作者/功能voidmapsetup();/准备地图boolnewsqr();/放置方块,返回是否游戏结束intmove(intdirection);/移动方块,返回定义表voidmovetomap();/把当前方块移动到地图上intwholeline();/检查是否组成了一层,返回层数,-1表示没有voiddeleteline(intwhich);/删除一行voidendup();/结束游戏,清理内存/显示voidshow();/刷新画面voidshowmenu(char*menu);/显示菜单/文件voidloadset();/加载设置voidsaveset();/保存设置voidloadhs();/加载排行榜booladdscores(intscore,charname50);/增加一个分数,返回是否是高分voidsavehs();/保存排行榜/坐标变换intget(intx,inty);voidset(intx,inty,intdate);/结构/设置structintxs,ys;/屏幕大小intspeed;/速度charsqr3,no3,frame3;/方块、空白处、边框的样式gameset;/排行榜structcharname50;intscore;rating10;/全局变量/变量int*map=NULL;/地图boolnow44;/当前方块intxnow,ynow;/当前位置intguide;/分数/常量constboolshap744=/形状0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,;constcharerrword450=程序没能取得足够的内存,无法打开或找不到设置文件set.ini,无法打开或找不到排行榜数据highscore.dat,您设置的参数太大或者太小;/控制台HANDLEhout;/控制台句柄COORDcurpos=0,0;/光标坐标/主函数intmain()start1:tryhout=GetStdHandle(STD_OUTPUT_HANDLE);/获取控制台句柄,以便移动光标srand(time(0);/用当前时间初始化随机数生成器loadset();/加载loadhs();start2:while(1)showmenu(俄罗斯方块n请选择菜单:n1.开始游戏n2.设置n3.排行榜n4.帮助n5.保存并退出n);switch(getch()case1:system(cls);/play函数覆盖界面而不是清屏,所以需要先清屏play();break;case2:sets();break;case3:highscores();break;case4:copyright();break;case5:savehs();/保存数据saveset();return0;catch(interrnum)/错误处理system(cls);printf(o()o出错啦!n程序收到了一条错误信息,错误码是:%d(%s)n您可以联系我们解决这个问题。n,errnum,errworderrnum);printf(n你可以选择以下操作:n1.重启程序n2.以默认设置重启程序n3.向设置和数据文件写入默认设置然后重启n4.退出n);switch(getch()case1:gotostart1;case2:gameset.xs=20;gameset.ys=20;gameset.speed=100;strcpy(gameset.sqr,);/无法直接给数组复制数据strcpy(gameset.no,);strcpy(gameset.frame,:);inti;for(i=0;i10;i+)strcpy(,未命名),ratingi.score=0;gotostart2;case3:ofstreamfout;fout.open(set.ini);fout20n20n100nn:n;fout.close();fout.clear();fout.open(highscore.dat);intj;for(j=0;j10;j+)fout未命名n0n;gotostart1;default:return-1;/返回异常退出return0;voidplay()mapsetup();/初始化/*for(inti=0;i20;i+)set(i,19,SQR);*/while(newsqr()/不断新建方块,直到返回NOwhile(move(DOWN)!=CANTMOVE)/每次向下移动方块,直到不能移动guide+=1;/向下移动一次加1分show();/显示while(kbhit()/不断处理键盘,直到没有按键switch(getch()/获取按键casew:move(UP);break;cases:move(DOWN);break;casea:move(LEFT);break;cased:move(RIGHT);break;Sleep(gameset.speed);/延时movetomap();/退出循环时无法向下移动,把当前方块移动到地图上intline;while(line=wholeline()!=-1);/不断检查是否出现整行,直到没有deleteline(line);/删除整行endup();/无法新建方块,游戏结束return;/结束/函数定义voidmapsetup()map=newintgameset.xs*gameset.ys;/申请内存if(!map)/如果申请到0throwno_enough_memory;/抛出异常/初始化地图inti,j;for(i=0;igameset.xs;i+)for(j=0;jgameset.ys;j+)set(i,j,NO);guide=0;/分数清零return;intget(intx,inty)if(y=0&x=0&y=0&x=0&y0&x0&ygameset.ys)/是否在地图范围内*(map+y*gameset.xs+x)=date;/写入return;boolnewsqr()inti,j;for(i=0;i4;i+)/检查下一个方块要出现的地方是否有方块if(get(gameset.xs/2+i,0)=SQR)returnfalse;/有方块,创建失败intwhich=rand()%7;/随机选择形状for(i=0;i4;i+)for(j=0;j0;i-)/旋转随机0-3次move(UP);xnow=gameset.xs/2;/设置坐标ynow=-4;returntrue;intmove(intdirection)intx,y;/储存坐标偏移量inti,j;switch(direction)caseUP:/上键是旋转boolnewshap44;/储存旋转后的图形for(i=0;i4;i+)for(j=0;j4;j+)newshapij=nowj3-i;/坐标变换for(i=0;i4;i+)for(j=0;j4;j+)if(newshapij=true&get(xnow+i,ynow+j)=SQR)/对新图形碰撞检测returnCANTMOVE;/不能旋转for(i=0;i4;i+)for(j=0;j4;j+)nowij=newshapij;/检测完毕,复制形状returnOK;caseDOWN:/先记录坐标的偏移量,确定没有碰撞以后移动x=0,y=1;break;caseLEFT:x=-1;y=0;break;caseRIGHT:x=1,y=0;break;for(i=0;i4;i+)for(j=0;j4;j+)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)returnCANTMOVE;/无法移动xnow+=x;/检测完毕,更改坐标ynow+=y;returnOK;voidmovetomap()guide+=10;/成功放置方块,加10分inti,j;for(i=0;i4;i+)for(j=0;j4;j+)if(nowij=true)set(xnow+i,ynow+j,SQR);/复制方块到地图return;intwholeline()inti,j;boolwhole;/储存是否是整行for(j=0;jgameset.ys;j+)/for(i=0;igameset.ys;i+)whole=true;/假设是整行for(i=0;igameset.xs;i+)/for(j=0;j=0;i-)for(j=0;jgameset.xs;j+)set(j,i,get(j,i-1);/移动上面的所有方块,覆盖这一行。最上面虚拟成了空,不必特殊处理return;voidendup()deletemap;/清理内存system(cls);while(kbhit()/清除所有未处理的按键getchar();showmenu(游戏结束,请输入您的姓名:);charname50=noname;scanf(%s,&name0);/输入charword1000;/储存格式化以后的字符串sprintf(&word0,游戏结束!nn您(%s)的积分是:%dnn%snn请按任意键继续n,name,guide,(addscores(guide,name)?你进入了排行榜:你没有进入排行榜);showmenu(&word0);getch();highscores();/显示排行榜savehs();/保存排行榜return;voidshow()inti,j;SetConsoleCursorPosition(hout,curpos);/system(cls);/光标移至左上角,覆盖之前的图案printf(当前积分:%dn,guide);for(i=0;igameset.xs+2;i+)/输出上边框printf(gameset.frame);printf(n);for(j=0;jgameset.ys;j+)printf(gameset.frame);/左边框for(i=0;i=xnow&i=ynow&j=xnow&i=ynow&j(ynow+1)/在当前方块范围内if(nowi-xnowj-ynow=true)/如果有方块printf(gameset.sqr);elseif(get(i,j)=SQR)/如果地图有方块printf(gameset.sqr);else/否则,空白printf(gameset.no);else/不在当前方块范围内,输出地图if(get(i,j)=SQR)/有方块printf(gameset.sqr);else/否则,没方块printf(gameset.no);printf(:n);/右边框和换行for(i=0;igameset.xs+2;i+)/下边框printf(gameset.frame);printf(n);return;voidshowmenu(char*menu)inti,j;charoutput100;/储存本行的文字system(cls);for(i=0;igameset.xs;i+)printf(gameset.frame);/输出上边框printf(n);i=0,j=0;while(*menu!=0)printf(gameset.frame);/左边框for(i=0,j=0;*(menu+i)!=n&*(menu+i)!=0;i+,j+)/复制本行if(*(menu+i)=t)/如果是制表符,输出空格直到列数是6的倍数for(;j%6!=5;j+)outputj=gameset.no0;j-;elseoutputj=*(menu+i);/直接复制menu=menu+i+1;/移动指针到下一行for(;jgameset.xs*2-6;j+)/用空格填充本行的后面outputj=gameset.no0;outputj=0;/结束标记printf(gameset.no);/行首空格,让界面更好看printf(output);/输出内容printf(gameset.frame);/右边框printf(n);/换行Sleep(100);/延时,显示渐渐出现的效果for(i=0;igameset.xs;i+)printf(gameset.frame);/输出下边框printf(n);return;voidsets()charword1000;/要显示的文字while(1)/使用符号告诉编译器下一行应该和本行连起来再编译sprintf(&word0,设置菜单n请选择你要更改的选项:n屏幕大小:nt1.宽度:%dnt2.高度:%dn速度:nt3.方块下落速度:%dn显示:nt4.方块形状:%snt5.空白区域形状:%snt6.边框形状:%sn7.返回n,gameset.xs,gameset.ys,gameset.speed,gameset.sqr,gameset.no,gameset.frame);showmenu(&word0);charchoice=getch();showmenu(请输入改变后的参数:);/显示提示switch(choice)/分情况输入case1:scanf(%d,&gameset.xs);if(gameset.xs70)throwerror_argument;break;case2:scanf(%d,&gameset.ys);if(gameset.ys70)throwerror_argument;break;case3:scanf(%d,&gameset.speed);if(gameset.speed0)throwerror_argument;break;case4:cin.getline(&gameset.sqr0,3);/scanf(%s,&gameset.sqr0);coutendl;/gameset.sqr3=0;break;case5:cin.getline(&gameset.no0,3);/scanf(%s,&gameset.no0);coutendl;/gameset.no3=0;break;case6:cin.getline(&gameset.frame0,3);/scanf(%s,&gameset.frame0);coutendl;/gameset.frame3=0;break;case7:saveset();/保存设置并返回return;voidhighscores()inti;charword1000=排行榜n排名t姓名t积分n0;/抬头for(i=0;igameset.xsgameset.ysgameset.speed;fin.getline(gameset.sqr,4);/获取整行,因为可能有空格fin.getline(gameset.no,4);fin.getline(gameset.frame,4);return;voidsavese
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 餐厨废弃物处置管理制度
- 碎草覆盖种植技术方法
- 建筑工地救援洪水制度
- 安全标准化管理
- 苏教版小学一年级语文下册《这儿真好》保护环境品质教案
- 焊接作业单位电工运行操作安全操作规程
- 全生命周期企业信息化系统集成合同
- 项目施工安全生产会议
- 社区如何开展健康教育
- 家畜繁殖员技师考试题及答案
- 2023新能源集控中心建设可行性研究报告
- 厂内物流基础知识
- 现代城市商业综合体规划设计
- 关于会计培训
- 燃气储罐安全拆除应急预案
- 【生物】全册教案 2023-2024学年人教版八年级生物下册
- 审计国际化进程中的问题及对策
- 民用建筑供暖通风与空气调节设计规范样本
- 第四章组合逻辑电路中的竞争冒险
- 保险学(第五版)课件全套 魏华林 第0-18章 绪论、风险与保险- 保险市场监管、附章:社会保险
- 二年级上册语文作业帮小册子
评论
0/150
提交评论