俄罗斯方块编程 课程设计资料报告材料

上传人:痛*** 文档编号:83981141 上传时间:2022-05-02 格式:DOC 页数:30 大小:156KB
收藏 版权申诉 举报 下载
俄罗斯方块编程 课程设计资料报告材料_第1页
第1页 / 共30页
俄罗斯方块编程 课程设计资料报告材料_第2页
第2页 / 共30页
俄罗斯方块编程 课程设计资料报告材料_第3页
第3页 / 共30页
资源描述:

《俄罗斯方块编程 课程设计资料报告材料》由会员分享,可在线阅读,更多相关《俄罗斯方块编程 课程设计资料报告材料(30页珍藏版)》请在装配图网上搜索。

1、word 课程设计报告 题 目:俄罗斯方块设计 设 计 者:* * 专业班级:* * 学 号:* * 指导教师:* * 所属系部:* * * *年* *月* *日 、 目录 目录2 一.设计的目的和要求3 二.设计容3 三.设计任务3 四.游戏根本规如此3 五.总体设计4 六.详细设计与程序实现4 七.主要处理流程8 八.游戏设计源程序10 九.截图30 十 心得体会31 十一 参考文献31 一.设计的目的和要求 加深对《C语言》课程所学知识的理解,进一步巩固C语言语法规如此

2、。学会编制结构清晰、风格良好、数据结构适当的C语言程序,从而具备解决综合性实际问题的能力。  二.设计容 在熟练掌握C语言的根本知识:数据类型〔整形、实型、字符型、指针、数组、结构等〕;运算类型〔算术运算、逻辑运算、自增自减运算、赋值运算等〕;程序结构〔顺序结构、判断选择结构、循环结构〕;大程序的功能分解方法〔即函数的使用〕等。进一步掌握各种函数的应用,包括时间函数、绘图函数,以与文件的读写操作等。  三.设计任务 1.游戏欢迎界面。 2.游戏执行功能,包括计算得分。 3.游戏完毕界面。 四.游戏根本规如此 游戏共由7种不同形状的方块组成,游戏开始以后随机产生一个

3、方块由屏幕的顶端开始向下落下,落到低端如此固定到桌面,并开始下一个方块。在游戏窗口的左边作为游戏的桌面,用宽度10和高度20的表格表示。游戏桌面的右边靠上显示得分,最下边显示游戏帮助。如果固定到游戏桌面的方块超出了顶端游戏完毕。方块固定以后如果桌面上已经固定了的方块满一行,如此消除一行并将消除行之上的局部向下移动,消除一行得1分。根本操作如下: (1) 方块落下的过程中可以用左右方向键移动方块的位置。 (2) 上方向键用来旋转方块,即所谓的变形。 (3) 下方向键用来加速方块下落。 (4) 游戏中按下回车键暂停游戏。再次按回车键继续游戏。 五.总体设计 游戏以Window

4、s窗口的形式运行。窗口的左边作为游戏的桌面,桌面的大小是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,

6、-1},{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 #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 #def

10、ine 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 }; //枚举游戏的状态

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_coordi

13、nate[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;//下一个方块 shap

14、e 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; /*windo

15、w 窗口句柄*/ HBITMAP memBM; /*存位图*/ HBITMAP memBMOld; /*存原始位图*/ HDC memDC; /*存DC*/ RECT clientRC; /*客户端矩形区域*/ HBRUSH blackBrush; /*黑色画笔*/ HBRUSH stoneBrush;

16、 /*深灰色画笔*/ HBRUSH shapeBrush[SHAPE_COUNT]; /*方块画笔,种方块,每种一个*/ HPEN grayPen; /*灰色画笔*/ HFONT bigFont; /*大字体,用来显示游戏名字和Game Over*/ HFONT smallFont; /*小字体用来显示帮助信息等*/ /*主要处理函数*/ int

17、maxX() /*取最大坐标,函数名称:maxX;函数功能:取得当前方块的最大x坐标*/ { int i=0; /*取最大坐标,函数名称:maxX;函数功能:取得当前方块的最大x坐标*/ int x=current_coordinate[i][0]; /*取最大坐标,函数名称:maxX;函数功能:取得当前方块的最大x坐标*/ int m=x; /*取最大坐标,函数名称:maxX;函数功能:取得当前方块的最大x坐标*/ for (i=

18、1; 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; ix) /*取最小坐标,函数名称:minX;函数功能:取得当前方块的最小x坐标*/

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

25、[i][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

27、_coordinate[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; /*函数名称:

28、out_of_table;函数功能:检查当前方块是否超出桌面围*/ } if (table[y][x]) /*函数名称:out_of_table;函数功能:检查当前方块是否超出桌面围*/ { return 1; /*函数名称:out_of_table;函数功能:检查当前方块是否超出桌面围*/ } } return 0; /*函数名称:ou

29、t_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_coordi

35、nate[i][0]; /*函数名称:rightable;函数功能:判断当前方块能否向右移动,能移动返回,否如此返回*/ y=shapey+current_coordinate[i][1]; /*函数名称:rightable;函数功能:判断当前方块能否向右移动,能移动返回,否如此返回*/ if (x>=(COLUMS-1)||table[y][x+1]==1) /*函数名称:rightable;函数功能:判断当前方块能否向右移动,能移动返回,否如此返回*/ { return 0; /*函数名称:r

36、ightable;函数功能:判断当前方块能否向右移动,能移动返回,否如此返回*/ } } 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_coordi

38、nate[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_dow

41、n;函数功能:向下移动当前方块*/ { 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

43、=0; /*函数名称:add_to_table;函数功能:将当前方块固定到桌面上,假如返回,表示游戏完毕*/ int x,y; /*函数名称:add_to_table;函数功能:将当前方块固定到桌面上,假如返回,表示游戏完毕*/ for (i=0;i<4;i++) /*函数名称:add_to_table;函数功能:将当前方块固定到桌面上,假如返回,表示游戏完毕*/ { x=shapex+current_coo

44、rdinate[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

45、_to_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

49、(table[0],0,sizeof(int)*COLUMS); /*函数名称:remove_full;函数功能:删除桌面上填满的行*/ score++; /*函数名称:remove_full;函数功能:删除桌面上填满的行*/ speed=(score/100)%MAX_SPEED; /*函数名称:remove_full;函数功能:删除桌面上填满的行*/ i++; }

50、elseif (c==0) /*函数名称:remove_full;函数功能:删除桌面上填满的行*/ { break; } } } //lijin //创建新游戏 void new_game() { memset(table,0,sizeof(int)*COLUMS*ROWS); start=clock(); next=random(SHAPE_COUNT); score=0; speed=0; } //运行游戏 void

51、 run_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); shap

52、ex=(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

53、=BeginPaint(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);//用黑色矩形填充桌面背景区 //如果游戏是开始或完毕状态 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); //如果游戏是开始状态,用黄色字显示游戏开始画面 if(state==game_start) { str = APP_TITLE; SetTextColor(memDC,YELLOW); } else//如果游戏是完毕状态,用红色字显示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), &

57、rc, 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

58、=0; i< ROWS; i++) { for (j=0;j

59、rrent_coordinate[i][0]+shapex)*w; y=y0+(current_coordinate[i][1]+shapey)*w; if(x

60、,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+ROWS*w); } SelectObject(memDC,hPenOld); //画玩家得分 x0=x0+COLUMS*w+3*w; y0=y0+w; hFontOld=SelectObject(memDC,smallFont);//选择字体 SetTextColor(mem

61、DC,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

63、(help[i])); y0+=w; i++; } SelectObject(memDC,hFontOld); } //xueshuang //处理按键 void key_down(WPARAM wParam) { /*如果游戏状态不是运行状态,按下回车键*/ if(state !=game_run) { if(wParam==VK_RETURN) { switch(state ) { case game_start:/*游戏开始状态*/ next_shape(); state=game_ru

64、n; break; case game_pause:/*游戏暂停状态*/ state=game_run; break; case game_over:/*游戏完毕状态*/ new_game(); next_shape(); state=game_run; break; } } } else/*如果游戏状态是运行状态*/ { switch(wParam) { case VK_SPACE: case VK_UP: transform();/*按空格键或向上键,旋转当前方块*/ bre

65、ak; 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() {

66、HDC 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); Delete

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

相关资源

更多
正为您匹配相似的精品文档
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!