俄罗斯方块程序(共13页)_第1页
俄罗斯方块程序(共13页)_第2页
俄罗斯方块程序(共13页)_第3页
俄罗斯方块程序(共13页)_第4页
俄罗斯方块程序(共13页)_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

1、#include #include #include #define CELL 20#define ROWS 25#define COLS 15/升级(shng j)所需分数值#define SCORE_LEVEL_INC 80#define ID_TIMER 1/全局变量/HWND hwnd; /保存(bocn)窗口句柄int score=0; /分数(fnsh)int level=0; /级数int interval_unit=25; /随级数递增的时间间隔增量int interval_base=300; /时间间隔基量int old_interval; /保存当前的时间间隔,用于加速操作

2、int cur_left,cur_top; /记录方块当前的位置int width_block,height_block; /方块的宽带和高度bool isPause=false; /暂停标识UINT timer_id=0; /保存计时器IDstatic byte *block=NULL; /方块,方块为随机大小,采用动态分配内存方式,所以这里是指针变量byte g_panelROWSCOLS=0;/LRESULT CALLBACK WndProc ( HWND,UINT,WPARAM,LPARAM );void DrawPanel ( HDC hdc ); /绘制表格void Refresh

3、Panel ( HDC hdc ); /刷新面板void DoDownShift ( HDC hdc ); /下移void DoLeftShift ( HDC hdc ); /左移void DoRightShift ( HDC hdc ); /右移void DoAccelerate ( HDC hdc ); /加速void DoRedirection ( HDC hdc ); /改变方向void ClearRow ( HDC hdc ); /消行bool ExportBlock(); /输出方块,/该函数会直接修改全局变量block,width_block,height_block,/cur_

4、left和cur_topbool IsTouchBottom ( HDC hdc ); /判断是否(sh fu)到达底部int main()HINSTANCE hInstance=GetModuleHandle ( NULL );TCHAR szAppName=TEXT ( teris );MSG msg;WNDCLASS wc;wc.style=CS_HREDRAW|CS_VREDRAW;wc.lpfnWndProc=WndProc;wc.cbClsExtra=0;wc.cbWndExtra=0;wc.hInstance=hInstance;wc.hIcon=LoadIcon ( NULL,

5、IDI_APPLICATION );wc.hCursor=LoadCursor ( NULL,IDC_ARROW );wc.hbrBackground= ( HBRUSH ) GetStockObject ( WHITE_BRUSH );wc.lpszMenuName=NULL;wc.lpszClassName=szAppName;if ( !RegisterClass ( &wc ) )printf ( RegisterClass occur errors! );return 0;hwnd=CreateWindow ( szAppName,TEXT ( Teris Demo ),WS_OVE

6、RLAPPEDWINDOW,0,0,0,0,NULL,NULL,hInstance,NULL );ShowWindow ( hwnd,SW_SHOW );UpdateWindow ( hwnd );while ( GetMessage ( &msg,NULL,0,0 ) )TranslateMessage ( &msg );DispatchMessage ( &msg );return msg.wParam;void DrawPanel ( HDC hdc ) /绘制(huzh)游戏面板int x,y;RECT rect;for ( y=0; yROWS; y+ )for ( x=0; xCO

7、LS; x+ )/计算方块(fn kui)的边框范围rect.top=y*CELL+1;rect.bottom= ( y+1 ) *CELL-1;rect.left=x*CELL+1;rect.right= ( x+1 ) *CELL-1;FrameRect ( hdc,&rect, ( HBRUSH ) GetStockObject ( BLACK_BRUSH ) );void DoDownShift ( HDC hdc ) /下移if ( NULL=block ) return;/判断(pndun)是否到达底部if ( IsTouchBottom ( hdc ) ) /到底部/消行处理(c

8、hl)ClearRow ( hdc );ExportBlock(); /输出下一个(y )方块cur_top+;RefreshPanel ( hdc );void DoLeftShift ( HDC hdc ) /左移int x,y;if ( NULL=block ) return;if ( 0=cur_left ) return;if ( cur_top0 ) return; /方块没有完整显示前,不能左移for ( y=0; yheight_block; y+ )for ( x=0; xwidth_block; x+ ) /从左边开始扫描,获取该行最左边的实心方格块if ( * ( blo

9、ck+y*width_block+x ) )/判断当前方格在面板上面左边一个方格是否为实心,是就代表不能再左移if ( g_panelcur_top+ycur_left+x-1 ) return;break; /只判断最左边的一个实心方格,之后直接扫描下一行cur_left-;RefreshPanel ( hdc );void DoRightShift ( HDC hdc ) /右移(yu y)int x,y;if ( NULL=block ) return;if ( COLS-width_block=cur_left ) return;if ( cur_top0 ) return; /方块(

10、fn kui)完整显示前不能右移for ( y=0; y=0; x- ) /从右边(yu bian)开始扫描,获取该行最右边的实心方格块if ( * ( block+y*width_block+x ) )/判断当前方格在面板上右边一个方格是否为实心,是就代表不能再右移if ( g_panelcur_top+ycur_left+x+1 ) return;break; /只判断最右边的一个实心方格cur_left+;RefreshPanel ( hdc );void DoRedirection ( HDC hdc ) /改变方向int i,j;byte * temp=NULL;if ( NULL=

11、block ) return;if ( cur_top0 ) return; /方块完整显示前不能转向temp= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );for ( i=0; iwidth_block; i+ )for ( j=0; j=ROWS|temp_cur_left=COLS )free ( temp ); /退出前必须先释放内存return;for ( i=0; imax_len; i+ )for ( j=0; jmax_len; j+ )/转向所需的空间内有已被占用的实心方格存在,即转向失败if

12、 ( g_paneltemp_cur_top+itemp_cur_left+j )free ( temp ); /退出前必须先释放内存return;/把临时变量的值赋给block,只能赋值,而不能赋指针值for ( i=0; iheight_block; i+ )for ( j=0; jwidth_block; j+ )/blockij=tempij;( block+i*width_block+j ) =* ( temp+i*width_block+j );/全局变量重新被赋值cur_top=temp_cur_top;cur_left=temp_cur_left;/交换i=width_bloc

13、k;width_block=height_block;height_block=i;free ( temp ); /释放为临时变量分配(fnpi)的内存RefreshPanel ( hdc );void DoAccelerate ( HDC hdc ) /加速(ji s)if ( NULL=block ) return;if ( IsTouchBottom ( hdc ) )/消行处理(chl)ClearRow ( hdc );ExportBlock();cur_top+;RefreshPanel ( hdc );bool IsTouchBottom ( HDC hdc )int x,y;in

14、t i,j;if ( NULL=block ) return false;if ( ROWS=cur_top+height_block )/固定方块for ( i=0; iheight_block; i+ )for ( j=0; j=0; y- ) /从底行开始扫描/判断第一个实心方块在面板上邻接的下方方格是否为实心,是就代表已经到达底部for ( x=0; xwidth_block; x+ )if ( * ( block+y*width_block+x ) )if ( cur_top+y+10 ) return false;if ( g_panelcur_top+y+1cur_left+x

15、)/判断(pndun)是否gameoverif ( cur_top=0 )if ( timer_id )KillTimer ( hwnd,ID_TIMER );timer_id=0;MessageBox ( hwnd,TEXT ( 游戏(yux)结束 ),TEXT ( MSG ),MB_OK|MB_ICONEXCLAMATION );SendMessage ( hwnd,WM_CLOSE,0,0 );/固定(gdng)方块for ( i=0; iheight_block; i+ )for ( j=0; j=0; i- )isFilled=true;for ( j=0; jCOLS; j+ )i

16、f ( !g_panelij )isFilled=false;break;if ( isFilled )for ( j=0; j=0; k- )for ( j=0; j=10*SCORE_LEVEL_INC-1 ) return;/加分规则(guz):消除行数,1行加10分,2行加15分,3行加20分,4行加30分switch ( count )case 1:score+=10;break;case 2:score+=15;break;case 3:score+=20;break;case 4:score+=30;break;int temp_level=score/SCORE_LEVEL_I

17、NC;if ( temp_levellevel )level=temp_level;/撤销当前计时器,然后重设if ( timer_id ) KillTimer ( hwnd,ID_TIMER );timer_id=SetTimer ( hwnd,ID_TIMER,interval_base-level*interval_unit,NULL );system ( cls );printf ( score: %d, level: %d ,score,level );void RefreshPanel ( HDC hdc ) /刷新(shu xn)面板int x,y;RECT rect;HBRUS

18、H h_bSolid= ( HBRUSH ) GetStockObject ( GRAY_BRUSH ),h_bEmpty= ( HBRUSH ) GetStockObject ( WHITE_BRUSH );if ( NULL=block ) return;/先刷屏for ( y=0; yROWS; y+ )for ( x=0; xCOLS; x+ )/为避免(bmin)刷掉方块的边框,rect范围(fnwi)必须比边框范围小1rect.top=y*CELL+2;rect.bottom= ( y+1 ) *CELL-2;rect.left=x*CELL+2;rect.right= ( x+1

19、 ) *CELL-2;if ( g_panelyx )FillRect ( hdc,&rect,h_bSolid );elseFillRect ( hdc,&rect,h_bEmpty );/再定位方块for ( y=0; yheight_block; y+ )for ( x=0; xwidth_block; x+ )if ( * ( block+y*width_block+x ) ) /实心rect.top= ( y+cur_top ) *CELL+2;rect.bottom= ( y+cur_top+1 ) *CELL-2;rect.left= ( x+cur_left ) *CELL+2

20、;rect.right= ( x+cur_left+1 ) *CELL-2;FillRect ( hdc,&rect,h_bSolid );bool ExportBlock() /输出方块int sel;if ( block )free ( block ); /释放之前分配的内存block=NULL;sel=rand() %7;switch ( sel )case 0: /水平(shupng)条width_block=4;height_block=1;block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );(

21、 block+0 ) =1; /可以(ky)理解为*(block+0*width_block+0)=1,即第一行的第一个方格(fn ),下面同理( block+1 ) =1; /*(block+0*width_block+1)=1( block+2 ) =1; /*(block+0*width_block+2)=1( block+3 ) =1; /*(block+0*width_block+3)=1cur_top=0-height_block;cur_left= ( COLS-width_block ) /2;break;case 1: /三角width_block=3;height_bloc

22、k=2;block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );( block+0 ) =0; /可以理解为*(block+0*width_block+0)=0,即第一行的第一个方格,下面同理( block+1 ) =1; /*(block+0*width_block+1)=1( block+2 ) =0; /*(block+0*width_block+2)=0( block+3 ) =1; /*(block+1*width_block+0)=1,第二行开始( block+4 ) =1; /*(block+1

23、*width_block+1)=1( block+5 ) =1; /*(block+1*width_block+2)=1cur_top=0-height_block;cur_left= ( COLS-width_block ) /2;break;case 2: /左横折width_block=3;height_block=2;block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );( block+0 ) =1; /可以理解为*(block+0*width_block+0)=1,下面同理( block+1 )

24、=0; /*(block+0*width_block+1)=0( block+2 ) =0; /*(block+0*width_block+2)=0( block+3 ) =1; /*(block+1*width_block+0)=1( block+4 ) =1; /*(block+1*width_block+1)=1( block+5 ) =1; /*(block+1*width_block+2)=1cur_top=0-height_block;cur_left= ( COLS-width_block ) /2;break;case 3: /右横折(hn sh)width_block=3;h

25、eight_block=2;block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );( block+0 ) =0; /可以(ky)理解为*(block+0*width_block+0)=0,下面(xi mian)同理( block+1 ) =0; /*(block+0*width_block+1)=0( block+2 ) =1; /*(block+0*width_block+2)=1( block+3 ) =1; /*(block+1*width_block+0)=1( block+4 ) =1; /*(b

26、lock+1*width_block+1)=1( block+5 ) =1; /*(block+1*width_block+2)=1cur_top=0-height_block;cur_left= ( COLS-width_block ) /2;break;case 4: /左闪电width_block=3;height_block=2;block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );( block+0 ) =1; /可以理解为*(block+0*width_block+0)=1,下面同理( bloc

27、k+1 ) =1; /*(block+0*width_block+1)=1( block+2 ) =0; /*(block+0*width_block+2)=0( block+3 ) =0; /*(block+1*width_block+0)=0( block+4 ) =1; /*(block+1*width_block+1)=1( block+5 ) =1; /*(block+1*width_block+2)=1cur_top=0-height_block;cur_left= ( COLS-width_block ) /2;break;case 5: /右闪电width_block=3;he

28、ight_block=2;block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );( block+0 ) =0; /可以理解为*(block+0*width_block+0)=0,下面同理( block+1 ) =1; /*(block+0*width_block+1)=1( block+2 ) =1; /*(block+0*width_block+2)=1( block+3 ) =1; /*(block+1*width_block+0)=1( block+4 ) =1; /*(block+1*width_b

29、lock+1)=1( block+5 ) =0; /*(block+1*width_block+2)=0cur_top=0-height_block;cur_left= ( COLS-width_block ) /2;break;case 6: /石头(sh tou)width_block=2;height_block=2;block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );( block+0 ) =1; /可以(ky)理解为*(block+0*width_block+0)=1,下面(xi mian)同理

30、( block+1 ) =1; /*(block+0*width_block+1)=1( block+2 ) =1; /*(block+1*width_block+0)=1( block+3 ) =1; /*(block+1*width_block+1)=1cur_top=0-height_block;cur_left= ( COLS-width_block ) /2;break;return block!=NULL;LRESULT CALLBACK WndProc ( HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam )HDC hdc;PAINTSTRUCT ps;/TCHAR szBuffer1024;switch ( message )case WM_CREATE:MoveWindow ( hwnd,400,10,CELL*COLS+8,CELL*ROWS+32,FALSE ); /补齐宽度和高度srand ( time ( NULL ) );ExportBlock();timer_id=SetTimer ( hwnd,ID_TIMER,interval_base-level*interval_unit,NULL );return 0;case WM_TIMER:hdc=Get

温馨提示

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

评论

0/150

提交评论