俄罗斯方块程序不要分.docx

上传人:b****3 文档编号:11089303 上传时间:2023-05-29 格式:DOCX 页数:25 大小:173.56KB
下载 相关 举报
俄罗斯方块程序不要分.docx_第1页
第1页 / 共25页
俄罗斯方块程序不要分.docx_第2页
第2页 / 共25页
俄罗斯方块程序不要分.docx_第3页
第3页 / 共25页
俄罗斯方块程序不要分.docx_第4页
第4页 / 共25页
俄罗斯方块程序不要分.docx_第5页
第5页 / 共25页
俄罗斯方块程序不要分.docx_第6页
第6页 / 共25页
俄罗斯方块程序不要分.docx_第7页
第7页 / 共25页
俄罗斯方块程序不要分.docx_第8页
第8页 / 共25页
俄罗斯方块程序不要分.docx_第9页
第9页 / 共25页
俄罗斯方块程序不要分.docx_第10页
第10页 / 共25页
俄罗斯方块程序不要分.docx_第11页
第11页 / 共25页
俄罗斯方块程序不要分.docx_第12页
第12页 / 共25页
俄罗斯方块程序不要分.docx_第13页
第13页 / 共25页
俄罗斯方块程序不要分.docx_第14页
第14页 / 共25页
俄罗斯方块程序不要分.docx_第15页
第15页 / 共25页
俄罗斯方块程序不要分.docx_第16页
第16页 / 共25页
俄罗斯方块程序不要分.docx_第17页
第17页 / 共25页
俄罗斯方块程序不要分.docx_第18页
第18页 / 共25页
俄罗斯方块程序不要分.docx_第19页
第19页 / 共25页
俄罗斯方块程序不要分.docx_第20页
第20页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

俄罗斯方块程序不要分.docx

《俄罗斯方块程序不要分.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块程序不要分.docx(25页珍藏版)》请在冰点文库上搜索。

俄罗斯方块程序不要分.docx

俄罗斯方块程序不要分

俄罗斯方块程序

 

【目录】

【题目描述】························································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-old

else

{

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;j

for(i=0;i

area[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;col

if(!

area[row][col]){full=0;break;}

if(!

full){++row;continue;}

for(j=row;j

for(i=0;i

area[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++)

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2