




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/=中华 制作=/=QQ讨论群: 104544511=/=头文件=#include#include#include /=初始化 地图=const int hang=20; /行为20行const int lie=10; /列为10列const int kuaiLenght=30; /每个矩形宽为30int xukuaihanglie=0; /存储落下的方块的 坐标int shikuaihanglie=0; /存储已经到底的方块的 坐标int NextKuai24=0; /下一个方块的 坐标int HANG=0; /存储 需要旋转的 行坐标int LIE=0; /存储 需要旋转的 列坐标int isADD=FALSE; /虚块是否到底了 到底了 就加到shikuai里面去int isOver=FALSE; /游戏是否结束int Count=0; /计分int dengji=0; /等级enum styleheng,zhe,fang,tu,xie; /虚块的几种样式enum directionDOWN,LEFT,RIGHT; /移动的几种方式style sty=zhe; /默认的一种样式direction dir=DOWN; /默认移动的一种方向style nextSty; /下一个方块的样式/=全局句柄=HDC hdc; /设备句柄 HWND hwnd; /窗口句柄HBRUSH newHbrush; /画刷句柄HBRUSH oldHbrush; /画刷句柄/=功能函数声明=/是否能转向int CantTurn();/初始化游戏void InitGame(); /ok/初始化 下落的方块void InitFangKuai();/创建 下落的方块void CreateFangKuai(); /ok/下一个方块void NextFangKuai();/方块的见底 PS: 把虚块的坐标 加到实块上void AddShiKuai(); /ok/方块的移动void Move(); /ok /方块的转向void Turn(); /ok 差一个 如果在最下面一行的时候 是否可以转型 /加速下落void AddMove(); /ok/削行void DeleteHang(); /ok/游戏overvoid GameOver();/如果虚块靠边了 旋转需要的坐标 重新赋值一下void UpdateZuoBiao();/画游戏界面void DrawGame();/=应用程序 主体函数=char className20=windowsMode; /图纸名称 LRESULT CALLBACK wndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam); /回调函数 PS:窗口过程函数int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) /应用程序入口 WNDCLASSEX wndClass;HWND hWnd;MSG msg;wndClass.cbClsExtra=0;wndClass.cbSize=sizeof(WNDCLASSEX);wndClass.cbWndExtra=0;wndClass.hbrBackground=(HBRUSH)COLOR_WINDOW;wndClass.hCursor=NULL;wndClass.hIcon=NULL;wndClass.hIconSm=NULL;wndClass.hInstance=hInstance;wndClass.lpfnWndProc=wndProc;wndClass.lpszClassName=className;wndClass.lpszMenuName=NULL;wndClass.style=CS_VREDRAW|CS_HREDRAW;RegisterClassEx(&wndClass);hWnd=CreateWindow(className,新窗口,WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU,400,100,450,600,NULL,NULL,hInstance,NULL);hwnd=hWnd;if(!hWnd)MessageBox(hWnd,创建窗口失败!,提示,MB_OK);elseShowWindow(hWnd,nShowCmd);/=游戏初始化区域=InitGame();/=消息循环=UpdateWindow(hWnd);while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&msg);return 0;LRESULT CALLBACK wndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)switch(message)case WM_DESTROY:PostQuitMessage(0);break;case WM_KEYDOWN:switch(wParam)case VK_RETURN: /游戏开始SetTimer(hWnd,1,300,NULL);break;case VK_SPACE: /旋转方块UpdateZuoBiao();Turn();break;case VK_LEFT: /向左平移方块dir=LEFT;break;case VK_RIGHT: /向右平移方块dir=RIGHT;break;case VK_DOWN: /加速下落AddMove();break;case P: /暂停游戏KillTimer(hWnd,1);break;break;case WM_TIMER:Move(); DeleteHang();GameOver();DrawGame();break;return DefWindowProc(hWnd,message,wParam,lParam);/=函数体=/=初始化游戏=void InitGame()int h=0,l=0;/画 游戏的方块的 界面hdc=GetDC(hwnd); Rectangle(hdc,0,0,300,600);ReleaseDC(hwnd,hdc);/画 游戏的分数 等级 下一个出现的图形hdc=GetDC(hwnd);SetTextColor(hdc,RGB(1,7,135); /将字体设置为蓝色CString strScore; strScore.Format(TEXT(%d), Count); /分数赋值给字符串LPCTSTR psScore = LPCTSTR(strScore); /将字符串指针转化成LPCTSTR类型TextOut(hdc,347,75,等 级,10);ReleaseDC(hwnd,hdc);hdc=GetDC(hwnd);SetTextColor(hdc,RGB(1,7,135); /将字体设置为蓝色TextOut(hdc,347,175,分 数,10);ReleaseDC(hwnd,hdc);hdc=GetDC(hwnd);SetTextColor(hdc,RGB(1,7,135); /将字体设置为蓝色TextOut(hdc,347,255,下 个,10);TextOut(hdc,347,275,图 型,10);ReleaseDC(hwnd,hdc);/生成 实块部分 虚块部分 下一个要出现的虚块部分for(h=0;hhang;h+) /将实块设置为0for(l=0;llie;l+)shikuaihl=0;InitFangKuai(); /创建一个虚块NextFangKuai(); /创建下一个虚块/初始化 下落的方块void InitFangKuai()int h=0;int l=0;srand(unsigned)time(NULL);for(h=0;hhang;h+) /将方块 全部初始化为0for(l=0;l=0;h-) /将虚块的坐标 赋值给 实块 for(l=lie-1;l=0;l-)if(1=xukuaihl)shikuaihl=1;isADD=FALSE;CreateFangKuai(); /创建一个虚块NextFangKuai(); /创建下一个需要显示的虚块/方块的移动void Move()int h=0;int l=0;int isStop=FALSE; /是否停止移动switch(dir)case DOWN:for(h=hang-1;h=0;h-) /从后向前遍历for(l=lie-1;l=0;l-)if( 1 = xukuaihl ) if(shikuaih+1l=1) /如果发现虚块下一个为 实块 就退出 然后 将虚块的坐标 存储到实块中isStop=TRUE; /停止移动 isADD=TRUE; /要新弄一个虚块了break; /退出遍历if(TRUE=isStop) break;if(FALSE=isStop) /如果虚块的下一个不是实块 那么 检查 虚块 是不是到最后一行了 如果到最后一行了 /如果到最后一行了 就将虚块的坐标 放到实块中int x=0;for(x=0;x=0;h-)for(l=lie-1;l=0;l-)if( 1 = xukuaihl )xukuaihl=0;xukuaih+1l=1;if(FALSE=isStop) /如果下移了 那么记录翻转的坐标 下移HANG+;break;case LEFT:for(l=0;l=0;h-)if(1=xukuaihl)if(l=0) /如果碰到边了 那么 就不能在向左移动了isStop=TRUE;break;if(shikuaihl-1=1) /如果左边有实块了 那么 就不能向左边移动了isStop=TRUE;break;if(TRUE=isStop)break;if(FALSE=isStop) /如果虚块不在第一列 并且 他的左边没有实块 那么 就往左挪一列for(l=0;l=0;h-)if(1=xukuaihl)xukuaihl=0;xukuaihl-1=1;if(FALSE=isStop) /如果左移了 那么记录翻转的坐标 左移LIE-;break;case RIGHT:for(l=lie-1;l=0;l-) /从第最后列开始遍历 如果 虚块在最后一列 那么 就退出 /如果虚块 的右边有一个实块 那么就退出for(h=hang-1;h=0;h-)if(1=xukuaihl)if(l=(lie-1) /如果碰到边了 就不能继续移动了isStop=TRUE; break;if(shikuaihl+1=1) /如果右边有实块了 那么就不能动了isStop=TRUE;break;if(TRUE=isStop)break;if(FALSE=isStop) /如果虚块不在最后一列 并且 他的右边没有实块 那么 就往右挪一列for(l=lie-1;l=0;l-)for(h=hang-1;h=0;h-)if(1=xukuaihl)xukuaihl=0;xukuaihl+1=1;if(FALSE=isStop) /如果右移了 那么记录翻转的坐标 右移LIE+;break;if(TRUE=isADD) /如果下一行 是最后一列 或者 下一行 有实块 或者 到边界了 或者 不能继续左右移动了 /那么 就调用AddShiKuai()函数 从新创建一个虚块 并且把原来的虚块 放到实块里AddShiKuai();dir=DOWN; /并且把移动方向 重新设置为向下/加速下落void AddMove()int h;int l;int NotGo=FALSE; /是否能继续向下了for(h=hang-1;h=0;h-) /发现的beg 已经解决 /beg : 如果 在虚块到达实块的上一个行 旋转虚块 虚块和实块 就重合了for(l=lie-1;l=0;l-) /解决方法 判断 虚块是否在实块的上一行 如果在上一行 旋转 让他无效 if(1=xukuaihl)if(shikuaih+1l=1) /如果下一个是实块 那么 就停止继续下落NotGo=TRUE;break;else if(h=18) /如果下一行是底 那么 就停止继续下落NotGo=TRUE;break;if(TRUE=NotGo)break;if(FALSE=NotGo)int stop=FALSE; /如果下一个行 是方块 或者是底 那么就停 stop=TRUEwhile(!stop) /循环 让他一直往下走 知道 遇到实块 或者 到底了 for(h=hang-1;h=0;h-) /从后向前遍历 for(l=lie-1;l=0;l-)if(xukuaihl=1)xukuaihl=0;xukuaih+1l=1;int i=0;int j=0;for(i=hang-1;i=0;i-) /从后向前遍历 for(j=lie-1;j=0;j-)if(xukuaiij=1) if(shikuaii+1j=1) /如果 他的下一行是1 那么 就停stop=TRUE;break;if(TRUE=stop)break;if(FALSE=stop) /如果上一个条件没有成立 那么 就等他到底得时候再停吧for(i=hang-1;i=0;i-)for(j=lie-1;j=0;j-)if(xukuaiij=1)if(i=18)stop=TRUE;break;if(TRUE=stop)break;/削行void DeleteHang()int h=0;int l=0;int isDelete=FALSE;do /先执行一次isDelete=FALSE;int shu=0; /存储一行中有几个实块for(h=hang-1;h=0;h-) /从后向前 循环shu=0; /每遍历完一行 就从新赋0for(l=lie-1;l=0;l-)if(TRUE=isDelete) /如果有需要删除的行 就将之后出现的每一个实块 向下移动一行if(shikuaihl=1) shikuaihl=0;shikuaih+1l=1;else /如果灭有需要删除的行 那么 就继续往下遍历 继续计算每行 有几个实块if(shikuaihl=1)shu+;if(shu=10) /如果发现有一行 有10个实块了 那么就意味着 这行需要削掉 /就意味着这行 全部变成0 然后 将上面的实块 向下移for(int x=0;x10;x+)shikuaihx=0;isDelete=TRUE; /判断是否继续循环 也告诉上面 需要将 以后出现的每一个实块 向下移动一行Count+; /计分器加1 while (isDelete=TRUE); /如果已经削完一行了 那就继续循环 然后没有需要削的行数了 那么 就退出循环/游戏overvoid GameOver()for(int x=0;x10;x+)if(shikuai0x=1) /实块到达最上面一行了 就GameOverisOver=TRUE;break;/如果虚块靠边了 旋转需要的坐标 重新赋值一下void UpdateZuoBiao()int H;int L;int isUpdate=FALSE; /判断是否靠边了int fangfa=0;for(H=0;Hhang;H+) /遍历第一列 看是否有虚块if(xukuaiH0=1)isUpdate=TRUE;fangfa=1; /左边靠上了break;for(H=0;Hhang;H+) /遍历最后一列 看是否有虚块if(xukuaiH19=1)isUpdate=TRUE;fangfa=2; /右边靠上了break;if(TRUE=isUpdate) /如果有虚块靠边了int stop=FALSE; /判断是否停止switch(fangfa)case 1: /左边靠上了for(H=0;Hhang;H+)for(L=0;Llie;L+)if(1=xukuaiHL) /找到最上面的虚块 将他的横坐标 赋给 HANG 留着旋转的时候用 将纵坐标赋值为0 HANG=H;LIE=0;stop=TRUE; /退出循环break;if(TRUE=stop)break;break;case 2: /右边靠上了 stop=FALSE;switch(sty)case zhe:case xie:case tu:for(H=0;Hhang;H+) /找到最上面的虚块 将他的横坐标 赋给 HANG 留着旋转的时候用 将纵坐标赋值为7 /因为 zhe xie tu 都是 用3*3 矩阵翻转的 所以 纵坐标值为7for(L=0;Llie;L+)if(1=xukuaiHL)HANG=H;LIE=7;stop=TRUE;break;if(TRUE = stop)break;break;case heng:for(H=0;H=0;L-) /因为 heng 都是 用4*4 矩阵翻转的 所以 纵坐标值为6if(1=xukuaiHL)HANG=H;LIE=6;stop=TRUE;break;if(TRUE = stop)break;break;break;/方块的转向void Turn()switch(sty)case fang:break;case zhe:case tu:case xie:int Not=FALSE; /判断是否能转向 /PS : 比如如果方块转向 那么 将覆盖 shikuai占用的坐标 这是beg 解决方法如下int tempAhanglie=0; /弄一个临时的 虚块数组 这个数组 和虚块一摸一样 用这个数组 先Ture一下 试试 检验一下 翻转完和实块 是否重复for(int x=0;xhang;x+) /将虚块中的每一个数 赋给这个临时虚块for(int y=0;ylie;y+)tempAxy=xukuaixy;int temp33=0; /临时虚块翻转int h;int l;int H;int L;for(h=0,H=HANG;h3;h+,H+)for(l=0,L=LIE;l3;l+,L+)if(xukuaiHL=1)temphl=1;tempAHL=0;for(h=0,H=HANG;h3;h+,H+) /翻转完成for(l=0,L=LIE;l3;l+,L+)tempAHL=temp2-lh; for(int x=0;xhang;x+) /检验 临时虚块 和实块 是否有重合的坐标 如果有 就直接退出了 也就是说 这个Turn()函数不好使了for(int y=0;ylie;y+)if(tempAxy=1)if(shikuaixy=1)Not=TRUE;break;if(x=18) /如果到了最底下的那一行 也不能翻转Not=TRUE;break;if(TRUE=Not)break;if(TRUE=Not) /如果有重合 或者 虚块到达了 最后一行 就直接退出了 翻转无效break;else /如果没有 重合 或者 虚块没有到达了最后一行 就将虚块翻转一下int temp33=0; /声明3*3数组int h;int l;int H;int L;for(h=0,H=HANG;h3;h+,H+)for(l=0,L=LIE;l3;l+,L+)if(xukuaiHL=1)temphl=1;xukuaiHL=0;for(h=0,H=HANG;h3;h+,H+)for(l=0,L=LIE;l3;l+,L+)xukuaiHL=temp2-lh;break;case heng: /方法同上 只不过 声明临时数组的时候 声明4*4 数组 int Not=FALSE;int tempAhanglie=0;for(int x=0;xhang;x+)for(int y=0;ylie;y+)tempAxy=xukuaixy;int temp44=0;int h;int l;int H;int L;for(h=0,H=HANG;h4;h+,H+)for(l=0,L=LIE;l4;l+,L+)if(xukuaiHL=1)temphl=1;tempAHL=0;for(h=0,H=HANG;h4;h+,H+)for(l=0,L=LIE;l4;l+,L+)tempAHL=temp3-lh;for(int x=0;xhang;x+)for(int y=0;ylie;y+)if(tempAxy=1)if(shikuaixy=1)Not=TRUE;break;if(TRUE=Not)break;if(TRUE=Not)break;elseint temp44=0;int H;int L;int h;int l;for(h=0,H=HANG;h4;h+,H+)for(l=0,L=LIE;l4;l+,L+)if(xukuaiHL=1)temphl=1;xukuaiHL=0;for(h=0,H=HANG;h4;H+,h+)for(l=0,L=LIE;ldengji)dengji+; /等级加一KillTimer(hwnd,1); /停止当前的计时器SetTimer(hwnd,1,300-dengji*20,NULL); /新开一个新的计时器ReleaseDC(hwnd,hdc);/显示分数hdc=GetDC(hwnd);SetTextColor(hdc,RGB(1,7,135); /将字体设置为蓝色TextOut(hdc,347,175,分 数,10);/刷新分数SetTextColor(hdc,RGB(249,15,12); strScore.Format(TEXT(%d), Count*23); /
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 通信劳务合同
- 酮症酸中毒护理试题及答案
- 2024食品生产企业食品安全管理人员知识考试题库附答案
- 毕业论文结语导游专业
- 毕业论文工作进度表
- 2025年度酒店客房租赁协议
- 2024年急诊医学科院感试题(附答案)
- 写毕业论文会计专业
- 2025年统计学期末考试题库:统计数据可视化在流行病学数据分析中的应用试题(含答案)
- 保险专业毕业论文参考
- 米线加工坊管理制度
- 文化长廊、荣誉墙施工方案(技术方案)
- (新版)职业健康综合知识竞赛题库附答案
- 【人教部编版语文五年级下册】全册课内阅读(附答案)共计30篇
- 自动喷水灭火系统调试记录
- 更换双电源更换施工方案
- 煤化工气化工艺系统知识课件
- Android移动应用开发教程(微课版) 课件 单元一 开发第一个Android程序
- 防煤矿冲击地压培训教案
- 创业指导师(二级)理论考试题库附答案
- 空调器喷涂工艺规范
评论
0/150
提交评论