版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生物材料增强肌腱再生组织力学强度的策略
- 生物材料临床应用中的个体化治疗策略探讨
- 生物制品稳定性试验与质量风险管理结合
- 生物制品实时稳定性试验数据管理规范
- 生物制剂失应答后IBD的特殊人群用药策略
- 建筑行业结构工程师面试问题集及答案
- 深度解析(2026)《GBT 19668.2-2017信息技术服务 监理 第2部分:基础设施工程监理规范》
- 数字营销部经理面试题及答案
- 电信行业精算师面试题及解析
- 智能客服坐席主管面试题及答案解析
- 2025年秋季学期国家开放大学《人文英语3》形考任务综合测试完整答案(不含听力部分)
- 2025北京国文人力资源有限责任公司驻外文化和旅游机构职员招聘5人(第二期)笔试历年参考题库附带答案详解
- 党建合作签约协议书
- 装配式部分包覆钢-混凝土组合结构技术标准 DG-TJ08-2421-2023
- 2025年研发成果转化与科技成果转化环境研究报告
- (正式版)DB54∕T 0275-2023 《民用建筑节能技术标准》
- 电气焊安全培训课件
- 客户开发与客户维护课件
- STM32理论课件教学课件
- 测绘安全培训课件图片
- 严格电话使用管理办法
评论
0/150
提交评论