C++俄罗斯方块实验报告(附实验体会)_第1页
C++俄罗斯方块实验报告(附实验体会)_第2页
C++俄罗斯方块实验报告(附实验体会)_第3页
C++俄罗斯方块实验报告(附实验体会)_第4页
C++俄罗斯方块实验报告(附实验体会)_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第18页共18页程序设计综合实验设计文档惠州学院HUIZHOU课程名称:程序设计综合实验姓名:实验名称:俄罗斯方块学号:任课教师:专业:计算机科学与技术班级:计算机科学与技术1班实验时间:第一周至第十二周实验成绩:批阅教师签字:综合实验项目:俄罗斯方块游戏1、问题需求(1)游戏等级:游戏分为1-10十个等级,等级越高,方块下落速度越快;(2)由方向键控制游戏:上键控制方块变形、下键控制方块下移并判断是否有消行、左键控制方块左移、右键控制方块右移;(3)游戏积分:一次性消的行数越多加的分数越多,当消行每超过30行自动提高一个游戏等级。2、总体设计:(1)用数组存放方块(2)输出地图(3)在地图里面输出方块(4)开始游戏(5)方块的旋转(6)方块是否能下落(7)判断方块是否能下落(8)提示下一个即将下落的方块(9)控制方块的下落速度(10)分成10等级,等级越高方块下落得更快(11)消行处理(12)游戏结束3、详细设计设计说明:本程序运行代码如下:#include<conio.h>#include<stdlib.h>#include<windows.h>#include"colorConsole.h"#defineSQUARE_COLORFOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY//方块的颜色#defineup72#definedown80#defineleft75#defineright77#defineesc27#defineMAPW12//地图的宽度#defineMAPH20//地图的高度BOOLisavailable(inta[],intx,inty,intw,inth);//判定是否能放下voidturn(inta[][4],intw,inth,int*x,inty);//转动int*create();//创建方块voidinit(); //初始化工作 voiddrawblocks(inta[],intw,inth,intx,inty,WORDwColors[],intnColors);voidclearcache();//清除键盘缓冲区voidend();voidclearsquare(int*a,intw,inth,intx,inty);voidgameover();voiddeletemap(intm[][MAPW],introw,intw,inth);//消除一行intdx=30,dy=5;//屏幕上的偏移量intscore=0,level=0;intmap[MAPH][MAPW];inta1[4][4]={{1},{1,1,1}};inta2[4][4]={{0,1},{1,1,1}};inta3[4][4]={{1,1},{0,1,1}};inta4[4][4]={{0,0,1},{1,1,1}};inta5[4][4]={{0,1,1},{1,1}};inta6[4][4]={{1,1,1,1}};inta7[4][4]={{1,1},{1,1}};inta[4][4];intmain(){ init(); int*b=NULL; b=create();//预创建方块 intq=0; intsign,blank,x,y; while(1) { for(inti=0;i<4;i++)//复制方块 for(intj=0;j<4;j++) if(a[i][j]=*(b+i*4+j))blank=i; y=1-blank;x=4; clearsquare(&a[0][0],4,4,13,13); b=create(); HANDLEhandle; handle=initiate(); WORDwColors[1]={FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY}; drawblocks(b,4,4,13,13,wColors,1); wColors[0]=SQUARE_COLOR; drawblocks(&a[0][0],4,4,x,y,wColors,1); clearcache(); charstring[5]; wColors[0]=FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY; textout(handle,26+dx,5+dy,wColors,1,itoa(score,string,10)); textout(handle,26+dx,9+dy,wColors,1,itoa(level,string,10)); sign=1; while(sign) { intdelay=0,max_delay=100-10*level;//延迟量 while(delay<max_delay) { if(_kbhit())//用if避免按住键使方块卡住 { intdraw=0; intkey=_getch(); switch(key) { caseup: clearsquare(&a[0][0],4,4,x,y); turn(a,4,4,&x,y); draw=1; break; casedown: delay=max_delay; break; caseleft: if(isavailable(&a[0][0],x-1,y,4,4)) { clearsquare(&a[0][0],4,4,x,y); x--; draw=1; } break; caseright: if(isavailable(&a[0][0],x+1,y,4,4)) { clearsquare(&a[0][0],4,4,x,y); x++; draw=1; } break; caseesc: end(); break; } if(draw) { HANDLEhandle; handle=initiate(); WORDwColors[1]={SQUARE_COLOR}; drawblocks(&a[0][0],4,4,x,y,wColors,1); draw=0; } } _sleep(8);delay++; } if(isavailable(&a[0][0],x,y+1,4,4))//判断是否能下移 { clearsquare(&a[0][0],4,4,x,y); y++; HANDLEhandle; handle=initiate(); WORDwColors[1]={SQUARE_COLOR}; drawblocks(&a[0][0],4,4,x,y,wColors,1); } else { sign=0;//标记,使跳出while(sign)循环,产生新方块 if(y<=1)gameover();//是否结束 for(inti=0;i<4;i++)//放下方块 for(intj=0;j<4;j++) if(a[i][j]&&((i+y)<MAPH-1)&&((j+x)<MAPW-1)) map[i+y][j+x]=a[i][j]; intfull,k=0; for(i=y;i<min(y+4,MAPH-1);i++) { full=1; for(intj=1;j<11;j++) if(!map[i][j])full=0; if(full)//消掉一行 { deletemap(map,i,MAPW,MAPH); k++; q++; score=score+k; level=min(q/30,9); } } } } } returnEXIT_SUCCESS;}BOOLisavailable(inta[],intx,inty,intw,inth){ for(inti=max(y,1);i<y+h;i++) for(intj=x;j<x+w;j++) if(map[i][j]&&a[w*(i-y)+j-x]) return0; return1;}int*create(){ int*a=NULL; intc=rand()%7; switch(c) { case0: a=&a1[0][0];break; case1: a=&a2[0][0];break; case2: a=&a3[0][0];break; case3: a=&a4[0][0];break; case4: a=&a5[0][0];break; case5: a=&a6[0][0];break; case6: a=&a7[0][0];break; } returna;}voidinit() //初始化工作 { for(inti=0;i<20;i++) { map[i][0]=-2; map[i][11]=-2; } for(i=0;i<12;i++) { map[0][i]=-1; map[19][i]=-1; } map[0][0]=-3; map[0][11]=-3; map[19][0]=-3; map[19][11]=-3; HANDLEhandle; handle=initiate(); WORDwColors[1]={FOREGROUND_GREEN|FOREGROUND_INTENSITY}; textout(handle,26+dx,3+dy,wColors,1,"分数"); textout(handle,26+dx,7+dy,wColors,1,"等级"); textout(handle,26+dx,11+dy,wColors,1,"下一个方块提示"); wColors[1]=FOREGROUND_RED|FOREGROUND_INTENSITY; drawblocks(&map[0][0],12,20,0,0,wColors,1); textout(handle,dx,dy,wColors,1,"

══════════

"); wColors[0]=FOREGROUND_GREEN|FOREGROUND_INTENSITY; textout(handle,dx-16,dy,wColors,1,"按任意键开始"); wColors[0]=FOREGROUND_RED|FOREGROUND_INTENSITY; textout(handle,dx-15,dy+3,wColors,1,"制作者"); wColors[0]=FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_INTENSITY; textout(handle,dx-15,dy+5,wColors,1,"赵强"); intx=_getch(); srand(x); textout(handle,dx-16,dy,wColors,1,"");}voiddrawblocks(inta[],intw,inth,intx,inty,WORDwColors[],intnColors){ HANDLEhandle; handle=initiate(); inttemp; for(inti=0;i<h;i++) for(intj=0;j<w;j++) if((temp=a[i*w+j])&&y+i>0) { if(temp==-3) textout(handle,2*(x+j)+dx,y+i+dy,wColors,nColors,"◆"); elseif(temp==-2) textout(handle,2*(x+j)+dx,y+i+dy,wColors,nColors,"║"); elseif(temp==-1) textout(handle,2*(x+j)+dx,y+i+dy,wColors,nColors,"═"); elseif(temp==1) textout(handle,2*(x+j)+dx,y+i+dy,wColors,nColors,"■"); }}voidclearcache(){ while(_kbhit()) { _getch(); }}voidend(){ exit(EXIT_SUCCESS);}voidturn(inta[][4],intw,inth,int*x,inty){ intb[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; intsign=0,line=0; for(inti=h-1;i>=0;i--) { for(intj=0;j<w;j++) if(a[i][j]) { b[j][line]=a[i][j]; sign=1; } if(sign) { line++; sign=0; } } for(i=0;i<4;i++) if(isavailable(&b[0][0],*x-i,y,w,h)) { *x-=i; for(intk=0;k<h;k++) for(intj=0;j<w;j++) a[k][j]=b[k][j]; break; }}voidclearsquare(int*a,intw,inth,intx,inty){ HANDLEhandle; handle=initiate(); WORDwColors[1]={SQUARE_COLOR}; for(inti=0;i<h;i++) for(intj=0;j<w;j++) if(a[i*w+j]&&i+y>0) textout(handle,2*(x+j)+dx,y+i+dy,wColors,1,"");}voidgameover(){ HANDLEhandle; handle=initiate(); WORDwColors[1]={FOREGROUND_RED|FOREGROUND_GREEN}; textout(handle,7+dx,10+dy,wColors,1,"游戏结束"); clearcache(); _getch(); exit(EXIT_SUCCESS);}voiddeletemap(intm[][MAPW],introw,intw,inth){ HANDLEhandle; handle=initiate(); WORDwColors[1]={SQUARE_COLOR}; textout(handle,2+dx,row+dy,wColors,1,"﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌"); _sleep(100); for(inti=row;i>1;i--) { clearsquare(&m[i][1],MAPW-2,1,1,i); for(intj=1;j<MAPW-1;j++) m[i][j]=m[i-1][j]; drawblocks(&m[i][1],MAPW-2,1,1,i,wColors,1); } for(i=1;i<MAPW-1;i++) m[1][i]=0;}HANDLEinitiate(){ HANDLEhOutput; hOutput=GetStdHandle(STD_OUTPUT_HANDLE); returnhOutput;}BOOLtextout(HANDLEhOutput,intx,inty,WORDwColors[],intnColors,LPTSTRlpszString){DWORDcWritten;BOOLfSuccess;COORDcoord; coord.X=x;//startatfirstcellcoord.Y=y;//offirstrowfSuccess=WriteConsoleOutputCharacter(hOutput,//screenbufferhandlelpszString,//pointertosourcestringlstrlen(lpszString),//lengthofstringcoord,//firstcelltowriteto&cWritten);//actualnumberwrittenif(!fSuccess)cout<<"error:WriteConsoleOutputCharacter"<<endl; for(;fSuccess&&coord.X<lstrlen(lpszString)+x;coord.X+=nColors){fSuccess=WriteConsoleOu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论