SDK下的俄罗斯方块程序分析 - VC编程.txt.doc_第1页
SDK下的俄罗斯方块程序分析 - VC编程.txt.doc_第2页
SDK下的俄罗斯方块程序分析 - VC编程.txt.doc_第3页
SDK下的俄罗斯方块程序分析 - VC编程.txt.doc_第4页
SDK下的俄罗斯方块程序分析 - VC编程.txt.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

正文 / ToyBricks.cpp : Defines the entry point for the application. / #include stdafx.h /*/ /* 文 件 名: ToyBricks.c * 完成时间: 2001年9月 * 完成地点: 华东地质学院综合楼507机房 * 开发模式: SDK程序 * 开发环境: MS VC+ 6.0 * 作 者: 毛建忠 * 工作单位: 中国建设银行三水市(广东省)支行 * E - Mail: Mao_ */ /* 备注: * 这是一个简单的俄罗斯方块游戏程序,写程序时没有注释, * 这是我写程序时的一个坏习惯。 正在装载数据 毕业有半年了,也就半年没有写 * 过程序,周末闲着没事,捡起那些旧程序看看,顺便加上一些注 * 释。很怀念在学校写程序的那段日子,很怀念。 */ /*/ #include #include #include #define CELL 15 / 【方格】的边长(pix) #define W 22 / 游戏区宽(22个【方格】边长) #define H 30 / 游戏区高(30个【方格】边长) #define MS_NEWBLOCK WM_USER+1 / 消息ID,产生新的【方块】 #define MS_DRAW WM_USER+2 LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM);/*窗口过程处理 int WINAPI WinMain ( HINSTANCE hInstance, /当前实例句柄 HINSTANCE hPrevInstance, /前一实例句柄 PSTR szCmdLine, /指向程序命令行参数的指针 int iCmdShow) /应用程序开始执行窗口时显示方式用int类型标志 static char AppName=ToyBrick;/定义一个静态字符数组保存字符串ToyBrick(机应用程序名) HWND hwnd; /定义一个窗口句柄 MSG msg; /定义一消息结构体变量 WNDCLASSEX wndclass; /定义一窗口类结构变量,包含窗口类全部信息 int iScreenWide; /定义屏幕显示宽度 wndclass.cbSize = sizeof(wndclass);/窗口类对象大小 wndclass.style = CS_HREDRAW|CS_VREDRAW;/窗口类对象风格 wndclass.lpfnWndProc = WndProc;/窗口处理函数为WndProc wndclass.cbClsExtra = 0; /窗口类无扩展 wndclass.cbWndExtra = 0;/窗口类实例没有扩展 wndclass.hInstance = hInstance;/当前实例句柄 wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);/窗口最小化图标为默认图标 wndclass.hCursor = LoadCursor (NULL,IDC_ARROW);/窗口当前光标为箭头光标 wndclass.hbrBackground = (HBRUSH)GetStockObject (BLACK_BRUSH);/获得当前背景设置为黑色 wndclass.lpszMenuName = NULL;/窗体菜单名为空 wndclass.lpszClassName = AppName;/应用程序名 wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);/为应用程序加载图标 if(!RegisterClassEx (&wndclass) return FALSE; /注册一个窗口类 / 获取显示器分辨率的X值iScreenWide,将程序窗口置于屏幕中央 iScreenWide=GetSystemMetrics (SM_CXFULLSCREEN); /创建窗口 hwnd =CreateWindow (AppName, 俄罗斯方块, WS_MINIMIZEBOX|WS_SYSMENU , iScreenWide/2-W*CELL/2, CELL, (W+1)*CELL-8, H*CELL, NULL, NULL, hInstance, NULL ); if(!hwnd) return FALSE; /没有获得窗口句柄,返回假 ShowWindow (hwnd,iCmdShow); /显示窗口 UpdateWindow (hwnd); /更新窗口 MessageBox(hwnd,开始游戏,开始,MB_OK);/显示Message SendMessage(hwnd,MS_NEWBLOCK,0,0);/向当前窗口发送消息 SetTimer (hwnd, 1, 550,NULL);/设置下落时间 while (GetMessage (&msg, NULL, 0, 0)/进入消息循环 TranslateMessage (&msg); DispatchMessage (&msg); return msg.wParam; / 函数DrawRact: 画【正方形】 / 参数: 设备环境句柄和【正方形】的四角坐标 void DrawRect (HDC hdc, int l, int t, int r, int b) MoveToEx (hdc, l, t, NULL); LineTo (hdc, r, t); LineTo (hdc, r, b); LineTo (hdc, l, b); LineTo (hdc, l,t); / 函数DrawCell: 画【方格】 / 参数: 设备环境句柄和【方格】的四角坐标 / 每个方格由内外两个【正方形】(DrawCell)画成,使其有立体感 void DrawCell (HDC hdc, int l, int t, int r, int b) DrawRect (hdc,l+1, t+1, r-1, b-1); DrawRect (hdc,l+3, t+3, r-3, b-3); / 函数DrawBlock: 画【方块】 / 参数: 设备环境句柄和【方块】中四个【方格】在游戏区域中的位置 / 每个【方块】由四个【方格】组成种不同的形状 void DrawBlock (HDC hdc, int block42) int i; HPEN hpen; hpen =CreatePen (PS_SOLID,1,RGB(255,255,255); SelectObject (hdc,hpen); for(i=0; i4; i+) DrawCell (hdc, (blocki0-1)*CELL, (blocki1-1)*CELL, /. blocki0*CELL, blocki1*CELL); DeleteObject (hpen); / 函数Cover: 清除原来位置的【方块】 / 参数: 设备环境句柄和待清除的【方块】 / 清除【方块】即在该【方块】的每个【方块】处画一个正方形的黑块 void Cover (HDC hdc, int org42) int i; SelectObject (hdc, (HBRUSH)GetStockObject (BLACK_BRUSH); for(i=0; i4; i+) Rectangle ( hdc, (orgi0-1)*CELL, (orgi1-1)*CELL, /. orgi0*CELL, orgi1*CELL); / 窗口过程函数WndProc LRESULT CALLBACK WndProc ( HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) int i,j,k,lines,r; static int top, sel, flag; static int cellsW+2H; / 控制游戏的【方格矩阵】 static int org42, block42; / 【方块】 HDC hdc; HPEN hpen; PAINTSTRUCT ps; switch (iMsg) case WM_CREATE: top=H-1; / 将第一列和最后一列【方格】置1,控制【方块】不超出游戏区域 for(i=0; iH; i+) cells0i=1; cellsW+1i=1; / 将最底下一行【方格】置1,控制【方块】不超出游戏区域 for(i=0; iW+2; i+) cellsiH-1=1; / 其他【方格】置0,游戏方块只能在这里移动 for(i=1; i=W; i+) for(j=0; jH-1; j+) cellsij=0; return 0; case MS_NEWBLOCK: flag=0; / flag表示【方块】旋转了几次 for(i=top; iH-1; i+) lines =0; / 循环语句检查是否有某一行全部被【方格】都填满 for(j=1; j=W+1; j+) if(! cellsji) lines=1; break; / 若该行被填满,则将上一行的填充状态复制到该行,依此类推 / 即从该行开始,所有的【方格】都下移一行 if(!lines) for(j=1;j=top; k-) cellsjk=cellsjk-1; top+; InvalidateRect (hwnd, NULL, TRUE); / 产生随机数,分别代表【方块】的种形状 srand( (unsigned)time( NULL ) ); sel =rand()%7; /【方块】形状初始化 /【方块】的形状由其每个【方格】的位置决定 / 游戏区宽W=22,block?0=9/10/11/12,block?1=0/1/2 / 这样【方块】初始位置在游戏区的最顶部的中央 switch(sel) case 0: / / org00=block00 =10; org01=block01 =0; org10=block10 =11; org11=block11 =0; org20=block20 =10; org21=block21 =1; org30=block30 =11; org31=block31 =1; break; case 1: / org00=block00 =9; org01=block01 =0; org10=block10 =10; org11=block11 =0; org20=block20 =11; org21=block21 =0; org30=block30 =12; org31=block31 =0; break; case 2: / / / org00=block00 =10; org01=block01 =0; org10=block10 =10; org11=block11 =1; org20=block20 =11; org21=block21 =1; org30=block30 =11; org31=block31 =2; break; case 3: / / / org00=block00 =11; org01=block01 =0; org10=block10 =11; org11=block11 =1; org20=block20 =10; org21=block21 =1; org30=block30 =10; org31=block31 =2; break; case 4: / / / org00=block00 =10; org01=block01 =0; org10=block10 =10; org11=block11 =1; org20=block20 =10; org21=block21 =2; org30=block30 =11; org31=block31 =2; break; case 5: / / / org00=block00 =10; org01=block01 =0; org10=block10 =10; org11=block11 =1; org20=block20 =10; org21=block21 =2; org30=block30 =9; org31=block31 =2; break; case 6: / / org00=block00 =10; org01=block01 =0; org10=block10 =9; org11=block11 =1; org20=block20 =10; org21=block21 =1; org30=block30 =11; org31=block31 =1; break; default: SendMessage (hwnd, MS_NEWBLOCK, 0, 0); break; return 0; case WM_TIMER: / 每个时间节拍【方块】自动下移一行 for(i=0; i4; i+) blocki1+; / 检查【方块】下移是否被档住,即判断下移后新位置是否有【方格】 for(i=0; i4; i+) if(cells blocki0 blocki1 ) for(i=0; iorg01-2) top=org01-2; if (top1) KillTimer (hwnd, 1); MessageBox (hwnd, 游戏结束,即将退出 !, 退出, MB_OK); PostQuitMessage (0); SendMessage (hwnd, MS_NEWBLOCK, 0, 0); return 0; SendMessage (hwnd, MS_DRAW, 0, 0); return 0; / 响应键盘控制 case WM_KEYDOWN: r=0; switch(int)wParam) case VK_LEFT: for(i=0; i4; i+) blocki0-; break; case VK_RIGHT: for(i=0; i4; i+) blocki0+; break; case VK_DOWN: for(i=0; i4; i+) blocki1+; break; / 按向上键,【方块】顺时针旋转 /【方块】的旋转不是真正的旋转,而是根据不同的【方块】形状和 / 该【方块】旋转过的次数来移动其中的一个或几个【方格】,从而 / 达到旋转的效果 这样做很复杂,算法不够理想,但是能够保持【方 / 块】旋转时的重心比较稳定。 case VK_UP: r=1; flag+; /【方块】旋转加 switch(sel) / sel代表当前【方块】的形状 case 0: break; case 1: flag =flag%2; for(i=0; i4; i+) blocki(flag+1)%2 =org2(flag+1)%2; blockiflag =org2flag-2+i; break; case 2: flag =flag%2; if(flag) block01 +=2; block30 -=2; else block01 -=2; block30 +=2; break; case 3: flag =flag%2; if(flag) block01 +=2; block30 +=2; else block01 -=2; block30 -=2; break; case 4: flag=flag%4; switch(flag) case 0: block20 +=2; block30 +=2; block21 +=1; block31 +=1; break; case 1: block20 +=1; block30 +=1; block21 -=2; block31 -=2; break; case 2: block20 -=2; block30 -=2; block21 -=1; block31 -=1; break; case 3: block20 -=1; block30 -=1; block21 +=2; block31 +=2; break; break; case 5: flag=flag%4; switch(flag) case 0: block20 +=1; block30 +=1; block21 +=2; block31 +=2; break; case 1: block20 +=2; block30 +=2; block21 -=1; block31 -=1; break; case 2: block20 -=1; block30 -=1; block21 -=2; block31 -=2; break; case 3: block20 -=2; block30 -=2; block21 +=1; block31 +=1; break; break; case 6: flag =flag%4; switch(flag) case 0: block00+; block01-; block10-; block11-; block30+; block31+; break; case 1: block10+; block11+; break; case 2: block00-; block01+; break; case 3: block30-; block31-; break; break; break; / 判断【方块】旋转后新位置是否有【方格】,若有,则旋转取消 for(i=0; i4; i+) if(cells blocki0 blocki1 ) if(r) flag +=3; for(i=0; i4; i+) for(j=0; j2; j+) blockij=orgij; return 0; SendMessage(hwnd, MS_DRAW, 0, 0); return 0; / 清除当前【方块】,并在新的位置重新绘制【方块】 case MS_DRAW: hdc =GetDC (hwnd); Cover (hdc, org); for(i=0; i4; i+) for(j=0; j2; j+) orgij=blockij; DrawBlock (hdc,block); ReleaseDC (hwnd, hdc)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论