俄羅斯方塊編程 課程設(shè)計(jì)報(bào)告

上傳人:燈火****19 文檔編號(hào):20559650 上傳時(shí)間:2021-03-29 格式:DOC 頁(yè)數(shù):30 大小:154.51KB
收藏 版權(quán)申訴 舉報(bào) 下載
俄羅斯方塊編程 課程設(shè)計(jì)報(bào)告_第1頁(yè)
第1頁(yè) / 共30頁(yè)
俄羅斯方塊編程 課程設(shè)計(jì)報(bào)告_第2頁(yè)
第2頁(yè) / 共30頁(yè)
俄羅斯方塊編程 課程設(shè)計(jì)報(bào)告_第3頁(yè)
第3頁(yè) / 共30頁(yè)

下載文檔到電腦,查找使用更方便

15 積分

下載資源

還剩頁(yè)未讀,繼續(xù)閱讀

資源描述:

《俄羅斯方塊編程 課程設(shè)計(jì)報(bào)告》由會(huì)員分享,可在線閱讀,更多相關(guān)《俄羅斯方塊編程 課程設(shè)計(jì)報(bào)告(30頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、 課程設(shè)計(jì)報(bào)告 題 目:俄羅斯方塊設(shè)計(jì) 設(shè) 計(jì) 者:* * 專業(yè)班級(jí):* * 學(xué) 號(hào):* * 指導(dǎo)教師:* * 所屬系部:* * * *年* *月* *日 、 目錄 目錄 2 一.設(shè)計(jì)的目的和要求 3 二.設(shè)計(jì)內(nèi)容 3 三.設(shè)計(jì)任務(wù) 3 四.游戲基本規(guī)則 3 五.總體設(shè)計(jì) 4 六.詳細(xì)設(shè)計(jì)與程序?qū)崿F(xiàn) 4 七.主要處理流程 8 八.游戲設(shè)計(jì)源程序 10 九.截圖 30 十 心得體會(huì) 31 十一 參考文獻(xiàn) 31 一.設(shè)計(jì)的

2、目的和要求 加深對(duì)《C語(yǔ)言》課程所學(xué)知識(shí)的理解,進(jìn)一步鞏固C語(yǔ)言語(yǔ)法規(guī)則。學(xué)會(huì)編制結(jié)構(gòu)清晰、風(fēng)格良好、數(shù)據(jù)結(jié)構(gòu)適當(dāng)?shù)模谜Z(yǔ)言程序,從而具備解決綜合性實(shí)際問(wèn)題的能力。 二.設(shè)計(jì)內(nèi)容 在熟練掌握C語(yǔ)言的基本知識(shí):數(shù)據(jù)類型(整形、實(shí)型、字符型、指針、數(shù)組、結(jié)構(gòu)等);運(yùn)算類型(算術(shù)運(yùn)算、邏輯運(yùn)算、自增自減運(yùn)算、賦值運(yùn)算等);程序結(jié)構(gòu)(順序結(jié)構(gòu)、判斷選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu));大程序的功能分解方法(即函數(shù)的使用)等。進(jìn)一步掌握各種函數(shù)的應(yīng)用,包括時(shí)間函數(shù)、繪圖函數(shù),以及文件的讀寫操作等。 三.設(shè)計(jì)任務(wù) 1.游戲歡迎界面。 2.游戲執(zhí)行功能,包括計(jì)算得分。 3.游戲結(jié)束界面。 四.游戲基本規(guī)則

3、 游戲共由7種不同形狀的方塊組成,游戲開始以后隨機(jī)產(chǎn)生一個(gè)方塊由屏幕的頂端開始向下落下,落到低端則固定到桌面,并開始下一個(gè)方塊。在游戲窗口的左邊作為游戲的桌面,用寬度10和高度20的表格表示。游戲桌面的右邊靠上顯示得分,最下邊顯示游戲幫助。如果固定到游戲桌面的方塊超出了頂端游戲結(jié)束。方塊固定以后如果桌面上已經(jīng)固定了的方塊滿一行,則消除一行并將消除行之上的部分向下移動(dòng),消除一行得1分。基本操作如下: (1) 方塊落下的過(guò)程中可以用左右方向鍵移動(dòng)方塊的位置。 (2) 上方向鍵用來(lái)旋轉(zhuǎn)方塊,即所謂的變形。 (3) 下方向鍵用來(lái)加速方塊下落。 (4) 游戲中按下回車鍵暫停游戲。再

4、次按回車鍵繼續(xù)游戲。 五.總體設(shè)計(jì) 游戲以Windows窗口的形式運(yùn)行。窗口的左邊作為游戲的桌面,桌面的大小是10X20個(gè)單位。隨機(jī)出現(xiàn)一個(gè)方塊從游戲桌面的上方開始向下移動(dòng),并隨機(jī)生產(chǎn)一個(gè)向下方塊顯示到桌面的右邊。方塊的顏色分為7種。在顯示下一個(gè)方塊的上面顯示玩家得分,下面顯示游戲幫助。 當(dāng)方塊不能向下移動(dòng)的時(shí)候,將方塊固定到桌面上,固定的方法是將方塊的每個(gè)部分所在的坐標(biāo)的桌面數(shù)值設(shè)置為1.固定以后,判斷桌面數(shù)值的每一行,如果一行的數(shù)值全部都是1的話,就將桌面上的這一行數(shù)值刪除,并將這一行上面所有行向下移動(dòng)一行。刪除一行的同時(shí),玩家的得分加1。上述操作完成以后,將下一個(gè)方塊從桌面

5、的頂部開始下落,重新生成下一個(gè)方塊。在固定方塊到桌面的時(shí)候,還要判斷方塊的最頂端部分是否超出桌面范圍,并以此作為游戲結(jié)束的依據(jù)。 六.詳細(xì)設(shè)計(jì)與程序?qū)崿F(xiàn) 一.方塊設(shè)計(jì) 游戲的核心和重點(diǎn)在于7種方塊的設(shè)計(jì),這7種方塊的形狀分別為Z形、S形、線形、T形、方形、L形和反L形、其數(shù)據(jù)結(jié)構(gòu)分別用相對(duì)坐標(biāo)表示如下: {{0,-1},{0,0},{-1,0},{-1,1}} {{0,-1},{0,0},{1,0},{1,1}} {{0,-1},{0,0},{0,1},{0,2}} {{-1,0},{0,0},{1,0},{0,1}} {{0,0},{1,0},{0,1},{1,1}} {

6、{-1,-1},{0,-1},{0,0},{0,1}} {{1,-1},{0,-1},{0,0},{0,1}} 因?yàn)槠聊坏淖笊辖菫樵c(diǎn),向右為x軸增加的方向,向下為y軸增加的方向,將上述坐標(biāo)對(duì)號(hào)入座即可得到向?qū)?yīng)的方塊形狀。 二.方塊形狀 ①.Z形方塊 Z形方塊對(duì)號(hào)入座如下圖所示: {{0,-1},{0,0},{-1,0},{-1,1}} Z形方塊坐標(biāo)圖 ②.S型方塊 S形方塊對(duì)號(hào)入座如下圖所示: {{0,-1},{0,0},{1,0},{1,1}}

7、 S形方塊坐標(biāo)圖 ③.線形方塊 線形方塊對(duì)號(hào)入座如圖所示: {{0,-1},{0,0},{0,1},{0,2}} 線形方塊坐標(biāo)圖 ④.T型方塊 T型方塊對(duì)號(hào)入座如圖所示: {{-1,0},{0,0},{1,0},{0,1}} T型方塊坐標(biāo)圖 ⑤.方形方

8、方形方塊對(duì)號(hào)入座如圖所示: {{0,0},{1,0},{0,1},{1,1}} 方形方塊坐標(biāo)圖 ⑥.L形方塊 L.L型方塊對(duì)號(hào)入座如圖所示: {{-1,-1},{0,-1},{0,0},{0,1}} .L型方塊坐標(biāo)圖 ⑦.反L形方塊 反L形方塊對(duì)號(hào)入座如圖所示: {{1,-1},{0,-1},{0,0},{0,1}} L形方塊坐標(biāo)圖 在方塊相對(duì)坐標(biāo)基礎(chǔ)上加上x和y的偏移量,就可以在屏幕的不同位置得到相應(yīng)的反面方塊。完成方塊的向左,向右及向下移動(dòng)。 將方塊的相對(duì)坐標(biāo)旋轉(zhuǎn)90度得到的新坐標(biāo)就算變形后的坐標(biāo)。順時(shí)針操作的公式是: x’=-y y’=x

9、 逆時(shí)針旋轉(zhuǎn)操作的公式是: x’=y y’=x 其中,x和y代表旋轉(zhuǎn)前方塊的相對(duì)坐標(biāo),x和y代表旋轉(zhuǎn)后方塊的相對(duì)坐標(biāo)。 唯一例外的是方形方塊,在旋轉(zhuǎn)處理的時(shí)候不做處理。 七.主要處理流程 游戲的主要流程圖如下: 左鍵 上鍵 下鍵 當(dāng)前方塊能夠左移 向左移動(dòng)當(dāng)前方塊 當(dāng)前方塊能夠右移 向右移動(dòng)當(dāng)前方塊 當(dāng)前方塊能夠旋轉(zhuǎn) 當(dāng)前方塊能夠下移 旋轉(zhuǎn)當(dāng)前方塊 向下移動(dòng)當(dāng)前方塊 右鍵 否 八.游戲設(shè)計(jì)源程序 //zh

10、angdi #include #include #include #include"tetris.h" #define APP_NAME "TETRIS" #define APP_TITLE "Tetris Game" #define GAMEOVER "GAME OVER" #define SHAPE_COUNT 7 #define BLOCK_COUNT 4 #define MAX_SPEED 5 #define COLUMS 10 #define ROWS 20 #define RED

11、RGB(255,0,0) #define YELLOW RGB(255,255,0) #define GRAY RGB(128,128,128) #define BLACK RGB(0,0,0) #define WHITE RGB(255,255,255) #define STONE RGB(192,192,192) #define CHARS_IN_LINE 14 #define SCORE "SCORE %4d" //全局變量定義 char score_char[CHARS_IN_LINE]={0}; char*press_enter="Press Enter

12、key..."; //幫助提示信息 char*help[]= { "Press space or up key to transform shape.", "Press left or right key to move shape.", "Press down key to speed up.", "Press enter key to pause game.", "Enjoy it. :-)", 0 }; //枚舉游戲的狀態(tài) enum game_state { game_start, game_run, game_paus

13、e, game_over }state= game_start; //定義方塊的顏色 COLORREF shape_color[]= { RGB(255,0,0), RGB(0,255,0), RGB(0,0,255), RGB(255,255,0), RGB(0,255,255), RGB(255,0,255), RGB(255,255,255) }; //定義方塊的種類型 int shape_coordinate[SHAPE_COUNT][BLOCK_COUNT][2]= { {{0,-1},{0,0},{-1,0},

14、{-1,1}}, {{0,-1},{0,0},{1,0},{1,1}}, {{0,-1},{0,0},{0,1},{0,2}}, {{-1,0},{0,0},{1,0},{0,1}}, {{0,0},{1,0},{0,1},{1,1}}, {{-1,-1},{0,-1},{0,0},{0,1}}, {{1,-1},{0,-1},{0,0},{0,1}} }; int score=0;//得分 shape next=0;//下一個(gè)方塊 shape current=0;//當(dāng)前方塊 int current_coordinate[4][2]={0};//當(dāng)前方塊的每

15、一部分坐標(biāo) int table[ROWS][COLUMS]={0};//游戲桌面 int shapex=0;//當(dāng)前方塊的x坐標(biāo) int shapey=0;//當(dāng)前方塊的y坐標(biāo) int speed=0;//方塊下移速度 clock_t start=0;//每一幀開始時(shí)間 clock_t finish=0;//每一幀結(jié)束時(shí)間 /*windows 繪圖用變量*/ HWND gameWND; /*window 窗口句柄*/ HBITMAP memBM; /*內(nèi)存位圖*/

16、 HBITMAP memBMOld; /*內(nèi)存原始位圖*/ HDC memDC; /*內(nèi)存DC*/ RECT clientRC; /*客戶端矩形區(qū)域*/ HBRUSH blackBrush; /*黑色畫筆*/ HBRUSH stoneBrush; /*深灰色畫筆*/ HBRUSH shapeBrush[SHAPE_COU

17、NT]; /*方塊畫筆,種方塊,每種一個(gè)*/ HPEN grayPen; /*灰色畫筆*/ HFONT bigFont; /*大字體,用來(lái)顯示游戲名字和Game Over*/ HFONT smallFont; /*小字體用來(lái)顯示幫助信息等*/ /*主要處理函數(shù)*/ int maxX() /*取最大坐標(biāo),函數(shù)名稱:maxX;函數(shù)功能:取得當(dāng)

18、前方塊的最大x坐標(biāo)*/ { int i=0; /*取最大坐標(biāo),函數(shù)名稱:maxX;函數(shù)功能:取得當(dāng)前方塊的最大x坐標(biāo)*/ int x=current_coordinate[i][0]; /*取最大坐標(biāo),函數(shù)名稱:maxX;函數(shù)功能:取得當(dāng)前方塊的最大x坐標(biāo)*/ int m=x; /*取最大坐標(biāo),函數(shù)名稱:maxX;函數(shù)功能:取得當(dāng)前方塊的最大x坐標(biāo)*/ for (i=1; i

19、取得當(dāng)前方塊的最大x坐標(biāo)*/ { x=current_coordinate[i][0]; /*取最大坐標(biāo),函數(shù)名稱:maxX;函數(shù)功能:取得當(dāng)前方塊的最大x坐標(biāo)*/ if (m

20、大坐標(biāo),函數(shù)名稱:maxX;函數(shù)功能:取得當(dāng)前方塊的最大x坐標(biāo)*/ } int minX() /*取最小坐標(biāo),函數(shù)名稱:minX;函數(shù)功能:取得當(dāng)前方塊的最小x坐標(biāo)*/ { int i=0; /*取最小坐標(biāo),函數(shù)名稱:minX;函數(shù)功能:取得當(dāng)前方塊的最小x坐標(biāo)*/ int x=current_coordinate[i][0]; /*取最小坐標(biāo),函數(shù)名稱:minX;函數(shù)功能:取得當(dāng)前方塊的最小x坐標(biāo)*/ int m=x;

21、 /*取最小坐標(biāo),函數(shù)名稱:minX;函數(shù)功能:取得當(dāng)前方塊的最小x坐標(biāo)*/ for (i=1; ix) /*取最小坐標(biāo),函數(shù)名稱:minX;函數(shù)功能:取得當(dāng)前方塊的最小x坐標(biāo)*/ { m=x;

22、 /*取最小坐標(biāo),函數(shù)名稱:minX;函數(shù)功能:取得當(dāng)前方塊的最小x坐標(biāo)*/ } } return m; /*取最小坐標(biāo),函數(shù)名稱:minX;函數(shù)功能:取得當(dāng)前方塊的最小x坐標(biāo)*/ } /*逆時(shí)針旋轉(zhuǎn)方塊*/ void turn_left() /*函數(shù)名稱:turn_

23、left ;函數(shù)功能:將當(dāng)前方塊逆時(shí)針旋轉(zhuǎn)度*/ { int i=0; /*函數(shù)名稱:turn_left ;函數(shù)功能:將當(dāng)前方塊逆時(shí)針旋轉(zhuǎn)度*/ int x,y; /*函數(shù)名稱:turn_left ;函數(shù)功能:將當(dāng)前方塊逆時(shí)針旋轉(zhuǎn)度*/ for (i=0;i<4;i++) /*函數(shù)名稱:turn_left ;函數(shù)功能:將當(dāng)前方塊逆時(shí)針旋轉(zhuǎn)度*/ { x=current_coordinate[i][0];

24、 /*函數(shù)名稱:turn_left ;函數(shù)功能:將當(dāng)前方塊逆時(shí)針旋轉(zhuǎn)度*/ y=current_coordinate[i][1]; /*函數(shù)名稱:turn_left ;函數(shù)功能:將當(dāng)前方塊逆時(shí)針旋轉(zhuǎn)度*/ current_coordinate[i][0]=y; /*函數(shù)名稱:turn_left ;函數(shù)功能:將當(dāng)前方塊逆時(shí)針旋轉(zhuǎn)度*/ current_coordinate[i][1]=-x; /*函數(shù)名稱:turn_left ;函數(shù)功能:將當(dāng)前方塊逆時(shí)針旋轉(zhuǎn)度*/ } } /*順時(shí)針旋轉(zhuǎn)方塊*/ void turn_right(

25、) /*函數(shù)名稱:turn_right ;函數(shù)功能:將當(dāng)前方塊順時(shí)針旋轉(zhuǎn)度*/ { int i=0; /*函數(shù)名稱:turn_right ;函數(shù)功能:將當(dāng)前方塊順時(shí)針旋轉(zhuǎn)度*/ int x,y; /*函數(shù)名稱:turn_right ;函數(shù)功能:將當(dāng)前方塊順時(shí)針旋轉(zhuǎn)度*/ for (i=0;i<4;i++) /*函數(shù)名稱:turn_right ;函數(shù)功能:將當(dāng)前方塊順時(shí)針旋轉(zhuǎn)度*/ { x=c

26、urrent_coordinate[i][0]; /*函數(shù)名稱:turn_right ;函數(shù)功能:將當(dāng)前方塊順時(shí)針旋轉(zhuǎn)度*/ y=current_coordinate[i][1]; /*函數(shù)名稱:turn_right ;函數(shù)功能:將當(dāng)前方塊順時(shí)針旋轉(zhuǎn)度*/ current_coordinate[i][0]=-y; /*函數(shù)名稱:turn_right ;函數(shù)功能:將當(dāng)前方塊順時(shí)針旋轉(zhuǎn)度*/ current_coordinate[i][1]=x; /*函數(shù)名稱:turn_right ;函數(shù)功能:將當(dāng)前方塊順時(shí)針旋轉(zhuǎn)度*/ } } /*檢查方塊是否

27、越界*/ int out_of_table() /*函數(shù)名稱:out_of_table;函數(shù)功能:檢查當(dāng)前方塊是否超出桌面范圍*/ { int i=0; /*函數(shù)名稱:out_of_table;函數(shù)功能:檢查當(dāng)前方塊是否超出桌面范圍*/ int x,y; /*函數(shù)名稱:out_of_table;函數(shù)功能:檢查當(dāng)前方塊是否超出桌面范圍*/ for (i=0;i<4;i++

28、) /*函數(shù)名稱:out_of_table;函數(shù)功能:檢查當(dāng)前方塊是否超出桌面范圍*/ { x=shapex+current_coordinate[i][0]; /*函數(shù)名稱:out_of_table;函數(shù)功能:檢查當(dāng)前方塊是否超出桌面范圍*/ y=shapey+current_coordinate[i][1]; /*函數(shù)名稱:out_of_table;函數(shù)功能:檢查當(dāng)前方塊是否超出桌面范圍*/ if (x<0||x>(COLUMS-1)||y>(ROWS-1))

29、 /*函數(shù)名稱:out_of_table;函數(shù)功能:檢查當(dāng)前方塊是否超出桌面范圍*/ { return 1; /*函數(shù)名稱:out_of_table;函數(shù)功能:檢查當(dāng)前方塊是否超出桌面范圍*/ } if (table[y][x]) /*函數(shù)名稱:out_of_table;函數(shù)功能:檢查當(dāng)前方塊是否超出桌面范圍*/ { return 1; /*函數(shù)名稱:out_o

30、f_table;函數(shù)功能:檢查當(dāng)前方塊是否超出桌面范圍*/ } } return 0; /*函數(shù)名稱:out_of_table;函數(shù)功能:檢查當(dāng)前方塊是否超出桌面范圍*/ } /*旋轉(zhuǎn)方塊*/ void transform() /*函數(shù)名稱:transform; 函數(shù)功能:旋轉(zhuǎn)當(dāng)前方塊*/ { if (current==SquareShape) /*函數(shù)名稱:transform;

31、 函數(shù)功能:旋轉(zhuǎn)當(dāng)前方塊*/ { return; /*函數(shù)名稱:transform; 函數(shù)功能:旋轉(zhuǎn)當(dāng)前方塊*/ } turn_right(); /*函數(shù)名稱:transform; 函數(shù)功能:旋轉(zhuǎn)當(dāng)前方塊*/ if (out_of_table()) /*函數(shù)名稱:transform; 函數(shù)功能:旋轉(zhuǎn)當(dāng)前方塊*/ { turn_left(); /*函數(shù)名稱:

32、transform; 函數(shù)功能:旋轉(zhuǎn)當(dāng)前方塊*/ } } /*判斷方塊能否向左移動(dòng)*/ int leftable() /*函數(shù)名稱:leftable;函數(shù)功能:判斷當(dāng)前方塊能否向左移動(dòng),能移動(dòng)返回,否則返回*/ { int i=0; /*函數(shù)名稱:leftable;函數(shù)功能:判斷當(dāng)前方塊能否向左移動(dòng),能移動(dòng)返回,否則返回*/ int x,y; /*函數(shù)名稱:lef

33、table;函數(shù)功能:判斷當(dāng)前方塊能否向左移動(dòng),能移動(dòng)返回,否則返回*/ for (i=0;i<4;i++) /*函數(shù)名稱:leftable;函數(shù)功能:判斷當(dāng)前方塊能否向左移動(dòng),能移動(dòng)返回,否則返回*/ { x=shapex+current_coordinate[i][0]; /*函數(shù)名稱:leftable;函數(shù)功能:判斷當(dāng)前方塊能否向左移動(dòng),能移動(dòng)返回,否則返回*/ y=shapey+current_coordinate[i][1]; /*函數(shù)名稱:leftable;函數(shù)功能:判斷當(dāng)

34、前方塊能否向左移動(dòng),能移動(dòng)返回,否則返回*/ if (x<=0||table[y][x-1]==1) /*函數(shù)名稱:leftable;函數(shù)功能:判斷當(dāng)前方塊能否向左移動(dòng),能移動(dòng)返回,否則返回*/ { return 0; /*函數(shù)名稱:leftable;函數(shù)功能:判斷當(dāng)前方塊能否向左移動(dòng),能移動(dòng)返回,否則返回*/ } } return 1; /*函數(shù)名稱:leftable;函數(shù)功能:判斷當(dāng)前方塊能否向

35、左移動(dòng),能移動(dòng)返回,否則返回*/ } /*判斷方塊能否向右移動(dòng)*/ int rightable() /*函數(shù)名稱:rightable;函數(shù)功能:判斷當(dāng)前方塊能否向右移動(dòng),能移動(dòng)返回,否則返回*/ { int i=0; /*函數(shù)名稱:rightable;函數(shù)功能:判斷當(dāng)前方塊能否向右移動(dòng),能移動(dòng)返回,否則返回*/ int x,y; /*函數(shù)名稱:rightable;函數(shù)功能:判斷當(dāng)

36、前方塊能否向右移動(dòng),能移動(dòng)返回,否則返回*/ for (i=0;i<4;i++) /*函數(shù)名稱:rightable;函數(shù)功能:判斷當(dāng)前方塊能否向右移動(dòng),能移動(dòng)返回,否則返回*/ { x=shapex+current_coordinate[i][0]; /*函數(shù)名稱:rightable;函數(shù)功能:判斷當(dāng)前方塊能否向右移動(dòng),能移動(dòng)返回,否則返回*/ y=shapey+current_coordinate[i][1]; /*函數(shù)名稱:rightable;函數(shù)功能:判斷當(dāng)前方塊能否向右移動(dòng),能移

37、動(dòng)返回,否則返回*/ if (x>=(COLUMS-1)||table[y][x+1]==1) /*函數(shù)名稱:rightable;函數(shù)功能:判斷當(dāng)前方塊能否向右移動(dòng),能移動(dòng)返回,否則返回*/ { return 0; /*函數(shù)名稱:rightable;函數(shù)功能:判斷當(dāng)前方塊能否向右移動(dòng),能移動(dòng)返回,否則返回*/ } } return 1; /*函數(shù)名稱:rightable;函數(shù)功能:判斷當(dāng)前方塊能否向右移動(dòng),能移

38、動(dòng)返回,否則返回*/ } /*判斷方塊能否向下移動(dòng)*/ int downable() /*函數(shù)名稱:downable;函數(shù)功能:判斷當(dāng)前方塊能否向下移動(dòng),能移動(dòng)返回,否則返回*/ { int i=0; /*函數(shù)名稱:downable;函數(shù)功能:判斷當(dāng)前方塊能否向下移動(dòng),能移動(dòng)返回,否則返回*/ int x,y; for (i=0;i<4;i++) /*函數(shù)名稱:do

39、wnable;函數(shù)功能:判斷當(dāng)前方塊能否向下移動(dòng),能移動(dòng)返回,否則返回*/ { x=shapex+current_coordinate[i][0]; /*函數(shù)名稱:downable;函數(shù)功能:判斷當(dāng)前方塊能否向下移動(dòng),能移動(dòng)返回,否則返回*/ y=shapey+current_coordinate[i][1]; /*函數(shù)名稱:downable;函數(shù)功能:判斷當(dāng)前方塊能否向下移動(dòng),能移動(dòng)返回,否則返回*/

40、 if (y>=(ROWS-1)||table[y+1][x]==1) /*函數(shù)名稱:downable;函數(shù)功能:判斷當(dāng)前方塊能否向下移動(dòng),能移動(dòng)返回,否則返回*/ { return 0; /*函數(shù)名稱:downable;函數(shù)功能:判斷當(dāng)前方塊能否向下移動(dòng),能移動(dòng)返回,否則返回*/ } } return 1;

41、 /*函數(shù)名稱:downable;函數(shù)功能:判斷當(dāng)前方塊能否向下移動(dòng),能移動(dòng)返回,否則返回*/ } /*向左移動(dòng)當(dāng)前方塊*/ void move_left() /*函數(shù)名稱:move_left;函數(shù)功能:向左移動(dòng)當(dāng)前方塊*/ { if (leftable()) /*函數(shù)名稱:move_left;函數(shù)功能:向左移動(dòng)當(dāng)前方塊*/ {

42、 shapex--; /*函數(shù)名稱:move_left;函數(shù)功能:向左移動(dòng)當(dāng)前方塊*/ } } /*向右移動(dòng)當(dāng)前方塊*/ void move_right() /*函數(shù)名稱:move_right;函數(shù)功能:向右移動(dòng)方塊*/ { if (rightable()) /*函數(shù)名稱:move_right;函數(shù)功能:向右移動(dòng)方塊*/ { shapex++; /*函數(shù)名稱:move_right;函數(shù)功能:向右移動(dòng)方塊*/ } } /*向下移

43、動(dòng)當(dāng)前方塊*/ void move_down() /*函數(shù)名稱:move_down;函數(shù)功能:向下移動(dòng)當(dāng)前方塊*/ { if (downable()) /*函數(shù)名稱:move_down;函數(shù)功能:向下移動(dòng)當(dāng)前方塊*/ { shapey++; /*函數(shù)名稱:move_down;函數(shù)功能:向下移動(dòng)當(dāng)前方塊*/ } else { if (add_to_table()) /*函數(shù)名稱:move_down;函數(shù)功能:向

44、下移動(dòng)當(dāng)前方塊*/ { remove_full(); /*函數(shù)名稱:move_down;函數(shù)功能:向下移動(dòng)當(dāng)前方塊*/ next_shape(); /*函數(shù)名稱:move_down;函數(shù)功能:向下移動(dòng)當(dāng)前方塊*/ } else { state=game_over; /*函數(shù)名稱:move_down;函數(shù)功能:向下移動(dòng)當(dāng)前方塊*/ } } } /*將當(dāng)前方塊固定到桌面上*/ int add_to_table()

45、 /*函數(shù)名稱:add_to_table;函數(shù)功能:將當(dāng)前方塊固定到桌面上,若返回,表示游戲結(jié)束*/ { int i=0; /*函數(shù)名稱:add_to_table;函數(shù)功能:將當(dāng)前方塊固定到桌面上,若返回,表示游戲結(jié)束*/ int x,y; /*函數(shù)名稱:add_to_table;函數(shù)功能:將當(dāng)前方塊固定到桌面上,若返回,表示游戲結(jié)束*/ for (i=0;i<4;i++) /*函數(shù)名稱:a

46、dd_to_table;函數(shù)功能:將當(dāng)前方塊固定到桌面上,若返回,表示游戲結(jié)束*/ { x=shapex+current_coordinate[i][0]; /*函數(shù)名稱:add_to_table;函數(shù)功能:將當(dāng)前方塊固定到桌面上,若返回,表示游戲結(jié)束*/ y=shapey+current_coordinate[i][1]; /*函數(shù)名稱:add_to_table;函數(shù)功能:將當(dāng)前方塊固定到桌面上,若返回,表示游戲結(jié)束*/ if (y<0||table[y][x]==1) /*函數(shù)名稱:add_to_table;函數(shù)功能:將當(dāng)前方塊

47、固定到桌面上,若返回,表示游戲結(jié)束*/ { return 0; /*函數(shù)名稱:add_to_table;函數(shù)功能:將當(dāng)前方塊固定到桌面上,若返回,表示游戲結(jié)束*/ } table[y][x]=1; /*函數(shù)名稱:add_to_table;函數(shù)功能:將當(dāng)前方塊固定到桌面上,若返回,表示游戲結(jié)束*/ } return 1; /*函數(shù)名稱:add_to_table;函數(shù)功能:將當(dāng)前方塊固定到桌面上,若返回,表示游

48、戲結(jié)束*/ } /*刪除填滿的行*/ void remove_full() /*函數(shù)名稱:remove_full;函數(shù)功能:刪除桌面上填滿的行*/ { int c=0; /*函數(shù)名稱:remove_full;函數(shù)功能:刪除桌面上填滿的行*/ int i,j;

49、 /*函數(shù)名稱:remove_full;函數(shù)功能:刪除桌面上填滿的行*/ for (i=ROWS-1;i>0;i--) /*函數(shù)名稱:remove_full;函數(shù)功能:刪除桌面上填滿的行*/ { c=0; /*函數(shù)名稱:remove_full;函數(shù)功能:刪除桌面上填滿的行*/ for(j=0;j

50、 /*函數(shù)名稱:remove_full;函數(shù)功能:刪除桌面上填滿的行*/ { c+=table[i][j]; /*函數(shù)名稱:remove_full;函數(shù)功能:刪除桌面上填滿的行*/ } if (c==COLUMS) /*函數(shù)名稱:remove_full;函數(shù)功能:刪除桌面上填滿的行*/ { memmove(table[1]

51、,table[0],sizeof(int)*COLUMS*i); /*函數(shù)名稱:remove_full;函數(shù)功能:刪除桌面上填滿的行*/ memset(table[0],0,sizeof(int)*COLUMS); /*函數(shù)名稱:remove_full;函數(shù)功能:刪除桌面上填滿的行*/ score++; /*函數(shù)名稱:remove_full;函數(shù)功能:刪除桌面上填滿的行*/ speed=(score/100)%MAX_

52、SPEED; /*函數(shù)名稱:remove_full;函數(shù)功能:刪除桌面上填滿的行*/ i++; } else if (c==0) /*函數(shù)名稱:remove_full;函數(shù)功能:刪除桌面上填滿的行*/ { break; } } } //lijin //創(chuàng)建新游戲 void new_game() { memset(table,0,sizeof(int)*COL

53、UMS*ROWS); start=clock(); next=random(SHAPE_COUNT); score=0; speed=0; } //運(yùn)行游戲 void run_game() { finish=clock(); if ((finish-start)>(MAX_SPEED-speed)*100) { move_down(); start=clock(); InvalidateRect(gameWND,NULL,TRUE); } } //操作當(dāng)前方塊 void next_shape() { cur

54、rent=next; memcpy(current_coordinate, shape_coordinate[next], sizeof(int)*BLOCK_COUNT*2); shapex=(COLUMS-((maxX(current)-minX(current)))) /2; shapey=0; next = random(SHAPE_COUNT); } //取隨機(jī)數(shù) int random(int seed) { if (seed==0) { return 0; } srand((unsigned)time(NULL))

55、; return (rand() % seed); } //繪圖 void paint() { PAINTSTRUCT ps; HDC hdc; draw_table(); hdc=BeginPaint(gameWND,&ps); BitBlt(hdc, clientRC.left, clientRC.top, clientRC.right, clientRC.bottom, memDC, 0, 0, SRCCOPY); EndPaint(gameWND, &ps); } //繪制游戲桌面 void draw_table() {

56、HBRUSH hBrushOld; HPEN hPenOld; HFONT hFontOld; RECT rc; int x0, y0, w; int x, y, i, j; char* str; w = clientRC.bottom / (ROWS+2);//一個(gè)方塊的寬度 x0 = y0 =w; FillRect(memDC, &clientRC,blackBrush);//用黑色矩形填充桌面背景區(qū) //如果游戲是開始或結(jié)束狀態(tài) if(state == game_start || state == game

57、_over) { memcpy(&rc, &clientRC, sizeof(RECT)); rc.bottom =rc.bottom /2; hFontOld= SelectObject(memDC, bigFont); SetBkColor(memDC,BLACK); //如果游戲是開始狀態(tài),用黃色字顯示游戲開始畫面 if(state==game_start) { str = APP_TITLE; SetTextColor(memDC,YELLOW); } else//如果游戲是結(jié)束狀態(tài),用紅色字顯示GAME OVER {

58、 str = GAMEOVER; SetTextColor(memDC,RED); } DrawText(memDC, str, strlen(str), &rc, DT_SINGLELINE | DT_CENTER | DT_BOTTOM); SelectObject(memDC, hFontOld); hFontOld=SelectObject(memDC, smallFont); rc.top= rc.bottom; rc.bottom =rc.bottom *2; if (state == game_over)

59、{ SetTextColor(memDC, YELLOW); sprintf(score_char, SCORE, score); DrawText(memDC, score_char, strlen(score_char), &rc, DT_SINGLELINE | DT_CENTER | DT_TOP); } SetTextColor(memDC, STONE); DrawText(memDC, press_enter, strlen(press_enter), &rc, DT_SINGLELINE | DT_CENTER | DT_V

60、CENTER); SelectObject(memDC, hFontOld); return; } //畫桌面上殘留的方塊 hBrushOld =SelectObject(memDC, stoneBrush); for (i=0; i< ROWS; i++) { for (j=0;j

61、} } SelectObject(memDC,hBrushOld); //畫當(dāng)前的方塊 hBrushOld=SelectObject(memDC,shapeBrush[current]); for(i=0;i<4;i++) { x=x0+(current_coordinate[i][0]+shapex)*w; y=y0+(current_coordinate[i][1]+shapey)*w; if(x

62、; } SelectObject(memDC,hBrushOld); //畫桌上的表格線條 hPenOld=SelectObject(memDC,grayPen); for(i=0;i<=ROWS;i++) { MoveToEx(memDC,x0,y0+i*w,NULL); LineTo(memDC,x0+COLUMS*w,y0+i*w); } for(i=0;i<=COLUMS;i++) { MoveToEx(memDC,x0+i*w,y0,NULL); LineTo(memDC,x0+i*w,y0+ROW

63、S*w); } SelectObject(memDC,hPenOld); //畫玩家得分 x0=x0+COLUMS*w+3*w; y0=y0+w; hFontOld=SelectObject(memDC,smallFont);//選擇字體 SetTextColor(memDC,YELLOW);//設(shè)置字體顏色 sprintf(score_char,SCORE,score); TextOut(memDC,x0,y0,score_char,strlen(score_char));//輸出得分 //畫下一個(gè)方塊 y0 +=w;

64、 SetTextColor(memDC,STONE); TextOut(memDC,x0,y0,"NEXT",4); x0=x0+w; y0+=2*w; hBrushOld=SelectObject(memDC,shapeBrush[next]); for(i=0;i<4;i++) { x=x0+shape_coordinate[next][i][0]*w; y=y0+shape_coordinate[next][i][1]*w; Rectangle(memDC,x,y,x+w+1,y+w+1); } SelectObje

65、ct(memDC,hBrushOld); //打印幫助信息 x0=(COLUMS+2)*w; y0+=4*w; SetTextColor(memDC,GRAY); i=0; while(help[i]) { TextOut(memDC,x0,y0,help[i],strlen(help[i])); y0+=w; i++; } SelectObject(memDC,hFontOld); } //xueshuang //處理按鍵 void key_down(WPARAM wParam) {

66、 /*如果游戲狀態(tài)不是運(yùn)行狀態(tài),按下回車鍵*/ if(state !=game_run) { if(wParam==VK_RETURN) { switch(state ) { case game_start:/*游戲開始狀態(tài)*/ next_shape(); state=game_run; break; case game_pause:/*游戲暫停狀態(tài)*/ state=game_run; break; case game_over:/*游戲結(jié)束狀態(tài)*/ new_game(); next_shape(); state=game_run; break; } } } else/*如果游戲狀態(tài)是運(yùn)行狀態(tài)*/ { switch(wParam) { case VK_SPACE: case VK_UP: transform();/*按空格鍵或向上鍵,旋轉(zhuǎn)

展開閱讀全文
溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(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ì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!