




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、先是效果图:主菜单:Inixl时E:Sf建:fc件夹输閃舌盘比卄诫品谧罗斷方块I触12弄個罗期方址5l.e方is.斯赛置行壽罗选开-请12345助出帮退zl游戏:时新建立件夹3閃云盘比卄成品I燼穿廝方决诃ek殆从俄罗期方绘L5.l.ezeJni2d时新建立件夹3閃云盘比卄成品I燼穿廝方决诃ek殆从俄罗期方绘L5.l.ezeJni2d搜狗拼皇设置:错误处理:(兀土错呃!1?系我们解决这个问题;了条错误信息匸错误码是:无袪打幵或找不到设置文件时E:Sf建:fc件夹输閃舌盘比卄诫品谧罗斷方喪I触酸匸谧罗期方块1一5.l.e你可以选祥以下操作:库重启程存冬以默需殳聲重启程序,3-冋设置和薮据文件写展默
2、认设置然后重启4-退出627行,代码如下:#ineludeviostream.h#ineludevconio.h#ineludevstdio.h#ineludevwindows.h#ineludevfstream.h#ineludevtime.h#ineludevestring#pragmaeomment(lib,winmm.lib)定义方块#defineNO0#defineSQR1碰撞检测#defineOK0#defineCANTMOVE1方向#defineUP0#defineDOWN1#defineLEFT2#defineRIGHT3/错误码#defineno_enough_memory0
3、#defineset_no_found1#definedat_no_found2#defineerror_argument3/函数声明/模块voidplay();开始游戏voidsets();设置voidhighscores();排行榜voidcopyright。;/作者/功能voidmapsetup();准备地图boolnewsqr();放置方块,返回是否游戏结束intmove(intdirection);移动方块,返回定义表voidmovetomap();把当前方块移动到地图上intwholeline();检查是否组成了一层,返回层数,-1表示没有voiddeleteline(intwhi
4、ch);/删除一行voidendup();/结束游戏,清理内存/显示voidshow();/刷新画面voidshowmenu(char*menu);显示菜单/文件voidloadset();加载设置voidsaveset();保存设置voidloadhs();加载排行榜booladdscores(intscore,charname50);增加一个分数,返回是否是高分voidsavehs();保存排行榜/坐标变换intget(intx,inty);voidset(intx,inty,intdate);/结构/设置structintxs,ys;屏幕大小intspeed;/速度charsqr3,no
5、3,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,
6、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
7、(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)
8、/错误处理system(cls);printf(o(_v)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,);st
9、rcpy(gameset.frame,:);inti;for(i=0;iv10;i+)strcpy(,未命名”),ratingi.score=0;gotostart2;case3:ofstreamfout;fout.open(set.ini);foutvv20n20n100nn:n;fout.close();fout.clear();fout.open(highscore.dat);intj;for(j=0;j10;j+)foutvv未命名nOn;gotostart1;default:return-1;/返回异常退出return0;voidplay()mapsetup(
10、);初始化/*for(inti=0;iv20;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);/延时mov
11、etomap();退出循环时无法向下移动,把当前方块移动到地图上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;j=0&xvgameset.xs&y=0&yvgamese
12、t.ys)/是否在地图范围内return*(map+y*gameset.xs+x);提取数据elsereturnSQR;/虚拟地图侧面和底部有方块voidset(intx,inty,intdate)if(x=0&xvgameset.xs&y=0&yvgameset.ys)/if(x0&xvgameset.xs&y0&yvgameset.ys)/是否在地图范围内*(map+y*gameset.xs+x)=date;写入return;boolnewsqr()inti,j;for(i=0;iv4;i+)检查下一个方块要出现的地方是否有方块if(get(gameset.xs/2+i,0)=SQR)re
13、turnfalse;/有方块,创建失败intwhich=rand()%7;随机选择形状for(i=0;iv4;i+)for(j=0;jv4;j+)nowij=shapwhichij;复制形状for(i=rand()%4;i0;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;iv4;i+)for(j=0;jv4;j+)n
14、ewshapij=nowj3-i;/坐标变换for(i=0;iv4;i+)for(j=0;jv4;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;
15、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;intwh
16、oleline()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;j=xnow&iv(xnow+4)&j=ynow&jv(ynow+4)/if(i=xnow&iv(xnow+1)&j=ynow&jv(ynow+1)在当前方块范围内if(nowi-xnowj-ynow=true)/如果有方块printf(gameset.sqr);elseif(get(i,j)=SQR)如果地图
17、有方块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;ivgameset.xs+2;i+)下边框printf(gameset.frame);printf(n);return;voidshowmenu(char*menu)inti,j;charoutput100;储存本行的文字system(cls);for(i=0;igam
18、eset.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)!=O;i+,j+)复制本行if(*(menu+i)=t)如果是制表符,输出空格直到列数是6的倍数for(;j%6!=5;j+)outputj=gameset.no0;j-;elseoutputj=*(menu+i);直接复制menu=menu+i+1;移动扌旨针至U下一行for(;jvgameset.xs*2-6;j+)用空格填充本
19、行的后面outputj=gameset.no0;outputj=O;/结束标记printf(gameset.no);行首空格,让界面更好看printf(output);/输出内容printf(gameset.frame);/右边框printf(n);换行Sleep(IOO);/延时,显示渐渐出现的效果for(i=O;ivgameset.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)/分情
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC 60364-4-44:2024 EN Low-voltage electrical installations - Part 4-44: Protection for safety - Protection against voltage disturbances and electromagnetic disturbances
- 投资合作合同协议书
- 汽修场地租赁合同
- 代理记账公司员工保密协议
- 可编辑修改产品代理合同经销
- 个人装修木工劳务合同
- 医疗行业人工智能辅助诊断与健康管理方案
- 天使投资协议书
- 电子商务产业园孵化企业入驻协议
- 建筑劳务临时用工合同
- 中职历史教学计划
- 六年级美术下册全册教案(浙美版)
- 湘教版二年级下册美术教案
- 男生青春期生理教育
- 现代汉语(黄伯荣、廖序东版)课件-第四章语法课件
- 统编版小学语文五年级下册第四单元解读与大单元设计思路
- 压疮护理质控反馈
- 山东春季高考Photoshop考试复习题库(含答案)
- 湖南省长沙市2023-2024学年八年级下学期入学考试英语试卷(附答案)
- 2023-2024年人教版八年级上册数学期末模拟试卷(含答案)
- 数据采集管理制度范文
评论
0/150
提交评论