版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 牛顿介绍教学
- 环境工程设计培训课件
- 陕西省西安市金太阳多校联考2025-2026学年九年级上学期1月期末历史试卷(含答案)
- 2026年及未来5年中国手动平衡阀行业竞争格局分析及投资战略咨询报告
- 2025 小学一年级科学下册羽毛的保护意义课件
- 《GAT 2000.336-2023公安信息代码 第336部分:视频图像采集设备采集部位类型代码》专题研究报告
- 全面了解心理健康保健知识
- 绿氢装备生产线项目实施方案
- 钢结构幕墙防水施工技术方案
- 2026年项目经理面试攻略项目管理能力与团队协作题集
- 中药炮制的目的及对药物的影响
- 688高考高频词拓展+默写检测- 高三英语
- 北电电影学电影评论2025年初试文常真题及答案解析
- 第14课 算法对生活的影响 课件 2025-2026学年六年级上册信息技术浙教版
- 食品检验检测技术专业介绍
- 2025年事业单位笔试-贵州-贵州财务(医疗招聘)历年参考题库含答案解析(5卷套题【单项选择100题】)
- 二年级数学上册100道口算题大全(每日一练共12份)
- 药店物价收费员管理制度
- 数据风险监测管理办法
- 国家开放大学《公共政策概论》形考任务1-4答案
- 肝恶性肿瘤腹水护理
评论
0/150
提交评论