C++俄罗斯方块实验报告(附实验体会).doc
《C++俄罗斯方块实验报告(附实验体会).doc》由会员分享,可在线阅读,更多相关《C++俄罗斯方块实验报告(附实验体会).doc(18页珍藏版)》请在冰点文库上搜索。
程序设计综合实验
设计文档
惠州学院
HUIZHOUUNIVERSITY
课程名称:
程序设计综合实验
姓名:
实验名称:
俄罗斯方块
学号:
任课教师:
专业:
计算机科学与技术
班级:
计算机科学与技术1班
实验时间:
第一周至第十二周
实验成绩:
批阅教师签字:
综合实验项目:
俄罗斯方块游戏
1、问题需求
(1)游戏等级:
游戏分为1-10十个等级,等级越高,方块下落速度越快;
(2)由方向键控制游戏:
上键控制方块变形、下键控制方块下移并判断是否有消行、左键控制方块左移、右键控制方块右移;
(3)游戏积分:
一次性消的行数越多加的分数越多,当消行每超过30行自动提高一个游戏等级。
2、总体设计:
(1)用数组存放方块
(2)输出地图
(3)在地图里面输出方块
(4)开始游戏
(5)方块的旋转
(6)方块是否能下落
(7)判断方块是否能下落
(8)提示下一个即将下落的方块
(9)控制方块的下落速度
(10)分成10等级,等级越高方块下落得更快
(11)消行处理
(12)游戏结束
3、详细设计设计说明:
本程序运行代码如下:
#include
#include
#include
#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 {
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) map[i+y][j+x]=a[i][j];
intfull,k=0;
for(i=y;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 for(intj=x;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 for(intj=0;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 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 for(intj=0;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 for(intj=0;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 m[i][j]=m[i-1][j];
drawblocks(&m[i][1],MAPW-2,1,1,i,wColors,1);
}
for(i=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;//startatfirstcell
coord.Y=y;//offirstrow
fSuccess=WriteConsoleOutputCharacter(
hOutput,//screenbufferhandle
lpszString,//pointertosourcestring
lstrlen(lpszString),//lengthofstring
coord,//firstcelltowriteto
&cWritten);//actualnumberwritten
if(!
fSuccess)
cout<<"error:
WriteConsoleOutputCharacter"<
for(;fSuccess&&coord.X{
fSuccess=WriteConsoleOutputAttribute(
hOutput,//屏幕缓存处理
wColors,//pointertosourcestring
nColors,//lengthofstring
coord,//firstcelltowriteto
&cWritten);//actualnumberwritten
}
if(!
fSuccess)
cout<<"error:
WriteConsoleOutputAttribute"< return0;
}4、程序运行结果截图:
按任意键游戏开始
方块左移
方块右移
下一个方块开始下落
方块变形
消一行,增加1分
成功消多行
消多行后分数增加更多
消完30行后,提升一个等级
方块叠到顶端后游戏结束
5、程序使用说明:
(1)按任意键开始游戏
(2)控制方块下落位置进行消行处理
(3)成功消行后加分,当消30行之后等级升一级,最高达到10等级
(4)当产生的新方块不能再下落时,游戏结束。
(5)过程中可以按ESC直接退出游戏
6、本实验的心得体会
上个学期学习C++的时候,主要是局限于读课本,记住课本上的一些知识和概念,但很少自己亲自动手去编写代码,总是眼高手低,当真正的去编写这个俄罗斯游戏的时候就体会到编写代码真的好难,尤其是刚开始的想的时候,根本不知道如何下手。
后来通过上网查询和请教一些编程比较好的同学后才有了一个基本的思路,自己又重新翻阅了一下课本,将课本上的知识又重新细致的复习了一遍,最终借助于网络和同学的帮助完成了这个实验。
通过这个实验发现自己在编程方面还有很大的欠缺,编程能力很差劲,不过通过这个实验,也让我对上学期学习的C++知识有了一个很好很全面的复习,这是这个实验带给我最大的收获。
必须要亲自动手多写,多看代码才能真正的学好C++。
第18页共18页