俄罗斯方块程序代码.docx

上传人:b****7 文档编号:15343095 上传时间:2023-07-03 格式:DOCX 页数:20 大小:19.55KB
下载 相关 举报
俄罗斯方块程序代码.docx_第1页
第1页 / 共20页
俄罗斯方块程序代码.docx_第2页
第2页 / 共20页
俄罗斯方块程序代码.docx_第3页
第3页 / 共20页
俄罗斯方块程序代码.docx_第4页
第4页 / 共20页
俄罗斯方块程序代码.docx_第5页
第5页 / 共20页
俄罗斯方块程序代码.docx_第6页
第6页 / 共20页
俄罗斯方块程序代码.docx_第7页
第7页 / 共20页
俄罗斯方块程序代码.docx_第8页
第8页 / 共20页
俄罗斯方块程序代码.docx_第9页
第9页 / 共20页
俄罗斯方块程序代码.docx_第10页
第10页 / 共20页
俄罗斯方块程序代码.docx_第11页
第11页 / 共20页
俄罗斯方块程序代码.docx_第12页
第12页 / 共20页
俄罗斯方块程序代码.docx_第13页
第13页 / 共20页
俄罗斯方块程序代码.docx_第14页
第14页 / 共20页
俄罗斯方块程序代码.docx_第15页
第15页 / 共20页
俄罗斯方块程序代码.docx_第16页
第16页 / 共20页
俄罗斯方块程序代码.docx_第17页
第17页 / 共20页
俄罗斯方块程序代码.docx_第18页
第18页 / 共20页
俄罗斯方块程序代码.docx_第19页
第19页 / 共20页
俄罗斯方块程序代码.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

俄罗斯方块程序代码.docx

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

俄罗斯方块程序代码.docx

俄罗斯方块程序代码

#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((y

returnfalse;

}

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

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

当前位置:首页 > 工程科技 > 能源化工

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

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