c语言俄罗斯方块代码推荐文档Word下载.docx
- 文档编号:19474934
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:14
- 大小:17.32KB
c语言俄罗斯方块代码推荐文档Word下载.docx
《c语言俄罗斯方块代码推荐文档Word下载.docx》由会员分享,可在线阅读,更多相关《c语言俄罗斯方块代码推荐文档Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
#defineMAXHEIGHT30
/*组成方块的小格子的宽度*/
#defineBOXWIDTH15
/*用两个数组来表示新旧两个矩形游戏区*/
intoldarea[MAXHEIGHT+1][MAXWIDTH];
intarea[MAXHEIGHT+1][MAXWIDTH];
/*定义一个需要改变的屏幕区域,初次之外的区域不用进行重绘*/
intactW,actH,actX,actY;
/*当前方块的一些属性(坐标,颜色,高,宽)*/
intcurX,curY,curColor,curW,curH;
/*新的方块的一些属性(坐标,颜色,高,宽)*/
intnewX,newY,newColor,newW,newH;
/*制定方块的状态*/
intactive;
/*存储当前方块的数组*/
intbox[4][4];
/*当前方块的颜色*/
intBOXCOLOR;
/*控制命令*/
intCMD;
/*定义七种基本的方块形状*/
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}}
};
/*得到方块的宽度,即从右向左第一个不空的列*/
intGetWidth()
{
inti,j;
for(i=3;
i>
0;
i--)
for(j=0;
j<
4;
j++)
if(box[j][i])returni;
return0;
}
/*得到方块的高度,从上往下第一个不空的行*/
intGetHeight()
for(j=3;
j>
j--)
for(i=0;
i<
i++)
if(box[j][i])returnj;
/*清除原有的方块占有的空间*/
voidClearOldspace()
=curH;
j++)
=curW;
i++)
if(box[j][i])
area[curY+j][curX+i]=0;
/*置位新方块的位置*/
voidPutNewspace()
=newH;
=newW;
area[newY+j][newX+i]=BOXCOLOR;
/*判断方块的移动是否造成区域冲突*/
intMoveCollision(intbox[][4])
if(newX<
0)return1;
if(newX+newW>
=MAXWIDTH)return1;
if(newY<
if(area[newY+j][newX+i]&
&
box[j][i])return1;
/*判断翻转方块是否造成区域的冲突*/
intRotateBoxCollision(intbox[][4])
=MAXWIDTH)newX=MAXWIDTH-1-newW;
if(newY+newH>
=MAXHEIGHT)newY=MAXHEIGHT-1-newH;
if(MoveCollision(box))return1;
if(area[newY+j][newX+i])
{
newX-=newW-i+1;
gotoL;
}
L:
returnMoveCollision(box);
/*游戏结束*/
intGameOver()
if(!
active&
(curY+curH>
MAXHEIGHT-3))
return1;
else
/*判断是否超时,即是否超过允许的时间间隔*/
intTimeOut()
staticlongtm,old;
tm=biostime(0,tm);
if(tm-old<
TIMEINTERVAL)
old=tm;
/*重绘游戏区*/
voidDrawSpace()
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,BLACK);
setfillstyle(SOLID_FILL,BOXCOLOR);
x1=56+col*BOXWIDTH;
x2=x1+BOXWIDTH;
y1=464-(row+1)*BOXWIDTH;
y2=y1+BOXWIDTH;
bar(++x1,++y1,--x2,--y2);
oldarea[row][col]=area[row][col];
CMD=0;
/*消去满行*/
voidClearFullline()
introw,col,rowEnd,full,i,j;
rowEnd=newY+newH;
if(rowEnd>
=MAXHEIGHT-1)
rowEnd=MAXHEIGHT-2;
for(row=newY;
row<
=rowEnd;
)
full=1;
for(col=0;
MAXWIDTH;
area[row][col])
{full=0;
break;
full)
{
++row;
continue;
for(j=row;
j<
MAXHEIGHT-1;
area[j][i]=area[j+1][i];
actX=0;
actY=row;
actW=MAXWIDTH-1;
actH=MAXHEIGHT-1-row;
DrawSpace();
rowEnd--;
CMD=CMDGEN;
/*向左移动方块*/
intMoveLeft()
newX=curX-1;
ClearOldspace();
if(MoveCollision(box))
newX=curX;
PutNewspace();
actW=curW+1;
actX=curX=newX;
CMD=CMDDRAW;
/*向右移动方块*/
intMoveRight()
newX=curX+1;
actX=curX;
curX=newX;
/*向下移动方块*/
intMoveDown()
newY=curY-1;
newY=curY;
active=0;
CMD=CMDDELLINE;
actH=curH+1;
actY=newY;
curY=newY;
/*按加速键后方块迅速下落到底*/
voidMoveBottom()
while(active)
MoveDown();
/*初始化*/
voidInitialGame()
inti,j,x1,y1,x2,y2;
intdriver=DETECT,mode=0;
initgraph(&
driver,&
mode,"
e:
\\tc"
);
cleardevice();
randomize();
setfillstyle(SOLID_FILL,BLUE);
bar(0,0,639,479);
x1=56;
y1=464-BOXWIDTH*MAXHEIGHT;
x2=56+MAXWIDTH*BOXWIDTH;
y2=464;
rectangle(--x1,--y1,++x2,++y2);
y1=464-MAXHEIGHT*BOXWIDTH;
setcolor(DARKGRAY);
x1=56+i*BOXWIDTH;
line(x1,y1,x1,y2);
x2=x1+MAXWIDTH*BOXWIDTH;
MAXHEIGHT;
y1=464-j*BOXWIDTH;
line(x1,y1,x2,y1);
area[j][i]=oldarea[j][i]=0;
actY=0;
actH=MAXHEIGHT-1;
}
/*得到控制命令*/
voidGetCMD()
if(CMD)return;
if(TimeOut())
CMD=CMDAOTODOWN;
return;
if(bioskey
(1))
CMD=bioskey(0)>
>
8;
/*生成一个新的方块*/
intGenerateNewbox()
inti,j,boxidx;
boxidx=random(7);
BOXCOLOR=random(7)+1;
box[j][i]=BOX[boxidx][j][i];
curW=GetWidth();
curH=GetHeight();
curX=(MAXWIDTH+curW)/2;
if(curX+curW>
=MAXWIDTH)curX=MAXWIDTH-1-curW;
curY=MAXHEIGHT-1-curH;
actY=curY;
actW=newW=curW;
actH=newH=curH;
active=1;
if(MoveCollision(box))return0;
/*翻转方块*/
intRotateBox()
intnewBox[4][4];
newBox[j][i]=0;
newBox[curW-i][j]=box[j][i];
newW=curH;
newH=curW;
if(RotateBoxCollision(newBox))
newW=curW;
newH=curH;
box[j][i]=newBox[j][i];
actH=newH>
curH?
newH:
curH;
actW=curX+actH-newX;
actX=newX;
curW=newW;
curH=newH;
/*根据获得的命令来执行不同的操作*/
voidExecuteCMD()
switch(CMD)
caseCMDLEFTMOVE:
MoveLeft();
caseCMDRINGHTMOVE:
MoveRight();
caseCMDAOTODOWN:
caseCMDROTATE:
RotateBox();
caseCMDDOWNMOVE:
MoveBottom();
caseCMDDRAW:
caseCMDDELLINE:
ClearFullline();
caseCMDGEN:
GenerateNewbox();
caseCMDESC:
closegraph();
default:
/*主函数*/
intmain()
inti;
InitialGame();
do
GetCMD();
ExecuteCMD();
while(!
GameOver());
getch();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 俄罗斯方块 代码 推荐 文档