俄罗斯方块程序代码.docx
《俄罗斯方块程序代码.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块程序代码.docx(20页珍藏版)》请在冰点文库上搜索。
![俄罗斯方块程序代码.docx](https://file1.bingdoc.com/fileroot1/2023-7/3/fdf3e1ba-0b1c-47fd-b3ef-ff57f3c2b044/fdf3e1ba-0b1c-47fd-b3ef-ff57f3c2b0441.gif)
俄罗斯方块程序代码
#include
#include
#include
#include
#include
#include"Tetris.h"
//intscore=0;
//intlever=1;
//charscores[10];
//charlevers[10];
/*
enumcmd
{
round,//旋转方块
left,//左移方块
right,//右移方块
down,//下一方块
bottom,//方块沉底
quit//离开游戏
};
//定义绘制方块的状态的枚举类型
enumdraw
{
show,//显示方块
hide//抹掉方块
};
//定义俄罗斯方块的结构体
structblock
{
intdir[4];//方块的四个旋转的状态
intcolor;//方块的颜色
}*/
staticT_TrsBlockStylegz_tBlockStyleTab[7]=
{/*口口
口口口口口口口口口口
口口
口口*/
{0x0F00,0x4444,0x0F00,0x4444,RED},
/*
口口口口口口口口
口口口口口口口口
*/
{0x0660,0x0660,0x0660,0x0660,BLUE},
/*口
口口口口口口口
口口口口口口口
口*/
{0x4460,0x02E0,0x0622,0x0740,MAGENTA},
/*口
口口口口口口口
口口口口口口口
口*/
{0x2260,0x0E20,0x0644,0x0470,YELLOW},
/*口口
口口口口口口口口
口口口口口口
*/
{0x0C60,0x2640,0x0C60,0x2640,CYAN},
/*口口
口口口口口口口口
口口口口口口
*/
{0x0360,0x4620,0x0360,0x4620,GREEN},
/*口口口
口口口口口口口口口口
口口口
*/
{0x4E00,0x4C40,0x0E40,0x4640,BROWN}};
/*
//定义俄罗斯方块的信息的结构体
structblockinfo
{
intid;//7中方块中的哪一种
bytedir:
2;//1种方块中四个方向中的哪个
charx,y;//方块的坐标(不是屏幕中的而是自己设置的游戏区域中的)
}
curblock,nextblock;
*/
//定义游戏区
//unsignedchararea[width][high]={0};
//函数声明
boolTRS_AppCreate(void**ppUser,void*pFunc);
staticvoidTRS_Init(void*pUser);
staticvoidTRS_DrawBackground(void*pUser);
staticvoidTRS_GameOver(void*pUser);
staticvoidTRS_Quit(void*pUser);
staticvoidTRS_ScoreShow(void*pUser);
staticvoidTRS_NewGame(void*pUser);
staticAEEEventTRS_GetMsg(PCTetrisApppMe);
staticboolTRS_TetrisHandle(void*pUser,DWORDevt,WORDw,DWORDdw);
staticvoidTRS_Newblock(void*pUser);
staticvoidTRS_DrawBlock(void*pUser,T_TrsBlockInfotCurBlck,EDrawStyleeStyle);
staticboolTRS_Checkblock(void*pUser,T_TrsBlockInfotCurBlck);
staticvoidTRS_HRound(void*pUser);
staticvoidTRS_HLeft(void*pUser);
staticvoidTRS_HRight(void*pUser);
staticvoidTRS_HDown(void*pUser);
staticvoidTRS_HBottom(void*pUser);
/*------------------------------------------------------------------------------
函数名称:
main
功能说明:
主函数
参数说明:
作者:
时间:
-------------------------------------------------------------------------------*/
voidmain()
{
PCTetrisApppMe;
AEEEventeMsg;
//init();
TRS_AppCreate((void**)&pMe,NULL);
/*
while(true)
{
scoreshow();
c=getcmd();
discmd(c);
if(c==quit)
{
HWNDwnd=GetHWnd();
if(MessageBox(wnd,_T("您要退出游戏吗?
"),_T("提醒"),MB_OKCANCEL|MB_ICONQUESTION)==IDOK)
Quit();
}
}*/
}
boolTRS_AppCreate(void**ppUser,void*pFunc);
{
PCTetrisApppMe;
new(pMe);
*ppUser=pMe;
pMe->m_iScore=0;
pMe->m_iLever=0;
memset(pMe->m_iScores,0,sizeof(int)*10);
memset(pMe->m_iLevers,0,sizeof(int)*10);
for(iLoop=0;iLoop{
for(jLoop=0;jLoop{
pMe->m_uiArea[iLoop][jLoop]=0;
}
}
pMe->m_dwOldTime=0;
pMe->m_dwNewTime=0;
returntrue;
}
staticboolTRS_TetrisHandle(void*pUser,DWORDevt,WORDw,DWORDdw)
{
switch(evt)
{
caseEVT_ROUND:
TRS_HRound(pUser);
break;
caseEVT_LEFT:
TRS_HLeft(pUser);
break;
caseEVT_RIGHT:
TRS_HRight(pUser);
break;
caseEVT_DOWN:
TRS_HDown(pUser);
break;
caseEVT_BOTTOM:
TRS_HBottom(pUser);
break;
caseEVT_QUIT:
{
HWNDwnd=GetHWnd();
if(MessageBox(wnd,_T("您要退出游戏吗?
"),_T("提醒"),MB_OKCANCEL|MB_ICONQUESTION)==IDOK)
TRS_Quit(pUser);
}
break;
default:
returnfalse;
}
returntrue;
}
//初始化函数
staticvoidTRS_Init(void*pUser)
{
PCTetrisApppMe=(PCTetrisApp)pUser;
initgraph(SCREEN_HIGHT,SCREEN_WIDTH);//初始化屏幕大小
srand((unsigned)time(NULL));//以当前时间作为随机种子
TRS_NewGame();
}
staticvoidTRS_DrawBackground(void*pUser);
{
PCTetrisApppMe=(PCTetrisApp)pUser;
setfont(TRS_GUIDE_FONT_SIZE,0,TRS_GUIDE_FONT_TYPE);//定义字体宋体,字高16,字宽比例自动适应
outtextxy(TRS_OPERATION_TITLE_X,TRS_OPERATION_TITLE_Y,"操作提示:
");
outtextxy(TRS_MLEFT_X,TRS_MLEFT_Y,"a:
左移");
outtextxy(TRS_MRIGHT_X,TRS_MRIGHT_Y,"d:
右移");
outtextxy(TRS_MDOWN_X,TRS_MDOWN_Y,"s:
下移");
outtextxy(TRS_ROTATION_X,TRS_ROTATION_Y,"w:
变形");
outtextxy(TRS_MBOTTOM_X,TRS_MBOTTOM_Y,"空格:
沉底");
outtextxy(TRS_EXIT_X,TRS_EXIT_Y,"ESC:
退出");
setfont(50,0,"黑体");
outtextxy(460,160,"Tetris");
setfont(22,0,"宋体");
outtextxy(20,20,"得分:
");
outtextxy(20,80,"等级:
");
setorigin(220,20);//设置坐标原点
setfillstyle(WHITE);//设置填充颜色为白色
//画游戏的边框
bar3d(-21,-1,-6,GSCRN_HIGHT_CL*CELL_WIDTH,5,1);
bar(-21,GSCRN_HIGHT_CL*CELL_WIDTH,GSCRN_WIDTH_CL*CELL_WIDTH,GSCRN_HIGHT_CL*CELL_WIDTH+20);
bar3d(GSCRN_WIDTH_CL*CELL_WIDTH,-1,GSCRN_WIDTH_CL*CELL_WIDTH+15,GSCRN_HIGHT_CL*CELL_WIDTH+20,5,1);
//画预览方块区域的边框
rectangle((GSCRN_WIDTH_CL+2)*CELL_WIDTH-1,-1,(GSCRN_WIDTH_CL+6)*CELL_WIDTH,4*CELL_WIDTH);
}
//退出游戏
staticvoidTRS_Quit(void*pUser)
{
PCTetrisApppMe=(PCTetrisApp)pUser;
closegraph();
//释放应用空间
free(pMe);
exit(0);
}
//结束游戏
staticvoidTRS_GameOver(void*pUser)
{
HWNDwnd=GetHWnd();
if(MessageBox(wnd,_T("游戏结束。
\n您想重新来一局吗?
"),_T("游戏结束"),MB_YESNO|MB_ICONQUESTION)==IDYES)
TRS_NewGame();
else
TRS_Quit();
}
//游戏得分显示
staticvoidTRS_ScoreShow(void*pUser)
{
sprintf(scores,"%d",score);//将的分转化为字符
outtextxy(-140,20,scores);//将得分显示到屏幕上
sprintf(levers,"%d",lever);//将等级转化为字符
outtextxy(-140,80,levers);//将等级显示到屏幕上
}
//开始新游戏
staticvoidTRS_NewGame(void*pUser)
{
PCTetrisApppMe=(PCTetrisApp)pUser;
setfillstyle(BLACK);//选定黑色填充
bar(0,0,GSCRN_WIDTH_CL*CELL_WIDTH-1,GSCRN_HIGHT_CL*CELL_WIDTH-1);//将游戏区域清空
ZeroMemory(area,GSCRN_WIDTH_CL*GSCRN_HIGHT_CL);//将游戏区域用0填满
//随机生成下一个方块
nextblock.id=rand()%7;
nextblock.dir=rand()%4;
nextblock.x=GSCRN_WIDTH_CL+2;
nextblock.y=GSCRN_HIGHT_CL-1;
TRS_NewBlock(pMe);//生成新的方块
}
//获取控制命令函数
staticAEEEventTRS_GetMsg(PCTetrisApppMe)
{
while
(1)
{
//没有按键到了500ms以后自动下落一格
pMe->m_dwNewTime=GetTickCount();//得到系统到现在所经过的毫秒数储存到newtime中
if(pMe->m_dwNewTime-pMe->m_dwOldTime>=550-50*pMe->m_iLever)//如果时间过去500ms
{
pMe->m_dwOldTime=pMe->m_dwNewTime;
returnEVT_DOWN;//返回下落按键
}
//有按键的话,返回对应的按键
if(kbhit())
{
switch(getch())
{
case'w':
case'W':
returnEVT_ROUND;
case'a':
case'A':
returnEVT_LEFT;
case'd':
case'D':
returnEVT_RIGHT;
case's':
case'S':
returnEVT_DOWN;
case'':
returnEVT_BOTTOM;
case27:
returnEVT_QUIT;
}
}
}
}
/*
staticvoidTRS_Discmd(void*pUser,cmdc)
{
switch(c)
{
caseround:
hround();break;
caseleft:
hleft();break;
caseright:
hright();break;
casedown:
hdown();break;
casebottom:
hbottom();break;
casequit:
break;
}
}
*/
//把新方块信息传给旧方块并再生成新方块
staticvoidTRS_NewBlock(void*pUser)
{
PCTetrisApppMe=(PCTetrisApp)pUser;
//新方块的数据传给旧方块
curblock.id=nextblock.id;
curblock.dir=nextblock.dir;
//定义新方块的坐标
curblock.x=(GSCRN_WIDTH_CL-4)/2;
curblock.y=GSCRN_HIGHT_CL+2;
//再随机生产成新的方块
nextblock.id=rand()%7;
nextblock.dir=rand()%4;
drawblock(curblock);//调用画方块函数画方块curblock
//在方块预览中画出下一个方块
setfillstyle(BLACK);
bar((GSCRN_WIDTH_CL+2)*CELL_WIDTH,0,(GSCRN_WIDTH_CL+6)*CELL_WIDTH-1,4*CELL_WIDTH-1);
drawblock(nextblock);
oldtime=GetTickCount();//设置计时器
}
//画方块函数
staticvoidTRS_DrawBlock(void*pUser,T_TrsBlockInfotCurBlck,EDrawStyleeStyle)
{
intb=gz_tBlockStyleTab[tCurBlck.m_iStyle].m_izStatus[tCurBlck.m_iStatID];//取出block中block.dir数组里面的值赋给b
inti,x,y;
intcolor;
switch(d)
{
//决定方块形状和状态对应的颜色
caseshow:
color=block[c.id].color;break;
casehide:
color=BLACK;break;
}
setfillstyle(color);//决定填充的颜色
for(i=0;i<16;i++)//控制循环一共十六次
{
if(b&0x8000)//让b和0x8000按位与,用来找出16个小方块中哪一些是1,哪一些是0
{
x=c.x+i%4;//值是1的小方块x轴的坐标
y=c.y-i/4;//值是1的小方块y轴的坐标
if(y{
if(d!
=hide)
bar3d(x*CELL_WIDTH+2,(GSCRN_HIGHT_CL-y-1)*CELL_WIDTH+2,(x+1)*CELL_WIDTH-4,(GSCRN_HIGHT_CL-y)*CELL_WIDTH-4,3,1);
else
bar(x*CELL_WIDTH,(GSCRN_HIGHT_CL-y-1)*CELL_WIDTH,(x+1)*CELL_WIDTH-1,(GSCRN_HIGHT_CL-y)*CELL_WIDTH-1);
}
}
b<<=1;
}
}
//检测方块是否可以下落
staticboolTRS_CheckBlock(void*pUser,blockinfoc)
{
intb=block[c.id].dir[c.dir];//取出block中block.dir数组里面的值赋给b
inti,x,y;
for(i=0;i<16;i++)//控制循环一共十六次
{
if(b&0x8000)//让b和0x8000按位与,用来找出16个小方块中哪一些是1,哪一些是0
{
x=c.x+i%4;//值是1的小方块x轴的坐标
y=c.y-i/4;//值是1的小方块y轴的坐标
//如果小方块超出界限或者与下面相碰
if((x<0)||(x>=GSCRN_WIDTH_CL)||(y<0))
returnfalse;
if((yreturnfalse;
}
b<<=1;
}
returntrue;
}
//旋转方块
staticvoidTRS_HRound(void*pUser)
{
blockinfoa=curblock;
a.dir++;
if(checkblock(a))
{
drawblock(curblock,hide);
curblock.dir++;
drawblock(curblock,show);
}
else
return;
}
//左移方块
staticvoidTRS_HLeft(void*pUser)
{
blockinfoa=curblock;
a.x--;
if(checkblock(a))
{
drawblock(curblock,hide);
curblock.x--;
drawblock(curblock,show);
}
else
return;
}
//右移方块
staticvoidTRS_HRight(void*pUser)
{
blockinfoa=curblock;
a.x++;
if(checkblock(a))
{
drawblock(curblock,hide);
curblock.x++;
drawblock(curblock,show);
}
else
return;
}
//下移方块
staticvoidTRS_HDown(void*pUser)
{
blockinfoa=curblock;
a.y--;
if(checkblock(a))
{
drawblock(curblock,hide);
curblock.y--;
drawblock(curblock,show);
}
else
hbottom();
}
//沉底方块
staticvoidTRS_HBottom(void*pUser)
{
//连续下移方块
inti,j=0,x,y;
drawblock(curblock,hide);//去掉方块
blockinfoa=curblock;
a.y--;
while(checkblock(a))
{
curblock.y--;
a.y--;
}
drawblock(curblock,show);//画出方块
//固定方块在游戏区
intb=block[curblock.id].d