俄羅斯方塊編程 課程設計報告材料
《俄羅斯方塊編程 課程設計報告材料》由會員分享,可在線閱讀,更多相關《俄羅斯方塊編程 課程設計報告材料(30頁珍藏版)》請在裝配圖網上搜索。
1、word 課程設計報告 題 目:俄羅斯方塊設計 設 計 者:* * 專業(yè)班級:* * 學 號:* * 指導教師:* * 所屬系部:* * * *年* *月* *日 、 目錄 目錄2 一.設計的目的和要求3 二.設計容3 三.設計任務3 四.游戲根本規(guī)如此3 五.總體設計4 六.詳細設計與程序實現4 七.主要處理流程8 八.游戲設計源程序10 九.截圖30 十心得體會31 十一參考文獻31 一.設計的目的和要求 加深對《C語言》課程所學知識的理解,進一步鞏固C語言語法規(guī)如此。學
2、會編制結構清晰、風格良好、數據結構適當的C語言程序,從而具備解決綜合性實際問題的能力。? 二.設計容 在熟練掌握C語言的根本知識:數據類型〔整形、實型、字符型、指針、數組、結構等〕;運算類型〔算術運算、邏輯運算、自增自減運算、賦值運算等〕;程序結構〔順序結構、判斷選擇結構、循環(huán)結構〕;大程序的功能分解方法〔即函數的使用〕等。進一步掌握各種函數的應用,包括時間函數、繪圖函數,以與文件的讀寫操作等。? 三.設計任務 1.游戲歡迎界面。 2.游戲執(zhí)行功能,包括計算得分。 3.游戲完畢界面。 四.游戲根本規(guī)如此 游戲共由7種不同形狀的方塊組成,游戲開始以后隨機產生一個方塊
3、由屏幕的頂端開始向下落下,落到低端如此固定到桌面,并開始下一個方塊。在游戲窗口的左邊作為游戲的桌面,用寬度10和高度20的表格表示。游戲桌面的右邊靠上顯示得分,最下邊顯示游戲幫助。如果固定到游戲桌面的方塊超出了頂端游戲完畢。方塊固定以后如果桌面上已經固定了的方塊滿一行,如此消除一行并將消除行之上的局部向下移動,消除一行得1分。根本操作如下: (1) 方塊落下的過程中可以用左右方向鍵移動方塊的位置。 (2) 上方向鍵用來旋轉方塊,即所謂的變形。 (3) 下方向鍵用來加速方塊下落。 (4) 游戲中按下回車鍵暫停游戲。再次按回車鍵繼續(xù)游戲。 五.總體設計 游戲以Windows窗
4、口的形式運行。窗口的左邊作為游戲的桌面,桌面的大小是10X20個單位。隨機出現一個方塊從游戲桌面的上方開始向下移動,并隨機生產一個向下方塊顯示到桌面的右邊。方塊的顏色分為7種。在顯示下一個方塊的上面顯示玩家得分,下面顯示游戲幫助。 當方塊不能向下移動的時候,將方塊固定到桌面上,固定的方法是將方塊的每個局部所在的坐標的桌面數值設置為1.固定以后,判斷桌面數值的每一行,如果一行的數值全部都是1的話,就將桌面上的這一行數值刪除,并將這一行上面所有行向下移動一行。刪除一行的同時,玩家的得分加1。上述操作完成以后,將下一個方塊從桌面的頂部開始下落,重新生成下一個方塊。在固定方塊到桌面的時候,還要判斷方
5、塊的最頂端局部是否超出桌面圍,并以此作為游戲完畢的依據。 六.詳細設計與程序實現 游戲的核心和重點在于7種方塊的設計,這7種方塊的形狀分別為Z形、S形、線形、T形、方形、L形和反L形、其數據結構分別用相對坐標表示如下: {{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}} {{-1,-1},{0,-1},{0,0},{0,1}} {{1,-1},{0,-1
6、},{0,0},{0,1}} 因為屏幕的左上角為原點,向右為x軸增加的方向,向下為y軸增加的方向,將上述坐標對號入座即可得到向對應的方塊形狀。 ①.Z形方塊 Z形方塊對號入座如如下圖所示: {{0,-1},{0,0},{-1,0},{-1,1}} Z形方塊坐標圖 ②.S型方塊 S形方塊對號入座如如下圖所示: {{0,-1},{0,0},{1,0},{1,1}} S形方塊坐標圖 ③.線形方塊 線形方塊對號入座如下列圖
7、: {{0,-1},{0,0},{0,1},{0,2}} 線形方塊坐標圖 ④.T型方塊 T型方塊對號入座如下列圖: {{-1,0},{0,0},{1,0},{0,1}} T型方塊坐標圖 ⑤.方形方 方形方塊對號入座如下列圖: {{0,0},{1,0},{0,1},{1,1}} 方形方塊坐標圖 ⑥.L形方塊 L.L型方塊對號入座如下列圖: {{-1,-1},{0,-1},{0,0},{0,1}} .L型方塊坐標圖 ⑦.反L形方塊 反L形方塊對號入座如下列圖: {{1,-1},{0,-1},{0,0},{0,1}} L形方塊坐標
8、圖 在方塊相對坐標根底上加上x和y的偏移量,就可以在屏幕的不同位置得到相應的反面方塊。完成方塊的向左,向右與向下移動。 將方塊的相對坐標旋轉90度得到的新坐標就算變形后的坐標。順時針操作的公式是: x’=-y y’=x 逆時針旋轉操作的公式是: x’=y y’=x 其中,x和y代表旋轉前方塊的相對坐標,x和y代表旋轉后方塊的相對坐標。 唯一例外的是方形方塊,在旋轉處理的時候不做處理。 游戲的主要流程圖如下: 左鍵 上鍵 下鍵 當前方塊能夠左移 向左移動當前方塊 當前方塊
9、能夠右移
向右移動當前方塊
當前方塊能夠旋轉
當前方塊能夠下移
旋轉當前方塊
向下移動當前方塊
右鍵
否
//zhangdi
#include
10、e MAX_SPEED 5 #define COLUMS 10 #define ROWS 20 #define RED 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" //全局變量定義
11、 char score_char[CHARS_IN_LINE]={0}; char*press_enter="Press Enter 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)
12、enum game_state { game_start, game_run, game_pause, 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_coordina
13、te[SHAPE_COUNT][BLOCK_COUNT][2]= { {{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}}, {{-1,-1},{0,-1},{0,0},{0,1}}, {{1,-1},{0,-1},{0,0},{0,1}} }; int score=0;//得分 shape next=0;//下一個方塊 shape
14、current=0;//當前方塊 int current_coordinate[4][2]={0};//當前方塊的每一局部坐標 int table[ROWS][COLUMS]={0};//游戲桌面 int shapex=0;//當前方塊的x坐標 int shapey=0;//當前方塊的y坐標 int speed=0;//方塊下移速度 clock_t start=0;//每一幀開始時間 clock_t finish=0;//每一幀完畢時間 /*windows 繪圖用變量*/ HWND gameWND; /*window
15、窗口句柄*/ HBITMAP memBM; /*存位圖*/ HBITMAP memBMOld; /*存原始位圖*/ HDC memDC; /*存DC*/ RECT clientRC; /*客戶端矩形區(qū)域*/ HBRUSH blackBrush; /*黑色畫筆*/ HBRUSH stoneBrush;
16、 /*深灰色畫筆*/ HBRUSH shapeBrush[SHAPE_COUNT]; /*方塊畫筆,種方塊,每種一個*/ HPEN grayPen; /*灰色畫筆*/ HFONT bigFont; /*大字體,用來顯示游戲名字和Game Over*/ HFONT smallFont; /*小字體用來顯示幫助信息等*/ /*主要處理函數*/ int ma
17、xX() /*取最大坐標,函數名稱:maxX;函數功能:取得當前方塊的最大x坐標*/ { int i=0; /*取最大坐標,函數名稱:maxX;函數功能:取得當前方塊的最大x坐標*/ int x=current_coordinate[i][0]; /*取最大坐標,函數名稱:maxX;函數功能:取得當前方塊的最大x坐標*/ int m=x; /*取最大坐標,函數名稱:maxX;函數功能:取得當前方塊的最大x坐標*/ for (i=1;
18、 i 19、
return m; /*取最大坐標,函數名稱:maxX;函數功能:取得當前方塊的最大x坐標*/
}
int minX() /*取最小坐標,函數名稱:minX;函數功能:取得當前方塊的最小x坐標*/
{
int i=0; /*取最小坐標,函數名稱:minX;函數功能:取得當前方塊的最小x坐標*/
int x=current_coordinate[i][0]; /*取最小坐標,函數名稱:minX;函數功能:取得當前方塊的最小x坐標*/ 20、
int m=x; /*取最小坐標,函數名稱:minX;函數功能:取得當前方塊的最小x坐標*/
for (i=1; i 21、{
m=x; /*取最小坐標,函數名稱:minX;函數功能:取得當前方塊的最小x坐標*/
}
}
return m; /*取最小坐標,函數名稱:minX;函數功能:取得當前方塊的最小x坐標*/
}
/*逆時針旋轉方塊*/
void turn_left() /*函數名稱:turn_left ;函數功能:將當前方塊逆時針旋轉度*/
{
int i=0; /*函數名稱: 22、turn_left ;函數功能:將當前方塊逆時針旋轉度*/
int x,y; /*函數名稱:turn_left ;函數功能:將當前方塊逆時針旋轉度*/
for (i=0;i<4;i++) /*函數名稱:turn_left ;函數功能:將當前方塊逆時針旋轉度*/
{
x=current_coordinate[i][0]; /*函數名稱:turn_left ;函數功能:將當前方塊逆時針旋轉度*/
y=current_coordinate[i][1]; /*函數名 23、稱:turn_left ;函數功能:將當前方塊逆時針旋轉度*/
current_coordinate[i][0]=y; /*函數名稱:turn_left ;函數功能:將當前方塊逆時針旋轉度*/
current_coordinate[i][1]=-x; /*函數名稱:turn_left ;函數功能:將當前方塊逆時針旋轉度*/
}
}
/*順時針旋轉方塊*/
void turn_right() /*函數名稱:turn_right ;函數功能:將當前方塊順時針旋轉度*/
{
int i=0; 24、 /*函數名稱:turn_right ;函數功能:將當前方塊順時針旋轉度*/
int x,y; /*函數名稱:turn_right ;函數功能:將當前方塊順時針旋轉度*/
for (i=0;i<4;i++) /*函數名稱:turn_right ;函數功能:將當前方塊順時針旋轉度*/
{
x=current_coordinate[i][0]; /*函數名稱:turn_right ;函數功能:將當前方塊順時針旋轉度*/
y=current_coordinate[i 25、][1]; /*函數名稱:turn_right ;函數功能:將當前方塊順時針旋轉度*/
current_coordinate[i][0]=-y; /*函數名稱:turn_right ;函數功能:將當前方塊順時針旋轉度*/
current_coordinate[i][1]=x; /*函數名稱:turn_right ;函數功能:將當前方塊順時針旋轉度*/
}
}
/*檢查方塊是否越界*/
int out_of_table() /*函數名稱:out_of_table;函數功能:檢查當前方塊是否超出桌 26、面圍*/
{
int i=0; /*函數名稱:out_of_table;函數功能:檢查當前方塊是否超出桌面圍*/
int x,y; /*函數名稱:out_of_table;函數功能:檢查當前方塊是否超出桌面圍*/
for (i=0;i<4;i++) /*函數名稱:out_of_table;函數功能:檢查當前方塊是否超出桌面圍*/
{
x=shapex+current_c 27、oordinate[i][0]; /*函數名稱:out_of_table;函數功能:檢查當前方塊是否超出桌面圍*/
y=shapey+current_coordinate[i][1]; /*函數名稱:out_of_table;函數功能:檢查當前方塊是否超出桌面圍*/
if (x<0||x>(COLUMS-1)||y>(ROWS-1)) /*函數名稱:out_of_table;函數功能:檢查當前方塊是否超出桌面圍*/
{
return 1; /*函數名稱:ou 28、t_of_table;函數功能:檢查當前方塊是否超出桌面圍*/
}
if (table[y][x]) /*函數名稱:out_of_table;函數功能:檢查當前方塊是否超出桌面圍*/
{
return 1; /*函數名稱:out_of_table;函數功能:檢查當前方塊是否超出桌面圍*/
}
}
return 0; /*函數名稱:out_ 29、of_table;函數功能:檢查當前方塊是否超出桌面圍*/
}
/*旋轉方塊*/
void transform() /*函數名稱:transform; 函數功能:旋轉當前方塊*/
{
if (current==SquareShape) /*函數名稱:transform; 函數功能:旋轉當前方塊*/
{
return; /*函數名稱:transform; 函數功能:旋轉當前方塊*/
}
turn_right(); 30、 /*函數名稱:transform; 函數功能:旋轉當前方塊*/
if (out_of_table()) /*函數名稱:transform; 函數功能:旋轉當前方塊*/
{
turn_left(); /*函數名稱:transform; 函數功能:旋轉當前方塊*/
}
}
/*判斷方塊能否向左移動*/
int leftable() /*函數名稱:leftable;函數功能:判斷當前方塊能否向左移動, 31、能移動返回,否如此返回*/
{
int i=0; /*函數名稱:leftable;函數功能:判斷當前方塊能否向左移動,能移動返回,否如此返回*/
int x,y; /*函數名稱:leftable;函數功能:判斷當前方塊能否向左移動,能移動返回,否如此返回*/
for (i=0;i<4;i++) /*函數名稱:leftable;函數功能:判斷當前方塊能否向左移動,能移動返回,否如此返回*/
{
32、 x=shapex+current_coordinate[i][0]; /*函數名稱:leftable;函數功能:判斷當前方塊能否向左移動,能移動返回,否如此返回*/
y=shapey+current_coordinate[i][1]; /*函數名稱:leftable;函數功能:判斷當前方塊能否向左移動,能移動返回,否如此返回*/
if (x<=0||table[y][x-1]==1) /*函數名稱:leftable;函數功能:判斷當前方塊能否向左移動,能移動返回,否如此返回*/
{
return 0; 33、 /*函數名稱:leftable;函數功能:判斷當前方塊能否向左移動,能移動返回,否如此返回*/
}
}
return 1; /*函數名稱:leftable;函數功能:判斷當前方塊能否向左移動,能移動返回,否如此返回*/
}
/*判斷方塊能否向右移動*/
int rightable() /*函數名稱:rightable;函數功能:判斷當前方塊能否向右移動,能移動返回,否如此返回*/
{
int i=0; 34、 /*函數名稱:rightable;函數功能:判斷當前方塊能否向右移動,能移動返回,否如此返回*/
int x,y; /*函數名稱:rightable;函數功能:判斷當前方塊能否向右移動,能移動返回,否如此返回*/
for (i=0;i<4;i++) /*函數名稱:rightable;函數功能:判斷當前方塊能否向右移動,能移動返回,否如此返回*/
{
x=shapex+current_coordina 35、te[i][0]; /*函數名稱:rightable;函數功能:判斷當前方塊能否向右移動,能移動返回,否如此返回*/
y=shapey+current_coordinate[i][1]; /*函數名稱:rightable;函數功能:判斷當前方塊能否向右移動,能移動返回,否如此返回*/
if (x>=(COLUMS-1)||table[y][x+1]==1) /*函數名稱:rightable;函數功能:判斷當前方塊能否向右移動,能移動返回,否如此返回*/
{
return 0; /*函數名稱:rig 36、htable;函數功能:判斷當前方塊能否向右移動,能移動返回,否如此返回*/
}
}
return 1; /*函數名稱:rightable;函數功能:判斷當前方塊能否向右移動,能移動返回,否如此返回*/
}
/*判斷方塊能否向下移動*/
int downable() /*函數名稱:downable;函數功能:判斷當前方塊能否向下移動,能移動返回,否如此返回*/
{
int i=0; 37、 /*函數名稱:downable;函數功能:判斷當前方塊能否向下移動,能移動返回,否如此返回*/
int x,y;
for (i=0;i<4;i++) /*函數名稱:downable;函數功能:判斷當前方塊能否向下移動,能移動返回,否如此返回*/
{
x=shapex+current_coordinate[i][0]; /*函數名稱:downable;函數功能:判斷當前方塊能否向下移動,能移動返回,否如此返回*/
y=shapey+current_coordina 38、te[i][1]; /*函數名稱:downable;函數功能:判斷當前方塊能否向下移動,能移動返回,否如此返回*/
if (y>=(ROWS-1)||table[y+1][x]==1) /*函數名稱:downable;函數功能:判斷當前方塊能否向下移動,能移動返回,否如此返回*/
{
return 0; /*函數名稱:downable;函數功能:判斷當前方塊能否向下移動,能移動返回,否如此返回*/
}
}
return 1; 39、 /*函數名稱:downable;函數功能:判斷當前方塊能否向下移動,能移動返回,否如此返回*/
}
/*向左移動當前方塊*/
void move_left() /*函數名稱:move_left;函數功能:向左移動當前方塊*/
{
if (leftable()) /*函數名稱:move_left;函數功能:向左移動當前方塊*/
{
shapex--; /*函數名稱:move_left;函數功能:向左移動當前方塊* 40、/
}
}
/*向右移動當前方塊*/
void move_right() /*函數名稱:move_right;函數功能:向右移動方塊*/
{
if (rightable()) /*函數名稱:move_right;函數功能:向右移動方塊*/
{
shapex++; /*函數名稱:move_right;函數功能:向右移動方塊*/
}
}
/*向下移動當前方塊*/
void move_down() /*函數名稱:move_down; 41、函數功能:向下移動當前方塊*/
{
if (downable()) /*函數名稱:move_down;函數功能:向下移動當前方塊*/
{
shapey++; /*函數名稱:move_down;函數功能:向下移動當前方塊*/
}
else
{
if (add_to_table()) /*函數名稱:move_down;函數功能:向下移動當前方塊*/
{
remove_full(); /*函數名稱:move_down;函數 42、功能:向下移動當前方塊*/
next_shape(); /*函數名稱:move_down;函數功能:向下移動當前方塊*/
}
else
{
state=game_over; /*函數名稱:move_down;函數功能:向下移動當前方塊*/
}
}
}
/*將當前方塊固定到桌面上*/
int add_to_table() /*函數名稱:add_to_table;函數功能:將當前方塊固定到桌面上,假如返回,表示游戲完畢*/
{
int i=0 43、; /*函數名稱:add_to_table;函數功能:將當前方塊固定到桌面上,假如返回,表示游戲完畢*/
int x,y; /*函數名稱:add_to_table;函數功能:將當前方塊固定到桌面上,假如返回,表示游戲完畢*/
for (i=0;i<4;i++) /*函數名稱:add_to_table;函數功能:將當前方塊固定到桌面上,假如返回,表示游戲完畢*/
{
x=shapex+current_coord 44、inate[i][0]; /*函數名稱:add_to_table;函數功能:將當前方塊固定到桌面上,假如返回,表示游戲完畢*/
y=shapey+current_coordinate[i][1]; /*函數名稱:add_to_table;函數功能:將當前方塊固定到桌面上,假如返回,表示游戲完畢*/
if (y<0||table[y][x]==1) /*函數名稱:add_to_table;函數功能:將當前方塊固定到桌面上,假如返回,表示游戲完畢*/
{
return 0; /*函數名稱:add_t 45、o_table;函數功能:將當前方塊固定到桌面上,假如返回,表示游戲完畢*/
}
table[y][x]=1; /*函數名稱:add_to_table;函數功能:將當前方塊固定到桌面上,假如返回,表示游戲完畢*/
}
return 1; /*函數名稱:add_to_table;函數功能:將當前方塊固定到桌面上,假如返回,表示游戲完畢*/
}
/*刪除填滿的行*/
void remove_full() 46、 /*函數名稱:remove_full;函數功能:刪除桌面上填滿的行*/
{
int c=0; /*函數名稱:remove_full;函數功能:刪除桌面上填滿的行*/
int i,j; /*函數名稱:remove_full;函數功能:刪除桌面上填滿的行*/
for (i=ROWS-1;i>0;i--) 47、 /*函數名稱:remove_full;函數功能:刪除桌面上填滿的行*/
{
c=0; /*函數名稱:remove_full;函數功能:刪除桌面上填滿的行*/
for(j=0;j 48、 /*函數名稱:remove_full;函數功能:刪除桌面上填滿的行*/
}
if (c==COLUMS) /*函數名稱:remove_full;函數功能:刪除桌面上填滿的行*/
{
memmove(table[1],table[0],sizeof(int)*COLUMS*i); /*函數名稱:remove_full;函數功能:刪除桌面上填滿的行*/
memset(t 49、able[0],0,sizeof(int)*COLUMS); /*函數名稱:remove_full;函數功能:刪除桌面上填滿的行*/
score++; /*函數名稱:remove_full;函數功能:刪除桌面上填滿的行*/
speed=(score/100)%MAX_SPEED; /*函數名稱:remove_full;函數功能:刪除桌面上填滿的行*/
i++;
}
el 50、seif (c==0) /*函數名稱:remove_full;函數功能:刪除桌面上填滿的行*/
{
break;
}
}
}
//lijin
//創(chuàng)建新游戲
void new_game()
{
memset(table,0,sizeof(int)*COLUMS*ROWS);
start=clock();
next=random(SHAPE_COUNT);
score=0;
speed=0;
}
//運行游戲
void r 51、un_game()
{
finish=clock();
if ((finish-start)>(MAX_SPEED-speed)*100)
{
move_down();
start=clock();
InvalidateRect(gameWND,NULL,TRUE);
}
}
//操作當前方塊
void next_shape()
{
current=next;
memcpy(current_coordinate, shape_coordinate[next], sizeof(int)*BLOCK_COUNT*2);
shapex 52、=(COLUMS-((maxX(current)-minX(current)))) /2;
shapey=0;
next = random(SHAPE_COUNT);
}
//取隨機數
int random(int seed)
{
if (seed==0)
{
return 0;
}
srand((unsigned)time(NULL));
return (rand() % seed);
}
//繪圖
void paint()
{
PAINTSTRUCT ps;
HDC hdc;
draw_table();
hdc=B 53、eginPaint(gameWND,&ps);
BitBlt(hdc, clientRC.left, clientRC.top, clientRC.right, clientRC.bottom, memDC, 0, 0, SRCCOPY);
EndPaint(gameWND, &ps);
}
//繪制游戲桌面
void draw_table()
{
HBRUSH hBrushOld;
HPEN hPenOld;
HFONT hFontOld;
RECT rc;
int x0, y0, w;
int x, y, i, j;
char* str;
54、
w = clientRC.bottom / (ROWS+2);//一個方塊的寬度
x0 = y0 =w;
FillRect(memDC, &clientRC,blackBrush);//用黑色矩形填充桌面背景區(qū)
//如果游戲是開始或完畢狀態(tài)
if(state == game_start || state == game_over)
{
memcpy(&rc, &clientRC, sizeof(RECT));
rc.bottom =rc.bottom /2;
hFontOld= SelectObject(memDC, bigFont); 55、
SetBkColor(memDC,BLACK);
//如果游戲是開始狀態(tài),用黃色字顯示游戲開始畫面
if(state==game_start)
{
str = APP_TITLE;
SetTextColor(memDC,YELLOW);
}
else//如果游戲是完畢狀態(tài),用紅色字顯示GAME OVER
{
str = GAMEOVER;
SetTextColor(memDC,RED);
}
DrawText(memDC, str, strlen(str), &rc, DT_SINGLELINE | DT_CENTER | 56、DT_BOTTOM);
SelectObject(memDC, hFontOld);
hFontOld=SelectObject(memDC, smallFont);
rc.top= rc.bottom;
rc.bottom =rc.bottom *2;
if (state == game_over)
{
SetTextColor(memDC, YELLOW);
sprintf(score_char, SCORE, score);
DrawText(memDC, score_char, strlen(score_char), &rc 57、, DT_SINGLELINE | DT_CENTER | DT_TOP);
}
SetTextColor(memDC, STONE);
DrawText(memDC, press_enter, strlen(press_enter), &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
SelectObject(memDC, hFontOld);
return;
}
//畫桌面上殘留的方塊
hBrushOld =SelectObject(memDC, stoneBrush);
for (i=0 58、; i< ROWS; i++)
{
for (j=0;j 59、ent_coordinate[i][0]+shapex)*w;
y=y0+(current_coordinate[i][1]+shapey)*w;
if(x 60、ULL);
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+ROWS*w);
}
SelectObject(memDC,hPenOld);
//畫玩家得分
x0=x0+COLUMS*w+3*w;
y0=y0+w;
hFontOld=SelectObject(memDC,smallFont);//選擇字體
SetTextColor(memDC 61、,YELLOW);//設置字體顏色
sprintf(score_char,SCORE,score);
TextOut(memDC,x0,y0,score_char,strlen(score_char));//輸出得分
//畫下一個方塊
y0 +=w;
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++)
{
62、
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);
}
SelectObject(memDC,hBrushOld);
//打印幫助信息
x0=(COLUMS+2)*w;
y0+=4*w;
SetTextColor(memDC,GRAY);
i=0;
while(help[i])
{
TextOut(memDC,x0,y0,help[i],strlen(h 63、elp[i]));
y0+=w;
i++;
}
SelectObject(memDC,hFontOld);
}
//xueshuang
//處理按鍵
void key_down(WPARAM wParam)
{
/*如果游戲狀態(tài)不是運行狀態(tài),按下回車鍵*/
if(state !=game_run)
{
if(wParam==VK_RETURN)
{
switch(state )
{
case game_start:/*游戲開始狀態(tài)*/
next_shape();
state=game_run; 64、
break;
case game_pause:/*游戲暫停狀態(tài)*/
state=game_run;
break;
case game_over:/*游戲完畢狀態(tài)*/
new_game();
next_shape();
state=game_run;
break;
}
}
}
else/*如果游戲狀態(tài)是運行狀態(tài)*/
{
switch(wParam)
{
case VK_SPACE:
case VK_UP:
transform();/*按空格鍵或向上鍵,旋轉當前方塊*/
break 65、;
case VK_LEFT:
move_left();/*左移當前方塊*/
break;
case VK_RIGHT:
move_right();/*右移當前方塊*/
break;
case VK_DOWN:
move_down();/*下移當前方塊*/
break;
case VK_RETURN:
state=game_pause;/*回車鍵暫停游戲*/
break;
}
}
InvalidateRect(gameWND ,NULL,TRUE);
}
//改變窗口大小
void resize()
{
HD 66、C hdc;
LOGFONT lf;
hdc=GetDC(gameWND);
GetClientRect(gameWND,&clientRC);
SelectObject(memDC,memBMOld);
DeleteObject(memBM);
memBM = CreatepatibleBitmap(hdc,clientRC.right,clientRC.bottom);
memBMOld=SelectObject(memDC,memBM);
DeleteObject(bigFont );
memset (&lf,0,sizeof(LOGFONT));
lf.lfWidth=(clientRC.right-clientRC.left)/CHARS_IN_LINE;
lf.lfHeight=(clientRC.bottom-clientRC.top)/4;
lf.lfItalic=1;
lf.lfWeight=FW_BOLD;
bigFont=CreateFontIndirect(&lf);
DeleteOb
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。