俄羅斯方塊程序(共13頁)_第1頁
俄羅斯方塊程序(共13頁)_第2頁
俄羅斯方塊程序(共13頁)_第3頁
俄羅斯方塊程序(共13頁)_第4頁
俄羅斯方塊程序(共13頁)_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論