俄罗斯方块程序不要分.docx
《俄罗斯方块程序不要分.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块程序不要分.docx(25页珍藏版)》请在冰点文库上搜索。
![俄罗斯方块程序不要分.docx](https://file1.bingdoc.com/fileroot1/2023-5/29/3fc73de6-2b52-4cf1-a01b-6ae73f079ec2/3fc73de6-2b52-4cf1-a01b-6ae73f079ec21.gif)
俄罗斯方块程序不要分
俄罗斯方块程序
【目录】
【题目描述】························································3
【用户文档】························································3
【技术文档】························································4
【题目描述】
设计一个俄罗斯方块的游戏程序,在游戏可运行的情况下,该程序应具有如下功能:
(1)程序开始时有开机logo。
(2)游戏时,方块下落速度可以调节。
(3)方块下落顺序,颜色随机变化。
(4)每次进行方向操作时,都会有喇叭发声。
(5)游戏结束后会有分数统计。
(6)游戏运行当中会显示当前时间。
【用户文档】
一、应用程序功能的详细说明
该应用程序时有星型开机logo,由快到慢5档速度调节,能用cpu喇叭发声,统计游戏分数的多功能,具有非常强可玩性的一款俄罗斯方块。
二、应用程序运行环境的要求
1.操作系统:
Windows95/98/Me/NT/2000/XP/Vista/7
2.CPU:
最低100MHz
3.内存:
最低4MBDDR66/100
4.磁盘空间:
400M剩余空间
5.输入设备:
显示器
三、应用程序的安装与启动方法
将ELUOSI.EXE文件复制到任意磁盘目录下,双击文件图标即可运行。
四、程序的界面、交互方式和操作方法
1.游戏开始菜单
程序开始运行后会出现用“*”号组成的花形状logo,按回车之后,会出现选择速度的提示命令“pleaseinputthelevel(1-5)”,速度1为最快,速度5为最慢,输入速度后会进入游戏画面。
2.在游戏运行中
游戏开始运行后,在屏幕左边会出现游戏窗口,右边有游戏名字“Tetris”,和短语“HaveFun!
”
接下来就会有方块不断下落,你可以用方向键左右调整方块位置,当按左右方向时,cpu喇叭会发出不同频率的声音,还可以用方向键下使方块快速落到最底层,如果需要旋转方块,可以按空格键进行,这就是游戏的基本操作方式。
3.在游戏结束后
当玩家的方块堆满后,游戏结束,此时,画面跳出到文字界面,显示“YouLose”,
“Yourscoreis….”,“Comebackagain”,接下来是制作者信息。
至此,游戏演示结束。
【技术文档】
一、程序结构以及各模块功能描述
1.程序结构
二、各模块的主要算法(用流程图描述)和数据结构解释
一、Dispatchmessage()函数
二、Collision()函数
三、各模块中名称以及用途:
1.main函数
这是游戏的主函数,执行时按照主函数里的顺序执行。
2.getMessage函数
这是判断游戏是否继续进行下去的函数,主要对message变量赋值。
3.dispatchmessage函数
这是游戏最重要的函数,它包括了游戏的控制环节,消行的控制,方块的旋转。
4.falldown函数
这是方块下落函数。
5.init函数
这是绘制游戏界面的函数。
6.genbox函数
这是制作7种方块的函数。
7.linefull函数
这是判断条件,决定是否消行函数。
8.draw函数
这是绘制当方块下落后,界面的变化情况的函数。
9.moveright函数
这是控制方块右移的函数。
10.moveleft函数
这是控制方块左移的函数。
11.movedown函数
这是控制方块下落的函数。
12.rotate函数
这是控制方块旋转的函数。
13.collision函数
这是控制判断方块是否跟已有的方块或界面发生碰撞的函数。
14.start函数
这是开机logo的绘制函数。
四、游戏调试测试
接下来是游戏的实际运行画面:
这是开机logo以及选择难度的画面。
这是游戏实际运行画面。
这是游戏结束后统计分数,和显示作者信息的画面。
五、程序的源代码清单
#include
#include/*可以加载简单图形*/
#include/*需要读取bios时间*/
#include
#include
#definemDRAW5
#definemLINE6
#definemADOWN7
#definemGEN8
#definemLEFT75/*定义上下左右按键用数字*/
#definemRIGHT77
#definemSPACE57
#definemDOWN80
#definemESC1
#defineTIMEINT2
#defineMAXX9/*最大可见x*/
#defineMAXY30/*最大可见y*/
#defineBACKCOLORBLACK
#defineWINX50
#defineWINY470
#defineGAP6
#defineAREAX(WINX+GAP)
#defineAREAY(WINY-GAP)
#defineBOXW15
#defineA20.0
#definemid12
#definepi3.14159
#definerate0.55
intoldarea[MAXY+1][MAXX];
intarea[MAXY+1][MAXX];
intactW,actH,actX,actY;
intcurX,curY,curColor,curW,curH;
intnewX,newY,newColor,newW,newH;
intactive;
intbox[4][4];
intFORCOLOR;
intMESSAGE;
intBOX[7][4][4]={
{
{1,1,1,1},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0}
},{
{1,1,1,0},
{1,0,0,0},
{0,0,0,0},
{0,0,0,0}
},{
{1,1,1,0},
{0,0,1,0},
{0,0,0,0},
{0,0,0,0}
},{
{1,1,1,0},
{0,1,0,0},
{0,0,0,0},
{0,0,0,0}
},{
{1,1,0,0},
{0,1,1,0},
{0,0,0,0},
{0,0,0,0}
},{
{0,1,1,0},
{1,1,0,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}
}
};/*这是绘出几种方块的形状点阵*/
staticscore;
staticlevel;
voidinit();
voiddraw();
intgenBox();
intgetKey();
voidlineFull();
intmoveLeft();
intmoveRight();
intmoveDown();
introtate();
intgetW();
intgetH();
voidclearOldBox();
voidputNewBox();
intcollisionRotate(intbox[][4]);
voidgetMessage();
voiddispatchMessage();
inttimeCome();
voidfallDown();
intgameOver();
main()
{
inti;
score=0;
level=0;
start();
getch();
printf("pleaseinputthelevel(1-5):
");
scanf("%d",&level);
init();
do
{
getMessage();
dispatchMessage();
}
while(!
gameOver());
closegraph();
printf("\n\nYoulose.");
printf("yourscoreis:
%d",score);
printf("\n\n\nComebackagain.\n\nMadebyYangZhiChao.zhangpeng1480@");
getch();
closegraph();
}
voidgetMessage()
{
if(MESSAGE)return;
if(timeCome())
{
MESSAGE=mADOWN;
return;
}
if(bioskey
(1))
{
MESSAGE=bioskey(0)>>8;
return;
}
}
voiddispatchMessage()
{
switch(MESSAGE)
{
casemLEFT:
moveLeft();break;
casemRIGHT:
moveRight();break;
casemADOWN:
moveDown();break;
casemSPACE:
rotate();break;
casemDOWN:
fallDown();break;
casemDRAW:
draw();break;
casemLINE:
lineFull();break;
casemGEN:
genBox();break;
casemESC:
closegraph();exit(0);
default:
MESSAGE=0;
}
}
voidfallDown()/*下落函数*/
{
while(active)
{
moveDown();draw();
}
MESSAGE=mLINE;
}
inttimeCome()/*下落速度设置*/
{
staticlongtm,old;
tm=biostime(0,tm)/level;
if(tm-oldelse
{
old=tm;return1;
}
}
voidinit()/*绘界面*/
{
inti,j,x1,y1,x2,y2;
intdriver=DETECT,mode=0;
structtimet;
randomize();
registerbgidriver(EGAVGA_driver);
initgraph(&driver,&mode,"");
cleardevice();
setfillstyle(SOLID_FILL,BLUE);/*背景颜色*/
bar(0,0,639,479);
x1=AREAX;
y1=AREAY-BOXW*MAXY;
x2=AREAX+MAXX*BOXW;
y2=AREAY;
rectangle(--x1,--y1,++x2,++y2);
setfillstyle(SOLID_FILL,BLACK);
bar(++x1,++y1,--x2,--y2);
y1=AREAY-MAXY*BOXW;y2=AREAY;
setcolor(DARKGRAY);/*边框颜色*/
settextstyle(0,0,5);/*设置为4倍字体*/
outtextxy(210,90,"HaveFun!
");
outtextxy(210,25,"Tetris!
");
for(i=0;i{
x1=AREAX+i*BOXW;
line(x1,y1,x1,y2);
}
x1=AREAX;x2=x1+MAXX*BOXW;
for(j=0;j{
y1=AREAY-j*BOXW;
line(x1,y1,x2,y1);
}
for(j=0;jfor(i=0;iarea[j][i]=oldarea[j][i]=0;
actX=0;actY=0;actW=MAXX-1;actH=MAXY-1;
draw();
MESSAGE=mGEN;
gettime(&t);
setcolor(WHITE);
settextstyle(0,0,2);
sprintf("\0","%2d:
%02d:
%02d.%02d\n",t.ti_hour,t.ti_min,t.ti_sec,t.ti_hund);
outtextxy(240,200,"\0");
}
intgenBox()
{
inti,j,boxidx;
boxidx=random(7);FORCOLOR=random(7)+1;
for(j=0;j<4;j++)
for(i=0;i<4;i++)
box[j][i]=BOX[boxidx][j][i];
curW=getW();curH=getH();
curX=(MAXX+curW)/2;
if(curX+curW>=MAXX)curX=MAXX-1-curW;
curY=MAXY-1-curH;
newX=curX;newY=curY;actX=curX;actY=curY;
actW=newW=curW;actH=newH=curH;
active=1;
if(collision(box))return0;
putNewBox();
draw();MESSAGE=0;
return1;
}
voidlineFull()/*判断消行函数*/
{
introw,col,rowEnd,full,i,j;
rowEnd=newY+newH;
if(rowEnd>=MAXY-1)rowEnd=MAXY-2;
for(row=newY;row<=rowEnd;)
{
full=1;
for(col=0;colif(!
area[row][col]){full=0;break;}
if(!
full){++row;continue;}
for(j=row;jfor(i=0;iarea[j][i]=area[j+1][i];
actX=0;actY=row;actW=MAXX-1;actH=MAXY-1-row;
draw();rowEnd--;
score=score+1;
}
MESSAGE=mGEN;
}
voiddraw()
{
introw,col,x1,y1,x2,y2;
for(row=actY;row<=actY+actH;row++)
for(col=actX;col<=actX+actW;col++)
if(area[row][col]!
=oldarea[row][col])
{
if(area[row][col]==0)
setfillstyle(SOLID_FILL,BACKCOLOR);
else
setfillstyle(SOLID_FILL,FORCOLOR);
x1=AREAX+col*BOXW;x2=x1+BOXW;
y1=AREAY-(row+1)*BOXW;y2=y1+BOXW;
bar(++x1,++y1,--x2,--y2);
oldarea[row][col]=area[row][col];
}
MESSAGE=0;
}
intmoveLeft()/*方块左移*/
{
newX=curX-1;clearOldBox();
sound(500);
delay(1000);
nosound();
if(collision(box))
{
newX=curX;
putNewBox();
MESSAGE=0;
return0;
}
putNewBox();
actW=curW+1;actX=curX=newX;
MESSAGE=mDRAW;
return1;
}
intmoveRight()/*方块右移*/
{
newX=curX+1;clearOldBox();
sound(600);
delay(1000);
nosound();
if(collision(box))
{
newX=curX;
putNewBox();
MESSAGE=0;
return0;
}
putNewBox();
actW=curW+1;actX=curX;curX=newX;
MESSAGE=mDRAW;
return1;
}
intmoveDown()/*方块下落*/
{
inti,j;
newY=curY-1;
clearOldBox();
if(collision(box))
{
newY=curY;
putNewBox();
active=0;
MESSAGE=mLINE;
return0;
}
putNewBox();
actH=curH+1;actY=newY;curY=newY;
MESSAGE=mDRAW;
return1;
}
introtate()/*方块旋转*/
{
intnewBox[4][4];
inti,j;
clearOldBox();
for(j=0;j<4;j++)
for(i=0;i<4;i++)
newBox[j][i]=0;
for(j=0;j<4;j++)
for(i=0;i<4;i++)
newBox[curW-i][j]=box[j][i];
newW=curH;newH=curW;
if(collisionRotate(newBox))
{
newW=curW;newH=curH;newX=curX;newY=curY;
putNewBox();
MESSAGE=0;
return0;
}
for(j=0;j<4;j++)
for(i=0;i<4;i++)
box[j][i]=newBox[j][i];
putNewBox();
actH=newH>curH?
newH:
curH;
actW=curX+actH-newX;
actX=newX;actY=newY;curX=newX;
curY=newY;curW=newW;curH=newH;
MESSAGE=mDRAW;
return1;
}
intgetW()
{
inti,j;
for(i=3;i>0;i--)
for(j=0;j<4;j++)
if(box[j][i])returni;
return0;
}
intgetH()
{
inti,j;
for(j=3;j>0;j--)
for(i=0;i<4;i++)
if(box[j][i])returnj;
return0;
}
voidclearOldBox()
{
inti,j;
for(j=0;j<=curH;j++)
for(i=0;i<=curW;i++)
if(box[j][i])
area[curY+j][curX+i]=0;
}
voidputNewBox()
{
inti,j;
for(j=0;j<=newH;j++)
for(i=0;i<=newW;i++)
if(box[j][i])
area[newY+j][newX+i]=FORCOLOR;
}
intcollision(intcbox[][4])/*碰撞判断*/
{
inti,j;
if(newX<0)return1;
if(newX+newW>=MAXX)return1;
if(newY<0)return1;
for(j=0;j<=newH;j++)
for(i=0;i<=newW;i++)
if(area[newY+j][newX+i]&&cbox[j][i])return1;
return0;
}
intcollisionRotate(intcbox[][4])/*碰撞旋转*/
{
inti,j;
if(newX+newW>=MAXX)newX=MAXX-1-newW;
if(newY+newH>=MAXY)newY=MAXY-1-newH;
if(collision(cbox))return1;
for(i=0;i<=newW;i++)
for(j=0;j<=newH;j++)
if(area[newY+j][newX+i])
{
newX-=newW-i+1;gotoL;
}
L:
returncollision(cbox);
}
intgameOver()/*判断结束*/
{
if(!
active&&(curY+curH>MAXY-3))
return1;
else
return0;
}
intstart()/*开机logo*/
{
charc[2*mid][80];
doubler,alpha,x,y;
inti,j,seta;
for(i=0;i<2*mid;i++)
for(j=0;j<80;j++)
c[i][j]='';
for(i=0;i<2*mid;i++)
c[i][79]='\0';
for(seta=0;seta<45;seta++)