版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、我设想的俄罗斯方块如下图: 我们先弹出一个窗口。首先,新建一个windows应用工程,如下图:然后删除工程里预写好的代码,添加如下代码:#include #include HWNDhwnd; /窗口句柄 LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);/声明回调函数char myClassName = myClass;int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterSti
2、l)MSG messages;WNDCLASSEX wincl;wincl.hInstance = hThisInstance;wincl.lpszClassName = myClassName;/窗口类名wincl.lpfnWndProc = WindowProcedure;/回调函数wincl.style = CS_DBLCLKS;wincl.cbSize = sizeof (WNDCLASSEX);wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
3、wincl.hCursor = LoadCursor (NULL, IDC_ARROW);wincl.lpszMenuName = NULL;wincl.cbClsExtra = 0;wincl.cbWndExtra = 0; wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;if (!RegisterClassEx (&wincl)/注册窗口类 return 0;hwnd = CreateWindowEx (0,myClassName,俄罗斯方块,WS_OVERLAPPEDWINDOW|WS_VISIBLE,CW_USEDEFAULT,/默认横坐
4、标CW_USEDEFAULT,/默认纵坐标430,615,/长宽 HWND_DESKTOP,NULL,hThisInstance,NULL);while (GetMessage (&messages, NULL, 0, 0)/进入消息循环 TranslateMessage(&messages);DispatchMessage(&messages);return messages.wParam;LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)switch (messag
5、e) case WM_DESTROY:PostQuitMessage (0);break;default:return DefWindowProc (hwnd, message, wParam, lParam);return 0; 然后再点击“编译并运行”按钮,弹出窗口:这样,我们的第一步,就算完成了,呵。以后的我们的所有代码都是在上边代码的基础上添加而成的。如图:上图是一种方块变形的四种情况,为表示以上所有的四的情况,我们需要建立一个三维数组:m_olshapePiece455=0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0
6、,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0;上边建立的三维数组应该不难理解吧,m_olshapePiece0xy就表示第一种形状,m_olshapePiece1xy表示第二种形状,m_olshapePiece2xy表示第三种形状,m_olshapePiece3xy表示第四种形状。我们按照同样的方法,把其它几种形状的矩阵弄好,并且把它们设为全局变量,如下:b
7、ool m_longPiece455=0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0;bool m_lshapePiece455=0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0
8、,0,0,0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0;bool m_olshapePiece455=0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1,
9、0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0;bool m_zshapePiece455=0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0;bool m_ozshape
10、Piece455=0,1,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0;bool m_squarePiece455=0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0
11、,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0;bool m_pshapePiece455=0,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0
12、,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0;接下来,让我们来看仔细看看我们游戏的布局:如上图所示,我们的游戏由五大块组成:一、按钮:这个就是完成一些特定功能的,比如开始、停止、暂停等等,第一个按钮在窗口上的坐标是(12,16)。二、BigMap:它是我们游戏的主要区域,它由二维数组BigMap1221来储存该格子是已有方块,BigMap由DrawBigMap()函数完成在窗口上的绘制。它在窗口上的坐标是(12,66)。三、CurPiece:它是当前正在掉落的方块,它由三维数组CurPiece455来储存,CupPiece是一个5*5
13、的二维平面,但因为它有4种变形,所以我们需要准备4个二维平面。CurPiece由DrawCurPiece()函数完成在窗口上的绘制。它在窗口上的坐标由变量xPos、yPos储存。四、NextPiece:它表示下一个要掉落的方块,它由三维数组NextPiece455来储存,由DrawNextPiece()函数完成在窗口上的绘制。它在窗口上的坐标是(277,66)。五、Score:它表示当前得分和游戏等级,由变量score和level储存(为了方便,我们还需要同时字符串scoreString20和levelString20储存),由DrawScore()函数完成在窗口上的绘制。它在窗口上的坐标分别
14、是(300,220)和(300,270)。或许你对上边的叙述还不太清楚,没关系,随着我们的继续,你会很快明白的。由以上部分可知,我们需要定义的全局变量有:boolBigMap1221;/BigMap boolCurPiece455;/CurPiece boolNextPiece455;/NextPiece intxPos,yPos;/表示当前下落方块在BigMap中的位置坐标 intscore;/储存分数 charscoreString20;/储存分数的字符串 intlevel;/储存过关数 charlevelString20;/储存过关数的字符串 我们需要定义的函数有:void DrawBi
15、gMap();/绘制BigMap void DrawCurMap();/绘制CurPiecevoid DrawNextMap();/绘制NextPiecevoid DrawScore();/绘制Score另外,我们还需要定义的其它全局变量有:HDChdc;/储存设备句柄 HPENhPen;/储存画笔句柄 HBRUSHhBrush;/储存笔刷句柄 intpm=25;/储存一个方块的大小 intdirection;/表示方块当前的方向前三个变量句于绘制。我们说过,正掉落的方块有四种变形,这里我们称之的方块的四种方向,我们用direction储存。pm表示游戏中最小格子的大小,也就是25像素,如下图
16、:我们还需要定义以下几个函数:void init();/初始化变量 void Begin();/按下开始开始按钮时,执行此函数 接下来,我们就开定义以上每个函数,首先是DrawBigMap()函数。BigMap是一个12*21的矩阵,其中有些是用来表示边界的,并不被绘制出来,如下图:其中的灰色部分是边界。其它是0的地方表示该格子没有方块,是1的地方表示该格子有方块,于是DrawBigMap()函数的定义如下:void DrawPiece(int x,int y)/在(x,y)绘制一个大小为pm(25像素)的方块SelectObject (hdc,GetStockObject (WHITE_PE
17、N);/选择白色画笔SelectObject (hdc,GetStockObject (BLACK_BRUSH);/选择黑色笔刷Rectangle(hdc,x,y,x+pm,y+pm);void DrawBigMap()/绘制BigMap SelectObject (hdc,GetStockObject (BLACK_PEN) ;/选择黑色画笔 SelectObject (hdc,GetStockObject (BLACK_BRUSH) ;/选择黑色笔刷 Rectangle(hdc,12,66,12+pm*10,66+pm*20);/先画BigMap黑色矩形背景for(int i=1;i11;
18、i+)for(int j=0;j20;j+)if(BigMapij) /如果该格子为1,则需要画一个方块DrawPiece(12+(i-1)*pm,66+j*pm);其中,函数DrawPiece()函数的功能是在(x,y)绘制一个大小为pm(25像素)的方块,在以后绘制DrawCurPiece()等函数时,我们还会用到它。接下来是DrawCurMap():void DrawCurMap()/绘制BigMap for(int i=0;i5;i+)for(int j=0;j5;j+)if(CurPiecedirectionij)/如果该格子为1,则需要画一个方块DrawPiece(12+(xPos
19、-1+i)*pm,66+(yPos+j)*pm);其中,全局变量direction表示此时方块处于哪种形状。然后是DrawNextMap():void DrawNextMap()/绘制NextMapSelectObject (hdc,GetStockObject (BLACK_PEN);/选择黑色画笔 SelectObject (hdc,GetStockObject (BLACK_BRUSH);/选择黑色画笔 Rectangle(hdc,277,66,277+pm*5,66+pm*5);/先画BigMap黑色矩形背景SelectObject (hdc,GetStockObject (WHITE
20、_PEN) ;for(int i=0;i5;i+)for(int j=0;j5;j+)if(NextPiece0ij!=0)/如果该格子为1,则需要画一个方块DrawPiece(277+pm*i,66+pm*j);再然后是DrawScore():void DrawScore()/绘制ScoreSetBkColor(hdc,RGB(200,200,200);/设置字体的背景色为灰色,以与窗口背景保持一致 TextOut(hdc,300,220,scoreString,strlen(scoreString);/输出分数 TextOut(hdc, 300, 270, levelString,strl
21、en(levelString);/输出过关数 再然后是init()函数:void init()/对BigMap进行初始化 for(int i=0;i12;i+)for(int j=0;j21;j+)if(i=0|i=11|j=20)BigMapij=1;elseBigMapij=0;/对变量初始化 direction=0;score=0;sprintf(scoreString,分数:%d ,score);level=0; sprintf(levelString,级别:%d ,level);xPos=4;yPos=-1;最后是Begin()函数,现在我们的Begin()只是初始化变量:void
22、Begin()init();好了,所有的函数都写好了,以下是全部的代码:#include #include HWNDhwnd; /窗口句柄 bool m_longPiece455=0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0;bool m_lsh
23、apePiece455=0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0;bool m_olshapePiece455=0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
24、,0,0,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0;bool m_zshapePiece455=0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0
25、,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0;bool m_ozshapePiece455=0,1,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0;bool m_squarePiece45
26、5=0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0;bool m_pshapePiece455=0,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,
27、1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0;boolBigMap1221;/BigMap boolCurPiece455;/CurPiece boolNextPiece455;/NextPiece intxPos,yPos;/表示当前下落方块在BigMap中的位置坐标 intscore;/储存分数 charscoreString20;/储存分数的字符串 intlevel;/储存过关数 char
28、levelString20;/储存过关数的字符串 HDChdc;/储存设备句柄 HPENhPen;/储存画笔句柄 HBRUSHhBrush;/储存笔刷句柄 intpm=25;/储存一个方块的大小 intdirection;/表示方块当前的方向LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);/声明回调函数void DrawBigMap();/绘制BigMap void DrawCurMap();/绘制CurPiecevoid DrawNextMap();/绘制NextPiecevoid DrawScore();/绘制Sc
29、orevoid init();/初始化变量 void Begin();/按下开始开始按钮时,执行此函数 char myClassName = myClass;int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil)MSG messages;WNDCLASSEX wincl;wincl.hInstance = hThisInstance;wincl.lpszClassName = myClassName;/窗口类名wincl.lpfnWndPro
30、c = WindowProcedure;/回调函数wincl.style = CS_DBLCLKS;wincl.cbSize = sizeof (WNDCLASSEX);wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);wincl.hCursor = LoadCursor (NULL, IDC_ARROW);wincl.lpszMenuName = NULL;wincl.cbClsExtra = 0;wincl.cbWndExtra = 0; wincl
31、.hbrBackground = (HBRUSH) COLOR_BACKGROUND;if (!RegisterClassEx (&wincl)/注册窗口类 return 0;init();/初始化变量hwnd = CreateWindowEx (0,myClassName,俄罗斯方块,WS_OVERLAPPEDWINDOW|WS_VISIBLE,CW_USEDEFAULT,/默认横坐标CW_USEDEFAULT,/默认纵坐标430,615,/长宽 HWND_DESKTOP,NULL,hThisInstance,NULL);while (GetMessage (&messages, NULL,
32、 0, 0)/进入消息循环 TranslateMessage(&messages);DispatchMessage(&messages);return messages.wParam;LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)switch (message)case WM_PAINT:/窗口刷新 DefWindowProc (hwnd, message, wParam, lParam);/先让windows默认的执行一下hdc= GetDC(hwnd) ;Dra
33、wBigMap();DrawNextMap();DrawCurMap();DrawScore(); ReleaseDC(hwnd, hdc) ;break;case WM_COMMAND: switch(wParam)case 0:/当开始被按下时,执行Begin()函数 Begin();break;SetFocus(hwnd);/把焦点归还给主窗口 break;case WM_CREATE:/创建开始按钮 CreateWindow( TEXT(button),开始,WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,9,13,75,40,hwnd,(HMENU)0,(
34、LPCREATESTRUCT) lParam)-hInstance,NULL);break; case WM_DESTROY:PostQuitMessage (0);break;default:return DefWindowProc (hwnd, message, wParam, lParam);return 0;void DrawPiece(int x,int y)/在(x,y)绘制一个大小为pm(25像素)的方块SelectObject (hdc,GetStockObject (WHITE_PEN);/选择白色画笔SelectObject (hdc,GetStockObject (BLA
35、CK_BRUSH);/选择黑色笔刷Rectangle(hdc,x,y,x+pm,y+pm);void DrawBigMap()/绘制BigMap SelectObject (hdc,GetStockObject (BLACK_PEN) ;/选择黑色画笔 SelectObject (hdc,GetStockObject (BLACK_BRUSH) ;/选择黑色笔刷 Rectangle(hdc,12,66,12+pm*10,66+pm*20);/先画BigMap黑色矩形背景for(int i=1;i11;i+)for(int j=0;j20;j+)if(BigMapij) /如果该格子为1,则需要
36、画一个方块DrawPiece(12+(i-1)*pm,66+j*pm);void DrawCurMap()/绘制BigMap for(int i=0;i5;i+)for(int j=0;j5;j+)if(CurPiecedirectionij)/如果该格子为1,则需要画一个方块DrawPiece(12+(xPos-1+i)*pm,66+(yPos+j)*pm);void DrawNextMap()/绘制NextMapSelectObject (hdc,GetStockObject (BLACK_PEN);/选择黑色画笔 SelectObject (hdc,GetStockObject (BLA
37、CK_BRUSH);/选择黑色画笔 Rectangle(hdc,277,66,277+pm*5,66+pm*5);/先画BigMap黑色矩形背景SelectObject (hdc,GetStockObject (WHITE_PEN) ;for(int i=0;i5;i+)for(int j=0;j5;j+)if(NextPiece0ij!=0)/如果该格子为1,则需要画一个方块DrawPiece(277+pm*i,66+pm*j);void DrawScore()/绘制ScoreSetBkColor(hdc,RGB(200,200,200);/设置字体的背景色为灰色,以与窗口背景保持一致 Te
38、xtOut(hdc,300,220,scoreString,strlen(scoreString);/输出分数 TextOut(hdc, 300, 270, levelString,strlen(levelString);/输出过关数 void init()/对BigMap进行初始化 for(int i=0;i12;i+)for(int j=0;j21;j+)if(i=0|i=11|j=20)BigMapij=1;elseBigMapij=0;/对变量初始化 direction=0;score=0;sprintf(scoreString,分数:%d ,score);level=0; sprin
39、tf(levelString,级别:%d ,level);xPos=4;yPos=-1;void Begin()init();编译运行一下,我们看到的窗口如下:我是这样设想游戏主流程的:1、首先设置一个定时器,每次定时到达时,我们就让CurPiece的坐标向下移一位,这样看起来就好像CurPiece正在掉落一样。2、每次CurPiece到达BigMap底部时,我们就把NextPiece的方块复制给CurPiece,然后再把CurPiece的坐标设置在BigMap的最顶端;同时,我们再随机产生一个新方块,并把新方块复制给NextPiece。这样看起来就好像NextPiece开始往下掉一样。那个判
40、断CurPiece是否到达BigMap底部的函数我们用CanDown()函数实现,那个复制的过程我们用CopePiece()函数实现,那个随机产生新方块并复制给NextPiece的过程,我们用NewPiece()函数实现。以下是三个函数的实现:bool CanDown()/判断CurPiece能否继续下落 yPos+;/假设CurPiece下落了 for(int i=0;i5;i+)for(int j=0;j5;j+)if(BigMapxPos+iyPos+j&CurPiecedirectionij)/当有重合的格子都为1时,不能表示表能下落了 yPos-;return false;yPos-
41、;return true;void CopePiece(bool a455,bool b455)/把a455复制给b455 for(int k=0;k4;k+)for(int i=0;i5;i+)for(int j=0;j5;j+)bkij=akij; void NewPiece()/随机产生新方块,并复制给NextPiece switch(rand()%7)/产生06的随机数case 0:CopePiece(m_longPiece,NextPiece);break;case 1:CopePiece(m_lshapePiece,NextPiece);break;case 2:CopePiece
42、(m_olshapePiece,NextPiece);break;case 3:CopePiece(m_zshapePiece,NextPiece);break;case 4:CopePiece(m_ozshapePiece,NextPiece);break;case 5:CopePiece(m_squarePiece,NextPiece);break;case 6:CopePiece(m_pshapePiece,NextPiece);break;CopePiece()和NewPiece()很简单,我们不用说了,我们下边来看下CanDown()是如何判断CurPiece能否继续下落的,看下图:
43、我们先让CurPiece下落一格。如图,当CurPiece和BigMap重合的格子没有都是1的时(图1),CurPiece可以继续往下掉;当CurPiece和BigMap有一个重合的格子都为1时(图2),则不能继续往下掉。这时,CanDown()就差不多应该能看懂了。这时,让我们来进一步完成我的游戏吧。当我们按下“开始”按钮时,我们希望我们游戏就开始了,于是,定时器就需要在Begin()函数里。另外之前做还要做一定的准备工作,比如要给NextPiece和CurPiece赋初值,不然它们会都是0噢:void Begin()init();NewPiece();/随机产生新方块,并复制给NextPi
44、eceCopePiece(NextPiece,CurPiece); /把NextPiece得制给CurPieceNewPiece();/随机产生新方块,并复制给NextPieceSetTimer(hwnd,11,1000,TimerProc);/定时器id为11,时间间隔为1000ms,时间回调函数是TimerProc()也就是说,每1000ms,我们就会执行一下TimerProc()。那么,TimerProc()是怎么样工作的呢?如下:VOID CALLBACK TimerProc (HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)/
45、定时器回调函数 if(CanDown()/如果能继续下落 yPos+;/则CurPiece下落(纵坐标加1 ) else /如果不能下落 CopePiece(NextPiece,CurPiece); /把NextPiece得制给CurPiecedirection=0;/形状方向初始化为0 xPos=4;/横坐标初始化为4 yPos=-1;/纵坐标初始化为-1 NewPiece();/随机产生新方块,并复制给NextPiece PostMessage(hwnd,WM_PAINT,0,0); /刷新窗口编译运行一下,然后按一下“开始”按钮,呵呵,效果怎么样:我们看到,CurPiece一格格的往下落
46、了,到达底部后,又重新返回到了顶端,并且变成了NextPiece。但我们印象中的俄罗斯方块好像不是这样的,我们更希望看到是,CurPiece在变成NextPiece的同时,老的CurPiece是应该留的BigMap底部的呀!那么老的CurPiece如何才能留在BigMap的底部呢?这个挽留的过程我们用FillBigMap()函数实现,它实际上只是把CurPiece的值填入BigMap而已:void FillBigMap()/将CurPiece填入BigMap for(int i=0;i然后我们把TimerProc()改成下边的样子:VOID CALLBACK TimerProc (HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)/定时器回调函数 if(CanDown()/如果能继续下落 yPos+;/则CurPiece下落(纵坐标加1 ) else /如果不能下落FillBigMap(); /将CurPiece填入BigMapCopePiece(NextPiece,CurPiece); /把NextPiece得制给CurPiecedirection=0;/形状方向初始化为0 xPos=4;/横坐标初始化为4 yPos=-1;/纵坐标初始化为
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 本部门安全生产举报制度
- 变压器维护保养培训课件
- 罕见病药物研发的周期压缩与效率提升
- 迪拜展览活动策划方案(3篇)
- 开年新春策划活动方案(3篇)
- 发动机快修培训课件模板
- 罕见病患者医保保障的普惠机制构建
- 2026兴业银行博士后科研工作站招收备考题库完整答案详解
- 2026广东深圳华润现代服务校园招聘备考题库及答案详解(考点梳理)
- 2026中国人寿保险股份有限公司博尔塔拉蒙古自治州分公司招聘21人备考题库(新疆)及答案详解(易错题)
- 大厦无偿划转协议书
- 复垦施工合同协议
- 2024年四川省考公务员考试结构化面试乡镇岗真题试题试卷答案解析
- 贸易公司组织架构与部门职责一览表
- 《电梯基本结构》课件
- 供水管道紧急抢修工程合同
- DL∕T 1993-2019 电气设备用六氟化硫气体回收、再生及再利用技术规范
- (正式版)HGT 20593-2024 钢制化工设备焊接与检验工程技术规范
- 肘关节恐怖三联征
- 刀模管理制度
- NB-T 47013.2-2015 承压设备无损检测 第2部分-射线检测
评论
0/150
提交评论