




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、#include #include #include #define CELL 20#define ROWS 25#define COLS 15/升級(jí)(shng j)所需分?jǐn)?shù)值#define SCORE_LEVEL_INC 80#define ID_TIMER 1/全局變量/HWND hwnd; /保存(bocn)窗口句柄int score=0; /分?jǐn)?shù)(fnsh)int level=0; /級(jí)數(shù)int interval_unit=25; /隨級(jí)數(shù)遞增的時(shí)間間隔增量int interval_base=300; /時(shí)間間隔基量int old_interval; /保存當(dāng)前的時(shí)間間隔,用于加速操作
2、int cur_left,cur_top; /記錄方塊當(dāng)前的位置int width_block,height_block; /方塊的寬帶和高度bool isPause=false; /暫停標(biāo)識(shí)UINT timer_id=0; /保存計(jì)時(shí)器IDstatic byte *block=NULL; /方塊,方塊為隨機(jī)大小,采用動(dòng)態(tài)分配內(nèi)存方式,所以這里是指針變量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(); /輸出方塊,/該函數(shù)會(huì)直接修改全局變量block,width_block,height_block,/cur_
4、left和cur_topbool IsTouchBottom ( HDC hdc ); /判斷是否(sh fu)到達(dá)底部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+ )/計(jì)算方塊(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)是否到達(dá)底部if ( IsTouchBottom ( hdc ) ) /到底部/消行處理(c
8、hl)ClearRow ( hdc );ExportBlock(); /輸出下一個(gè)(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+ ) /從左邊開始掃描,獲取該行最左邊的實(shí)心方格塊if ( * ( blo
9、ck+y*width_block+x ) )/判斷當(dāng)前方格在面板上面左邊一個(gè)方格是否為實(shí)心,是就代表不能再左移if ( g_panelcur_top+ycur_left+x-1 ) return;break; /只判斷最左邊的一個(gè)實(shí)心方格,之后直接掃描下一行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)開始掃描,獲取該行最右邊的實(shí)心方格塊if ( * ( block+y*width_block+x ) )/判斷當(dāng)前方格在面板上右邊一個(gè)方格是否為實(shí)心,是就代表不能再右移if ( g_panelcur_top+ycur_left+x+1 ) return;break; /只判斷最右邊的一個(gè)實(shí)心方格cur_left+;RefreshPanel ( hdc );void DoRedirection ( HDC hdc ) /改變方向int i,j;byte * temp=NULL;if ( NULL=
11、block ) return;if ( cur_top0 ) return; /方塊完整顯示前不能轉(zhuǎn)向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 ); /退出前必須先釋放內(nèi)存return;for ( i=0; imax_len; i+ )for ( j=0; jmax_len; j+ )/轉(zhuǎn)向所需的空間內(nèi)有已被占用的實(shí)心方格存在,即轉(zhuǎn)向失敗if
12、 ( g_paneltemp_cur_top+itemp_cur_left+j )free ( temp ); /退出前必須先釋放內(nèi)存return;/把臨時(shí)變量的值賦給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 ); /釋放為臨時(shí)變量分配(fnpi)的內(nèi)存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- ) /從底行開始掃描/判斷第一個(gè)實(shí)心方塊在面板上鄰接的下方方格是否為實(shí)心,是就代表已經(jīng)到達(dá)底部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)結(jié)束 ),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;/加分規(guī)則(guz):消除行數(shù),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;/撤銷當(dāng)前計(jì)時(shí)器,然后重設(shè)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 ) ) /實(shí)心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 ); /釋放之前分配的內(nèi)存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,即第一行的第一個(gè)方格(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,即第一行的第一個(gè)方格,下面同理( 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 ); /補(bǔ)齊寬度和高度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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年河北石油職業(yè)技術(shù)大學(xué)單招職業(yè)適應(yīng)性測(cè)試題庫帶答案
- 2025年貴州裝備制造職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫及答案一套
- 2025年河南推拿職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫帶答案
- Unit 12 The five peas Let's learn more (教學(xué)設(shè)計(jì))-2024-2025學(xué)年滬教牛津版(深圳用)英語六年級(jí)下冊(cè)
- 2025年哈爾濱傳媒職業(yè)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫及答案1套
- 運(yùn)動(dòng)生理學(xué)復(fù)習(xí)試題有答案
- 中級(jí)農(nóng)藝工試題練習(xí)卷附答案
- 2025年湖北黃岡應(yīng)急管理職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫及答案1套
- 2025年廣東省建筑安全員-C證考試題庫
- 菜地歸還合同范本
- DDI-能力解構(gòu)詞典
- 2015-2022年江西電力職業(yè)技術(shù)學(xué)院高職單招語文/數(shù)學(xué)/英語筆試參考題庫含答案解析
- 1 聚聚散散 教案人教版美術(shù)四年級(jí)下冊(cè)
- 綜合實(shí)踐活動(dòng)勞動(dòng)與技術(shù)八年級(jí)下冊(cè)教案
- GB/T 36196-2018蛋鴿飼養(yǎng)管理技術(shù)規(guī)程
- GB/T 21653-2008鎳及鎳合金線和拉制線坯
- GB/T 15970.2-2000金屬和合金的腐蝕應(yīng)力腐蝕試驗(yàn)第2部分:彎梁試樣的制備和應(yīng)用
- 入職的通知書
- doors培訓(xùn)材料-工具入門
- 中國(guó)古典文獻(xiàn)學(xué) 第四章課件
- 諾如病毒-感染性腹瀉預(yù)防控制知識(shí)課件
評(píng)論
0/150
提交評(píng)論