C语言俄罗斯方块试验报告包括源程序_第1页
C语言俄罗斯方块试验报告包括源程序_第2页
C语言俄罗斯方块试验报告包括源程序_第3页
C语言俄罗斯方块试验报告包括源程序_第4页
C语言俄罗斯方块试验报告包括源程序_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

实验内容游戏程序----俄罗斯方块指导老师李陶深一.实验题目设计达成俄罗斯方块游戏。游戏开始后在游戏小窗口的顶部会随机产生一个方块并以必定的速度下移,下移过程玩家作变换、左右移操作以使其摆放适合,当叠满一行时会自动消去并计10分,若不可以消行而叠到游戏小窗口的顶部则游戏失败,此时玩家可退出或从头开始。二.实验要求与目的游戏界面合理,进入游戏后应有操作说明。要求:⑴按随意键开始游戏,随机产生方块并自动下移⑵用Esc键退出游戏,R键可从头开始游戏⑶用键变换方块⑷用键和键左右挪动方块⑸用键使方块加快下移⑹用空格键使方块直接下移⑺能正确判断满行并消行、计分、定级别⑻能正确计时⑼设定游戏为五个级别,级别越高难度越大目的是经过设计达成俄罗斯方块游戏,加深对计算机图形学的认识并在实践中加以应用,别的进一步熟悉应用编程语言。三.实验环境硬件:CPU--------------AMDAthlonXP1800+内存--------------DDR333256M硬盘--------------40G显示卡-----------Max44064M128bit显示器-----------17寸彩显软件:OS----------------WindowsXP开发工具--------TuborC2.0四.系统的设计思想1.系统的系统构造本系统主要由主函数、方块的产生与消除、方块的变换与挪动、消行与计分、计时这五大模块构成,此中方块的变换与挪动模块是本系统中的重点模块,也是最为复杂的模块。详情请参照以下的构造图:主函数Main( )方块的产方块的变生与消除换与挪动turnUnit( )、

消行与计时计分coutTime( )clrTurnUnitclrLine( )( )move( )小方格小方格方块的方块的方块左、计分的产生的消除变换下移与右、下的fangKuai( )、clrFangKuaic72( )、左右移停止score( )( )getN( )c75( )、stopL( )、c77( )stopR( )、stopB( )俄罗斯方块的系统构造图2.模块的功能下边将详细介绍各模块的功能:A.主函数模块本模块主假如初始化图形显示模式,定义游戏说明窗口以及游戏窗口的界面,还有计分、计时、定级别窗口的设定。自然应有对其余子模块的调用,如:方块的产生与消除、方块的变换与挪动、消行与计分、计时等模块。B.方块的产生与消除模块本模块有两大功能:产生方块、消除方块,分别由voidturnUnit(intx,inty,intn)、voidclrTurnUnit(intx,inty,intn)来达成。它们的三个参数中的X与Y表示操作所在的地点,N决定方块的形状(X、Y、N在此后出现的函数中意义同样,将不在重述)。因为每个方块都是四个小方格组合而成,我编了小方格的产生、消除子函数voidfangKuai(intx0,inty0)、voidclrfangKuai(intx0,inty0)来给上边两个函数调用。x0、y0表示操作所在的地点。C.方块的变换与挪动模块本模块负责方块自动下移,在下移过程中方块的变换、左右挪动、加快下移、直接下移的操作,由intmove(intx,inty,intn)来达成。stopB( )检测方块可下移时move( )将循环检测有无键盘输入,若无输入方块自动下移一小格;不然判断输入是什么,向上方向键则方块顺时针旋转变换一次,向左方向键并且stopL( )检测方块可左移则方块向左移一小格,向右方向键并且stopR( )检测方块可右移则方块向右移一小格,向下方向键则方块向下移一小格,空格键则直接下移。D.消行与计分模块当一个方块不可以挪动时需调用本模块clrLine( )。本模块将从该方块的最下边小方格所内行开始到最上边小方格所内行结束,从左到右判断每一行能否满行;若满行则消行并且下移该行以上的已填补的小方格,而后调用计分函数,计分函数将给全局变量f加1,此时游戏所得的分数sc为fX10。因为文本输出函数outtextxy( )是输出字符串而不支持变量输出,但分数sc是变量,于是用间接的方法:把分数sc的值sprintf( )函数存到字符数组buf[3]所在的地点中,因为字符数组中的值相当于字符串,于是用outtextxy( )输出即可,字体颜色是红色RED。其实在输出新的分数以前要先把旧的分数擦去,方法也很简单:用方才说的方法把旧分数再输出一次,可是此次字体的颜色是背风景GREEN。计分函数还有一个与分数密切有关的操作定游戏的级别,共分为6个级别:0分到300分为0级,0分到300分为0级,300分到700分为1级,依此类推,1800分到2500分为4级,超出2500分为5级。能够看到,除了每一级要求的分数都比上一级多100格外,方块的自动下移速度也加快(0级的1/13)以增添游戏的挑战性。E.计时模块本模块主假如计算游戏所用的时间,由函数coutTime( )达成。游戏开始后,第一用time(0)获得目前时间存在全局变量bgtime中,此后每次调用coutTime( )按以下进行:用time(0)取适当不时间存在ntime中,游戏所用的时间为(ntime-bgtime)秒,把它变换成分秒形式后显示出来(用计分显示的方法)。五.重点技术的研究1.界面的设计运转系统后,在屏幕中央将产生一个窗口,它的周围空间为蓝色,它分为上边、左下、右下三个小窗口,见右侧的表示图。上边的小窗口绿色为背景显示了游戏的名称“RussiaTarten”,操作说明“Pressanykeytostart.PressEsctoquit.PressBlanktobottom.Presstochangethedirectionandshape.“。左下的小窗口为灰色DARKGRAY,是游戏主窗口(以下简称窗口M),高为210像素,宽为120像素,即由252(21x12)个10X10的小方格构成。右下的小窗口为绿色,主要显示游戏所用的时间、所得分数、所属级别。2.方块的实现第一说一下函数fangKuai( )与函数clrFangKuai( )。函数fangKuai( )在指定地点产生边框为蓝色用白色WHITE填补的小方格。函数clrFangKuai( )在指定地点产生边框与填补色都是窗口M的背风景DARKGRAY的小方格。其次说方块的产生与消除。

各方块及其顺时针旋转变换而来的方块一致在

16(=4X4)个小方格的窗口(以下简称窗口L)顶用4个小方格表示,成立鉴于窗口L的坐标系:窗口L左上角的小方格为(-1,-2),每个小方格长和宽都为1,X方向从左到右,Y方向从上到下。用数组xy[8]储存方块的4个小方格在窗口L的坐标参数。详细以下列图:-1012-2-101xy[8]={0,-2,0,-1,0,0,0,1}xy[8]={-1,1,0,1,1,1,2,1}-2-1012-101xy[8]={-1,0,0,0,0,1,1,1}xy[8]={0,0,-1,1,0,1,1,1}-1012-1012xy[8]={-1,-1,-1,0,0,0,-1,1}xy[8]={-1,0,0,0,1,0,0,1}因为方块(7种)及其变换共有19种,在此仅列出六个方块以说明,节余方块用近似方法求出它们的xy[8]详细数组。为了便于调用各方块,定义以下数据构造:structbx{intxy[8];structbx}xyh[19];

*next;构造有两个成员,第一个成员xy[8]储存方块在窗口L中的坐标参数,第二个成员*next为指向该方块顺时针旋转变换而来的方块的地点指针。在此用同时该构造定义了xyh[19],该数组把19种方块封装在一同,并在游戏开始时达成初始化。此外定义了全局变量n,它每次取值为0到18,由随机函数产生;游戏中需要产生方块时,调用xyh[n],把方块在窗口L坐标参数变换到窗口M下,再依照参数把方块的四个小方格用函数可显示所要的方块。消除方块时与产生方块时大部份同样,所不一样的是函数

fangKuai( )画出来便fangKuai( )变为了函数clrFangKuai( )

。3.方块挪动的综合设计根本思想是:1、用stopB( )判断方块可否下移,不可以则跳出move( )。2、判断有无键盘输入,有则跳到3,无则跳到5。3、判断输入是什么:向上方向键则方块顺时针旋转变换一次;向左方向键并且stopL( )检测方块可左移则方块向左移一小格,不可以左移跳到1;向右方向键并且stopR( )检测方块可右移则方块向右移一小格,不可以右移跳到1;向下方向键则方块向下移一小格;空格键则直接下移。4、跳到1。5、自动下移一小格,延时半秒,跳到1。实现挪动的方法是把本来的方块消除clrTurnUnit( ),在新地点从头画方块TurnUnit( )。stopB( )、stopL( )、stopR( )三个函数极为相像,现以stopL( )来说明:挨次判断方块的四个小方格所在地点左侧的有无填补,如有,则判断能否是自己填补的,不是自己填补的便返回“不可以挪动”;不然四个小方格都检测完后,返回“可挪动”。六.结束语本次实验历时两周多,是我花时间最多的实验,因为整个实验都在磕磕碰碰中行进,有了问题第一自己想方法解决,不可以再找书,再不可以找老师,一波三折地走到了此刻。这此中很多次甚至有了放弃的念想,哪怕有一次自己没有坚持下来,也就没有这份报告了。下边想说几点编程过程的领会:一、建议编一段代码后调试一次,不要过长也不要很短,我的经验是达成一两小功能后调试一次。因为过长,给找错误点增添了难度;很短,频频调试的次数太多,令编程效率低下,屡次地切换显示模式对显示器也不好。二、调试程序发现有一时难以找出的错误时,不要急,要沉稳思虑,自己在脑中从头开始模拟程序运转,推犯错误可能点后,在该点加一些判断标记(如pintf(“OK”)),运转程序,证明犯错点,并想法更正。加判断标记要清楚加多少个标记,在哪里加,这也是编程者的编程水平高低的表现。标记多了,在屏幕上看不到,自然你能够在另一个文档中输出来看,可是有点不方便;少了,不可以成功判断犯错点。三、当想用一个系统函数,而对其功能不过略知一二时,能够先编一个模拟函数调用该系统函数模拟你所需的功能,看能否切合,适合则采纳,不然另谋它法。在实验中我多次用到了这类方法,如:随机函数、键盘操作的有关函数等等。四、擅长讨教别人。我每达成一个大的功能都与室友沟通,征采他们对该功能的见解,常常有不小的收获,对程序的改良起很大作用,并且也有了许多新思路。附本实验的源程序:RussiaTarten.C<完>#include"graphics.h"#include"conio.h"#include"stdio.h"#include"time.h"#include"stdlib.h"intf=-1,bgtime,utime[4]={0},bg[21][12]={0};/*backgrounddefineandinitial*/doublej=4990000;structbx{intxy[8];structbx*next;}t,xyh[19]={{{0,-2,0,-1,0,0,0,1},&xyh[1]},{{-1,1,0,1,1,1,2,1},&xyh[0]},{{0,0,1,0,0,1,1,1},&xyh[2]},{{-1,0,0,0,0,1,1,1},&xyh[4]},{{1,-1,0,0,1,0,0,1},&xyh[3]},{{0,0,1,0,-1,1,0,1},&xyh[6]},{{0,-1,0,0,1,0,1,1},&xyh[5]},{{0,0,-1,1,0,1,1,1},&xyh[8]},{{-1,-1,-1,0,0,0,-1,1},&xyh[9]},{{-1,0,0,0,1,0,0,1},&xyh[10]},{{0,-1,-1,0,0,0,0,1},&xyh[7]},{{1,-1,1,0,0,1,1,1},&xyh[12]},{{0,0,0,1,1,1,2,1},&xyh[13]},{{0,-1,1,-1,0,0,0,1},&xyh[14]},{{0,0,1,0,2,0,2,1},&xyh[11]},{{0,-1,0,0,0,1,1,1},&xyh[16]},{{0,0,1,0,2,0,0,1},&xyh[17]},{{0,-1,1,-1,1,0,1,1},&xyh[18]},{{2,0,0,1,1,1,2,1},&xyh[15]}};voidcoutTime( );voidscore( );intgetN(structbx*t1);voidfangKuai(intx0,inty0);voidclrfangKuai(intx0,inty0);intmove(intx,inty,intn);intc72(intx,inty,intn);intc75(intx,inty,intn);intc77(intx,inty,intn);intc80(intx,inty,intn);voidturnUnit(intx,inty,intn);voidclrTurnUnit(intx,inty,intn);voidclrLine(inty);intstopL(intx,inty,intn);intstopR(intx,inty,intn);intstopB(intx,inty,intn);main( ){inti,j,k,n=0,x=50,y=20,quit=0;intgraphdriver,graphmode;chardbuf[4]={24,25,26,27};graphdriver=DETECT;initgraph(&graphdriver,&graphmode,"c:\\tc2");setviewport(240,50,460,170,1);/*definethetoptextwindow*/clearviewport( );setbkcolor(BLUE);setfillstyle(SOLID_FILL,GREEN);bar(0,0,219,119);setcolor(WHITE);rectangle(0,1,219,119);outtextxy(50,6,"RussiaTarten");outtextxy(5,16,"Pressanykeytostart");.outtextxy(5,36,"PressEsctoquit");.outtextxy(5,56,"PressBlanktobottom");.outtextxy(50,76,dbuf);setcolor(GREEN);outtextxy(82,76,(dbuf+4));setcolor(WHITE);outtextxy(5,76,"Presstochangethe");outtextxy(5,86,"directionandshape");.setcolor(YELLOW);outtextxy(5,106,"Copyright(2004-2006)");setviewport(240,170,460,380,1);/*definethebottomgamewindow*/clearviewport( );setcolor(WHITE);rectangle(120,0,219,209);setcolor(BLUE);setfillstyle(SOLID_FILL,DARKGRAY);bar(0,0,119,209);setfillstyle(SOLID_FILL,GREEN);bar(121,1,218,208);outtextxy(130,56,"UsedTime:");outtextxy(175,66,"ms");outtextxy(130,86,"Score:");outtextxy(130,116,"Level:");/*1,2,3,4,5*/setcolor(YELLOW);outtextxy(125,180,"Gevon.Huang");getch( );/*pressanykeytostartthegame*/loop:bgtime=time(0);coutTime( );score( );for(k=0;k<990;k++){srand(time(NULL));n=rand( )%19;/*nisrandom*/turnUnit(x,y,n);quit=move(x,y,n);if(k==989){/*arriveatthetoplevel*/outtextxy(2,85,"Gameover!");outtextxy(2,100,"PressRto");outtextxy(2,110,"replay!!!!");}if(quit==1){k=990;/*quitorreplay*/outtextxy(2,85,"PressRto");outtextxy(2,95,"replay!!!!");}}while(quit!=27){/*press"escape"toquit*/if(kbhit( )!=0)quit=getch( );if(quit==114){/*press"r"toreplay*/for(i=0;i<21;i++)for(j=0;j<12;j++)clrfangKuai(j*10,i*10);setfillstyle(SOLID_FILL,GREEN);bar(175,96,217,136);f=-1;gotoloop;}}closegraph( );}voidcoutTime( ){intntime;charbufs[3]={'0','0','0'},lbufs[3]={'0','0','0'},bufm[3]={'0','0','0'},lbufm[3]={'0','0','0'};ntime=time(0);utime[1]=utime[0];/*savelast*/utime[3]=utime[2];/*savelast*/utime[0]=ntime-bgtime;/*getnow-used*/utime[2]=utime[0]/60;/*getnow-usedminute*/utime[0]=utime[0]%60;/*getnow-usedsecond*/setcolor(GREEN);/*clear*/sprintf(lbufs,"%d",utime[1]);outtextxy(190,66,lbufs);sprintf(lbufm,"%d",utime[3]);outtextxy(160,66,lbufm);setcolor(RED);/*write*/sprintf(bufs,"%d",utime[0]);outtextxy(190,66,bufs);sprintf(bufm,"%d",utime[2]);outtextxy(160,66,bufm);}voidscore( ){intsc,lsc;charbuf[3]={'0','0','0'},lbuf[3]={'0','0','0'};f=f+1;sc=10*f;lsc=sc-10;sprintf(buf,"%d",sc);sprintf(lbuf,"%d",lsc);setcolor(GREEN);/*clear*/if(f==30)outtextxy(175,116,"0");if(f==70)outtextxy(175,116,"1");if(f==120)outtextxy(175,116,"2");if(f==180)outtextxy(175,116,"3");if(f==250)outtextxy(175,116,"4");outtextxy(175,96,lbuf);setcolor(RED);/*writeandchangethespeedofmovingdown*/if(f==0)outtextxy(175,116,"0");if(f==30){outtextxy(175,116,"1");

j=j-500000;}if(f==70){outtextxy(175,116,"2");

j=j-500000;}if(f==120){outtextxy(175,116,"3");

j=j-500000;}if(f==180){outtextxy(175,116,"4");

j=j-500000;}if(f==250){outtextxy(175,116,"5");

j=j-500000;}outtextxy(175,96,buf);}voidfangKuai(intx0,inty0){/*definethemin-unittarten*/inti;bg[y0/10][x0/10]=1;for(i=0;i<10;i++){putpixel(x0+i,y0,0);putpixel(x0+i,y0+9,0);}y0=y0+1;for(i=0;i<8;i++){putpixel(x0,y0+i,0);putpixel(x0+9,y0+i,0);}setfillstyle(SOLID_FILL,WHITE);bar(x0+1,y0,x0+8,y0+7);}voidclrfangKuai(intx0,inty0){/*clearthemin-unittarten*/bg[y0/10][x0/10]=0;setfillstyle(SOLID_FILL,DARKGRAY);bar(x0,y0,x0+9,y0+9);}intmove(intx,inty,intn){intkey=-1;doublei;while(stopB(x,y,n)!=1){/*whenitisatbottomorthereisothertartenbelowgotoquit*/if(kbhit( )!=0)key=getch( );elsekey=-1;if(key==0)continue;if(key==27)return(1);switch(key){case72:/*"upkey"meansturning*/clrTurnUnit(x,y,n);n=c72(x,y,n);for(i=0;i<j;i++);break;case75:/*"leftkey"meanstomoveleft*/if(stopL(x,y,n)!=0)break;clrTurnUnit(x,y,n);x=c75(x,y,n);for(i=0;i<j;i++);break;case77:/*"rightkey"meanstomoveright*/if(stopR(x,y,n)!=0)break;clrTurnUnit(x,y,n);x=c77(x,y,n);for(i=0;i<j;i++);break;case80:/*"downkey"meanstomovedownfaster*/clrTurnUnit(x,y,n);y=c80(x,y,n);for(i=0;i<j;i++);break;case32:/*movederectlytobottom*/while(stopB(x,y,n)!=1){clrTurnUnit(x,y,n);y=c80(x,y,n);}for(i=0;i<j;i++);break;case-1:/*autotomovedown*/for(i=0;i<j+3000000;i++);clrTurnUnit(x,y,n);y=c80(x,y,n);for(i=0;i<j+3000000;i++);coutTime( );break;}/*switch*/}/*while*/clrLine(y);return(0);}intc72(intx,inty,intn){if(y==190){/*bottom*/turnUnit(x,y,n);return(n);}elseif((n==0)&&((x==0)||(x==100)||(x==110))){/*thespecialtarten*/turnUnit(x,y,n);return(n);}elseif(((n==8)||(n==10))&&(x==110)){/*right*/turnUnit(x,y,n);return(n);}elseif(((n==2)||(n==3)||(n==4)||(n==5)||(n==6)||(n==7)||(n==9)||(n==11)||(n==13)||(n==15)||(n==17))&&(x==100)){/*right*/turnUnit(x,y,n);return(n);}elseif(((n==2)||(n==4)||(n==6)||(n==11)||(n==12)||(n==13)||(n==14)||(n==15)||(n==16)||(n==17)||(n==18))&&(x==0)){/*left*/turnUnit(x,y,n);return(n);}else{/*goturning*/n=getN(&xyh[n]);turnUnit(x,y,n);return(n);}}intc75(intx,inty,intn){if(y==190){/*bottom*/turnUnit(x,y,n);return(x);}if((n==1)||(n==3)||(n==5)||(n==7)||(n==8)||(n==9)||(n==10)){x=(x==10)?10:x-10;turnUnit(x,y,n);return(x);}x=(x==0)?0:x-10;turnUnit(x,y,n);return(x);}intc77(intx,inty,intn){if(y==190){/*bottom*/turnUnit(x,y,n);return(x);}elseif((n==0)||(n==8)||(n==10)){x=(x==110)?110:x+10;turnUnit(x,y,n);return(x);}elseif((n==1)||(n==12)||(n==14)||(n==16)||(n==18)){x=(x==90)?90:x+10;turnUnit(x,y,n);return(x);}else{x=(x==100)?100:x+10;turnUnit(x,y,n);return(x);}}intc80(intx,inty,intn){if(0==stopB(x,y,n)){y=y+10;turnUnit(x,y,n);return(y);}turnUnit(x,y,n);return(y);}voidturnUnit(intx,inty,intn){/*transfercoordinatesystemtogamewindowanddrawthemodel*/inti,x0,y0;for(i=0;i<4;i++){x0=x+xyh[n].xy[2*i]*10;y0=y+xyh[n].xy[2*i+1]*10;fangKuai(x0,y0);}}voidclrTurnUnit(intx,inty,intn){/*transfercoordinatesystemtogamewindowandclearthemodel*/inti,x0,y0;for(i=0;i<4;i++){x0=x+xyh[n].xy[2*i]*10;y0=y+xyh[n].xy[2*i+1]*10;clrfangKuai(x0,y0);}}voidclrLine(inty){/*whenstop,testtherelatedlines*/inti,j,i2,j2,y0=y/10;doublek;for(i=y0+1;i>y0-3;i--)for(j=0;j<12;j++){if(bg[i][j]==0)j=13;/*thereisnull,gotonexti*/if(j==11)/*itisfull,clearoneline*/{for(i2=0;i2<5;i2++){/*blinkandclear*/for(k=0;k<3000000;k++);for(k=0;k<12;k++){if(i2==0||i2==2||i2==4)clrfangKuai(k*10,i*10);if(i2==1||i2==3)fangKuai(k*10,i*10);}}for(i2=i-1;i2>-1;i2--)for(j2=0;j2<12;j2++){/*theuptartensmovedownonce*/if(bg[i2][j2]==1){clrfangKuai(j2*10,i2*10);fangKuai(j2*10,(i2+1)*10);}}score( );i=i+1;y0=y0+1;}}}intstopL(intx,inty,intn){/*testwhenshouldstoponleftside*/inti0,i,j,i1,x0=x/10,y0=y/10,dx=-1,dy=0;for(

温馨提示

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

评论

0/150

提交评论