还剩11页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
//包含头文件#includestdio.h#includeWindows.h#includeconio.h#includegraphics.h#includetime.h#includeTetris.h//intscore=0;//intlever=1;//charscores
[10];//charlevers
[10];/*enumcmd{round//旋转方块left//左移方块right//右移方块down//下一方块bottom//方块沉底quit//离开游戏};//定义绘制方块的状态的枚举类型enumdraw{show//显示方块hide//抹掉方块};//定义___方块的结构体structblock{intdir
[4];//方块的四个旋转的状态intcolor;//方块的颜色}*/staticT_Tr__lockStylegz_tBlockStyleTab
[7]={/*口口口口口口口口口口口口口口口口*/{0x0F000x44440x0F000x4444RED}/*口口口口口口口口口口口口口口口口*/{0x06600x06600x06600x0660BLUE}/*口口口口口口口口口口口口口口口口*/{0x44600x02E00x06220x0740__GENTA}/*口口口口口口口口口口口口口口口口*/{0x22600x0E200x06440x0470YELLOW}/*口口口口口口口口口口口口口口口口*/{0x0C600x26400x0C600x2640CYAN}/*口口口口口口口口口口口口口口口口*/{0x03600x46200x03600x4620GREEN}/*口口口口口口口口口口口口口口口口*/{0x4E000x4C400x0E400x4640BROWN}};/*//定义___方块的信息的结构体structblockinfo{intid;//7中方块中的哪一种bytedir:2;//1种方块中四个方向中的哪个charxy;//方块的坐标(不是屏幕中的而是自己设置的游戏区域中的)}curblocknextblock;*///定义游戏区//unsignedchararea[width][high]={0};//函数声明boolTRS_AppCreatevoid**ppUservoid*pFunc;staticvoidTRS_Initvoid*pUser;staticvoidTRS_DrawBackgroundvoid*pUser;staticvoidTRS_GameOvervoid*pUser;staticvoidTRS_Quitvoid*pUser;staticvoidTRS_ScoreShowvoid*pUser;staticvoidTRS_NewGamevoid*pUser;staticAEEEventTRS_GetMsgPCTetrisApppMe;staticboolTRS_TetrisHandlevoid*pUserDWORDevtWORDwDWORDdw;staticvoidTRS_Newblockvoid*pUser;staticvoidTRS_DrawBlockvoid*pUserT_Tr__lockInfotCurBlckEDrawStyleeStyle;staticboolTRS_Checkblockvoid*pUserT_Tr__lockInfotCurBlck;staticvoidTRS_HRoundvoid*pUser;staticvoidTRS_HLeftvoid*pUser;staticvoidTRS_HRightvoid*pUser;staticvoidTRS_HDownvoid*pUser;staticvoidTRS_HBottomvoid*pUser;/*------------------------------------------------------------------------------函数名称__in功能说明主函数参数说明作者时间-------------------------------------------------------------------------------*/void__in{PCTetrisApppMe;AEEEventeMsg;//init;TRS_AppCreatevoid**pMeNULL;/*whiletrue{scoreshow;c=getcmd;discmdc;ifc==quit{HWNDwnd=GetHWnd;ifMessageBoxwnd_T您要退出游戏吗?_T提醒MB_OKCAN__L|MB_ICONQUESTION==IDOKQuit;}}*/}boolTRS_AppCreatevoid**ppUservoid*pFunc;{PCTetrisApppMe;newpMe;*ppUser=pMe;pMe-m_iScore=0;pMe-m_iLever=0;memsetpMe-m_iScores0sizeofint*10;memsetpMe-m_iLevers0sizeofint*10;foriLoop=0;iLoopGSCRN_WIDTH_CL;iLoop++{forjLoop=0;jLoopGSCRN_HIGHT_CL;jLoop++{pMe-m_uiArea[iLoop][jLoop]=0;}}pMe-m_dwOldTime=0;pMe-m_dwNewTime=0;returntrue;}staticboolTRS_TetrisHandlevoid*pUserDWORDevtWORDwDWORDdw{switchevt{caseEVT_ROUND:TRS_HRoundpUser;break;caseEVT_LEFT:TRS_HLeftpUser;break;caseEVT_RIGHT:TRS_HRightpUser;break;caseEVT_DOWN:TRS_HDownpUser;break;caseEVT_BOTTOM:TRS_HBottompUser;break;caseEVT_QUIT:{HWNDwnd=GetHWnd;ifMessageBoxwnd_T您要退出游戏吗?_T提醒MB_OKCAN__L|MB_ICONQUESTION==IDOKTRS_QuitpUser;}break;default:returnfalse;}returntrue;}//初始化函数staticvoidTRS_Initvoid*pUser{PCTetrisApppMe=PCTetrisApppUser;initgraphSCREEN_HIGHTSCREEN_WIDTH;//初始化屏幕大小srandunsignedtimeNULL;//以当前时间作为随机种子TRS_NewGame;}staticvoidTRS_DrawBackgroundvoid*pUser;{PCTetrisApppMe=PCTetrisApppUser;setfontTRS_GUIDE_FONT_SIZE0TRS_GUIDE_FONT_TYPE;//定义字体宋体,字高16,字宽比例自动适应outtextxyTRS_OPERATION_TITLE_XTRS_OPERATION_TITLE_Y操作提示;outtextxyTRS_MLEFT_XTRS_MLEFT_Ya:左移;outtextxyTRS_MRIGHT_XTRS_MRIGHT_Yd:右移;outtextxyTRS_MDOWN_XTRS_MDOWN_Ys:下移;outtextxyTRS_ROTATION_XTRS_ROTATION_Yw:变形;outtextxyTRS_MBOTTOM_XTRS_MBOTTOM_Y空格沉底;outtextxyTRS_EXIT_XTRS_EXIT_YESC:退出;setfont500黑体;outtextxy460160Tetris;setfont220宋体;outtextxy2020得分;outtextxy2080等级;setorigin22020;//设置坐标原点setfillstyleWHITE;//设置填充颜色为白色//画游戏的边框bar3d-21-1-6GSCRN_HIGHT_CL*__LL_WIDTH51;bar-21GSCRN_HIGHT_CL*__LL_WIDTHGSCRN_WIDTH_CL*__LL_WIDTHGSCRN_HIGHT_CL*__LL_WIDTH+20;bar3dGSCRN_WIDTH_CL*__LL_WIDTH-1GSCRN_WIDTH_CL*__LL_WIDTH+15GSCRN_HIGHT_CL*__LL_WIDTH+2051;//画预览方块区域的边框rectangleGSCRN_WIDTH_CL+2*__LL_WIDTH-1-1GSCRN_WIDTH_CL+6*__LL_WIDTH4*__LL_WIDTH;}//退出游戏staticvoidTRS_Quitvoid*pUser{PCTetrisApppMe=PCTetrisApppUser;closegraph;//释放应用空间freepMe;exit0;}//结束游戏staticvoidTRS_GameOvervoid*pUser{HWNDwnd=GetHWnd;ifMessageBoxwnd_T游戏结束\n您想重新来一局吗?_T游戏结束MB_YESNO|MB_ICONQUESTION==IDYESTRS_NewGame;elseTRS_Quit;}//游戏得分显示staticvoidTRS_ScoreShowvoid*pUser{sprintfscores%dscore;//将的分转化为字符outtextxy-14020scores;//将得分显示到屏幕上sprintflevers%dlever;//将等级转化为字符outtextxy-14080levers;//将等级显示到屏幕上}//开始新游戏staticvoidTRS_NewGamevoid*pUser{PCTetrisApppMe=PCTetrisApppUser;setfillstyleBLACK;//选定黑色填充bar00GSCRN_WIDTH_CL*__LL_WIDTH-1GSCRN_HIGHT_CL*__LL_WIDTH-1;//将游戏区域清空ZeroMemoryareaGSCRN_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_NewBlockpMe;//生成新的方块}//获取控制命令函数staticAEEEventTRS_GetMsgPCTetrisApppMe{while1{//没有按键到了500ms以后自动下落一格pMe-m_dwNewTime=GetTickCount;//得到系统到现在所经过的毫秒数储存到newtime中ifpMe-m_dwNewTime-pMe-m_dwOldTime=550-50*pMe-m_iLever//如果时间过去500ms{pMe-m_dwOldTime=pMe-m_dwNewTime;returnEVT_DOWN;//返回下落按键}//有按键的话,返回对应的按键ifkbhit{switchgetch{casew:caseW:returnEVT_ROUND;casea:caseA:returnEVT_LEFT;cased:caseD:returnEVT_RIGHT;cases:caseS:returnEVT_DOWN;case:returnEVT_BOTTOM;case27:returnEVT_QUIT;}}}}/*staticvoidTRS_Discmdvoid*pUsercmdc{switchc{caseround:hround;break;caseleft:hleft;break;caseright:hright;break;casedown:hdown;break;casebottom:hbottom;break;casequit:break;}}*///把新方块信息传给旧方块并再生成新方块staticvoidTRS_NewBlockvoid*pUser{PCTetrisApppMe=PCTetrisApppUser;//新方块的数据传给旧方块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;drawblockcurblock;//调用画方块函数画方块curblock//在方块预览中画出下一个方块setfillstyleBLACK;barGSCRN_WIDTH_CL+2*__LL_WIDTH0GSCRN_WIDTH_CL+6*__LL_WIDTH-14*__LL_WIDTH-1;drawblocknextblock;oldtime=GetTickCount;//设置计时器}//画方块函数staticvoidTRS_DrawBlockvoid*pUserT_Tr__lockInfotCurBlckEDrawStyleeStyle{intb=gz_tBlockStyleTab[tCurBlck.m_iStyle].m_izStatus[tCurBlck.m_iStatID];//取出block中block.dir数组里面的值赋给bintixy;intcolor;switchd{//决定方块形状和状态对应的颜色caseshow:color=block[c.id].color;break;casehide:color=BLACK;break;}setfillstylecolor;//决定填充的颜色fori=0;i16;i++//控制循环一共十六次{ifb0x8000//让b和0x8000按位与,用来找出16个小方块中哪一些是1,哪一些是0{x=c.x+i%4;//值是1的小方块x轴的坐标y=c.y-i/4;//值是1的小方块y轴的坐标ifyGSCRN_HIGHT_CL{ifd!=hidebar3dx*__LL_WIDTH+2GSCRN_HIGHT_CL-y-1*__LL_WIDTH+2x+1*__LL_WIDTH-4GSCRN_HIGHT_CL-y*__LL_WIDTH-431;elsebarx*__LL_WIDTHGSCRN_HIGHT_CL-y-1*__LL_WIDTHx+1*__LL_WIDTH-1GSCRN_HIGHT_CL-y*__LL_WIDTH-1;}}b=1;}}//检测方块是否可以下落staticboolTRS_CheckBlockvoid*pUserblockinfoc{intb=block[c.id].dir[c.dir];//取出block中block.dir数组里面的值赋给bintixy;fori=0;i16;i++//控制循环一共十六次{ifb0x8000//让b和0x8000按位与,用来找出16个小方块中哪一些是1,哪一些是0{x=c.x+i%4;//值是1的小方块x轴的坐标y=c.y-i/4;//值是1的小方块y轴的坐标//如果小方块超出界限或者与下面相碰ifx0||x=GSCRN_WIDTH_CL||y0returnfalse;ifyGSCRN_HIGHT_CLarea[x][y]returnfalse;}b=1;}returntrue;}//旋转方块staticvoidTRS_HRoundvoid*pUser{blockinfoa=curblock;a.dir++;ifcheckblocka{drawblockcurblockhide;curblock.dir++;drawblockcurblockshow;}elsereturn;}//左移方块staticvoidTRS_HLeftvoid*pUser{blockinfoa=curblock;a.x--;ifcheckblocka{drawblockcurblockhide;curblock.x--;drawblockcurblockshow;}elsereturn;}//右移方块staticvoidTRS_HRightvoid*pUser{blockinfoa=curblock;a.x++;ifcheckblocka{drawblockcurblockhide;curblock.x++;drawblockcurblockshow;}elsereturn;}//下移方块staticvoidTRS_HDownvoid*pUser{blockinfoa=curblock;a.y--;ifcheckblocka{drawblockcurblockhide;curblock.y--;drawblockcurblockshow;}elsehbottom;}//沉底方块staticvoidTRS_HBottomvoid*pUser{//连续下移方块intij=0xy;drawblockcurblockhide;//去掉方块blockinfoa=curblock;a.y--;whilecheckblocka{curblock.y--;a.y--;}drawblockcurblockshow;//画出方块//固定方块在游戏区intb=block[curblock.id].dir[curblock.dir];fori=0;i16;i++{ifb0x8000{ifcurblock.y-i/4=GSCRN_HIGHT_CL{//如果方块的固定位置超出高度,结束游戏gameover;return;}elsearea[curblock.x+i%4][curblock.y-i/4]=1;//把小方块所占的位置赋值为1}b=1;}//检查是否需要消掉行introw
[4]={0};//定义一个数组用来判断是否需要消行fory=curblock.y;y=__xcurblock.y-30;y--//从当前方块所在的y轴开始检测四次{i=0;//计数变量赋值为0forx=0;xGSCRN_WIDTH_CL;x++//将x轴的数据从0开始检测直到GSCRN_WIDTH_CLifarea[x][y]==1//如果area[x][y]这个数组的值是1i++;//把i的值加1ifi==GSCRN_WIDTH_CL//如果i的值加到了GSCRN_WIDTH_CL,也就是说这一行的值全部是1,证明这一行被填满{score=score+10;lever=score/200+1;row[curblock.y-y]=1;//将需要消掉的行在数组里面的元素赋值为1I__GEimg;//保存图像的对象fori=0;i4;i++//循环四次判断4行里面有哪些行需要消掉{ifrow[i]{fory=curblock.y-i+1;yGSCRN_HIGHT_CL;y++forx=0;xGSCRN_WIDTH_CL;x++{area[x][y-1]=area[x][y];//将小方块的数据传给他下面的方块area[x][y]=0;//将小方块赋值为0}geti__geimg00GSCRN_WIDTH_CL*__LL_WIDTHGSCRN_HIGHT_CL-curblock.y-i+1*__LL_WIDTH;//得到没有消掉的行的图像puti__ge0__LL_WIDTHimg;//将这个图像坐标下移一个小方块的距离,也就是将整个图像下移__LL_WIDTH的距离}}}}newblock;}。