下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、c语言课程设计俄罗斯方块源代码1、 c语言课程设计俄罗斯方块源代码2、3、 4、 编辑整理:5、6、7、8、9、 尊敬的读者朋友们:10、 这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(c语言课程设计俄罗斯方块源代码)的内容能够给您的工作和学习带来便利。同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。11、 本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快 业绩进步,以下为c语言课程设计俄罗斯方块源代码的全部内容。12、13、 新建“。h”头文件,将
2、“头文件”代码粘贴至其中,14、 新建“。c”源文件,将“源代码代码粘贴到其中。15、 新建空白工程,将头文件和源代码添加进去,调试使用./头文件/1。自定义枚举类型,定义7种形态的游戏方块typedef enum tetris_shapezshape=0,sshape,lineshape,tshape,squareshape,lshape,mirroredlshapeshape;/2。函数声明/(1)操作方块函数int maxx();/取得当前方块的最大x坐标int minx();/取得当前方块的最小x坐标void turn_left();/当前方块逆时针旋转90度void turn_rig
3、ht();int out_of_table();void transform();int leftable();int rightable();int downable();void move_left();void move_right();/(2)操作游戏桌面的函数int add_to_table();void remove_full();/(3)控制游戏函数void new_game();void run_game();void next_shape();int random(int seed);/(4)绘图函数void paint();void draw_table();/(5)其他功
4、能函数void key_down(wparam wparam);void resize();void initialize();void finalize();/(6)回调函数,用来处理windows消息lresult callback wndproc (hwnd,uint,wparam,lparam);/源代码/1.文件包含includeincludetime。hincludestdio.h#include”tetris.h/2.常量定义define app_name ”tetrisdefine app_title tetris game”#define gameover game over
5、”define shape_count 7#define block_count 4define max_speed 5define colums 10#define rows 20define 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 %4
6、d/3.全局变量定义/(1)char score_charchars_in_line=0;/(2)char press_enter=”press enter key。.。”;/(3)帮助提示信息char *help=press space or up key to transform shape.,press left or right key to mover shape。,”press down key to speed up.”,”press enter key to pause game。”,enjoy it。:-)”,0;/(4)枚举游戏的状态enum game_stategame_
7、start,game_run,game_pause,game_over,state=game_start;/(5)定义方块的颜色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);/(6)方块的7中类型int shape_coordinateshape_countblock_count2=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,
8、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;/(7)得分int score=0;/(8)下一个方块shape next=0;/(9)当前方块shape current=0;/(10)当前方块的每一部分坐标int current_coordinate42=0;/(11)游戏桌面int tablerowscolums=0;/(12)当前方块的x坐标int shapex=0;/(13)当前方块的y坐标int shapey=0;/(14)方块下移速度int speed=0;/(15)每一帧开始时间clock_t start=0;
9、/(16)每一帧结束时间clock_t finish=0;/(17)windows绘图用变量hwnd gamewnd;hbitmap membm;hbitmap membmold;hdc memdc;rect clientrc;hbrush blackbrush;hbrush stonebrush;hbrush shapebrushshape_count;hpen graypen;hfont bigfont;hfont smallfont;/4。主要处理函数/(1)取最大坐标int maxx()int i=0;int x=current_coordinatei0;int m=x;for(i=1
10、;iblock_count;i+)x=current_coordinatei0;if(mx)m=x;return m;/(3)逆时针转动方块void turn_left()int i=0;int x,y;for(i=0;i4;i+)x=current_coordinatei0;y=current_coordinatei1;current_coordinatei0=y;current_coordinatei1=-x;/(4)顺时针旋转方块void turn_right()int i=0;int x,y;for(i=0;i(colums-1)|y(rows1))return 1;if(tabley
11、x)return 1;return 0;/(6)旋转方块void transform()if(current=squareshape)return ;turn_right();if(out_of_table()turn_left();/(7)判断方块是否向左移动int leftable()int i=0;int x,y;for(i=0;i=(colums-1)tableyx+1=1)return 0;return 1;/(9)判断方块是否向下移动int downable()int i=0;int x,y;for(i=0;i=(rows1)|tabley+1x=1)return 0;return
12、 1;/(10)向左移动当前方块void move_left()if(leftable()shapex-;/(11)向右移动当前方块void move_right()if(rightable()shapex+;/(12)向下移动当前方块void move_down()if(downable())shapey+;elseif(add_to_table()remove_full();next_shape();elsestate=game_over;/(13)将当前方块固定到桌面上int add_to_table()int i=0;int x,y;for(i=0;i4;i+)x=shapex+cur
13、rent_coordinatei0;y=shapey+current_coordinatei1;if(y0|tableyx=1)return 0;tableyx=1;return 1;/(14)删除填满的行void remove_full()int c=0;int i,j;for(i=rows-1;i0;i-)c=0;for(j=0;j(max_speed-speed)100)move_down();start=clock();invalidaterect(gamewnd,null,true);/(17)操作当前方块void next_shape()current=next;memcpy(cu
14、rrent_coordinate,shape_coordinatenext,sizeof(int)*block_count2);shapex=(colums((maxx(current)minx(current))))/2;shapey=0;next=random(shape_count);/(18)取随机数 int random(int seed) if(seed=0) return 0; srand(unsigned)time(null)); return (rand()seed); /(19)绘图 void paint() paintstruct ps; hdc hdc; draw_ta
15、ble(); hdc=beginpaint(gamewnd,&ps); bitblt(hdc,clientrc。left,clientrc。top,clientrc.right,clientrc。bottom,memdc,0,0,srccopy); endpaint(gamewnd,ps); /(20)绘制游戏桌面 void draw_table() hbrush hbrushold; hpen hpenold; hfont hfontold; rect rc; int x0,y0,w; int x,y,i,j; char str; w=clientrc。bottom/(rows+2); x0
16、=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); setbkcolor(memdc,black); /如果游戏是开始状态,用黄色字显示游戏开始画面 if(state=game_start) str=app_title; settextcolor(memdc,yellow
17、); /如果游戏是结束状态,用红色字显示game over else str=gameover; settextcolor(memdc,red); drawtext(memdc,str,strlen(str),rc,dt_singlelinedt_center|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)
18、; sprintf(score_char,score,score); drawtext(memdc,score_char,strlen(score_char),rc,dt_singlelinedt_center|dt_top); settextcolor(memdc,stone); drawtext(memdc,press_enter,strlen(press_enter),&rc,dt_singlelinedt_center|dt_vcenter); selectobject(memdc,hfontold); return; /桌面上残留的方块 hbrushold=selectobject(
19、memdc,stonebrush); for(i=0;irows;i+) for(j=0;jcolums;j+) if(tableij=1) x=x0+jw; y=y0+iw; rectangle(memdc,x,y,x+w+1,y+w+1); selectobject(memdc,hbrushold); /画当前的方块 hbrushold=selectobject(memdc,shapebrushcurrent); for(i=0;i4;i+) x=x0+(current_coordinatei0+shapex)*w; y=y0+(current_coordinatei1+shapey)w;
20、 if(xx0yy0) continue; rectangle(memdc,x,y,x+w+1,y+w+1); 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+iw); for(i=0;i=colums;i+) movetoex(memdc,x0+i*w,y0,null); lineto(memdc,x0+i*w,y0+rowsw)
21、; selectobject(memdc,hpenold); /画玩家得分 x0=x0+colums*w+3w; y0=y0+w; hfontold=selectobject(memdc,smallfont); settextcolor(memdc,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+=w; y
22、0+=2*w; hbrushold=selectobject(memdc,shapebrushnext); for(i=0;i4;i+) x=x0+shape_coordinatenexti0w; y=y0+shape_coordinatenexti1w; 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(helpi) textout(memdc,x0,y0,helpi,str
23、len(helpi); y0+=w; i+; selectobject(memdc,hfontold); /(21)处理按键 void key_down(wparam wparam) /如果游戏不是运行状态,按下回车键 if(state!=game_run) if(wparam=vk_return) switch(state)case game_start:next_shape();state=game_run;break;case game_pause:state=game_run;break;case game_over:new_game();next_shape();state=game
24、_run;break; /如果游戏状态是运行 else switch(wparam) case vk_space: case vk_up: transform(); break; 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); /(22)改变窗口大小 void resize() hdc
25、hdc; logfont lf; hdc=getdc(gamewnd); getclientrect(gamewnd,clientrc); selectobject(memdc,membmold); deleteobject(membm); membm=createcompatiblebitmap(hdc,clientrc。right,clientrc.bottom); membmold=selectobject(memdc,membm); deleteobject(bigfont); memset(&lf,0,sizeof(logfont)); lf。lfwidth=(clientrc。ri
26、ght-clientrc。left)/chars_in_line; lf.lfheight=(clientrc.bottom-clientrc.top)/4; lf.lfitalic=1; lf.lfweight=fw_bold; bigfont=createfontindirect(lf); deleteobject(smallfont); lf.lfheight=clientrc。bottom/(rows+2); lf。lfwidth=lf.lfheight/2; lf。lfitalic=0; lf。lfweight=fw_normal; smallfont=createfontindir
27、ect(&lf); releasedc(gamewnd,hdc); /(23)处理消息 lresult callback wndproc(hwnd hwnd,uint message,wparam wparam,lparam lparam) switch(message) case wm_size: resize(); return 0; case wm_erasebkgnd: return 0; case wm_paint: paint(); return 0; case wm_keydown: key_down(wparam); return 0; case wm_destroy: pos
28、tquitmessage(0); return 0; /其他消息用windows默认的消息处理函数处理return defwindowproc(hwnd,message,wparam,lparam); /(24)初始化 void initialize() logfont lf; hdc hdc; int i; hdc=getdc(gamewnd); getclientrect(gamewnd,clientrc); memdc=createcompatibledc(hdc); membm=createcompatiblebitmap(hdc,clientrc。right,clientrc.bot
29、tom); membmold=selectobject(memdc,membm); blackbrush=createsolidbrush(black); stonebrush=createsolidbrush(stone); /创建每个方块对应颜色的画笔 for(i=0;ishape_count;i+) shapebrushi=createsolidbrush(shape_colori); graypen=createpen(ps_solid,1,gray); memset(lf,0,sizeof(logfont)); /创建一个大字体 lf。lfwidth=(clientrc.right-
30、clientrc。left)/chars_in_line; lf.lfheight=(clientrc。bottomclientrc.top)/4; lf。lfitalic=0; lf。lfweight=fw_normal; smallfont=createfontindirect(&lf); releasedc(gamewnd,hdc); /(25)释放资源 void finalize() int i=0; deleteobject(blackbrush); deleteobject(stonebrush); for(i=0;ishape_count;i+) deleteobject(shapebrushi); deleteobject(graypen); deleteobject(bigfont); deleteobject(smallfont); selectobject(memdc,membmold); deleteobj
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024委托保证合同和保证合同【业主支付委托保证合同】
- 深圳预售房合同范例
- 私人借款房产抵押合同模板
- 租鸡棚合同范例
- 浙江企业劳动合同模板
- 二零二四年度版权转让合同:甲方转让音乐作品版权给乙方
- 二零二四年度企业合同管理与纠纷解决协议
- 离职证明解聘合同范例
- 二零二四年技术研发与合作合同:人工智能语音识别技术
- 消费材料合同范例
- 糖尿病酮症酸中毒的急诊处置
- 2024年度国际市场营销课件
- 扎实推进安全体系建设范文
- 钓鱼黑坑策划方案
- 中国古诗词艺术歌曲的审美特征与美学价值
- 简单公园设计平面图手绘图
- 肝血管瘤护理教学查房范文课件
- 第7课《珍视亲情+学会感恩》第2框《理解父母+学会感恩》【中职专用】《心理健康与职业生涯》(高教版2023基础模块)
- 危险化学品常识(一书一签)
- 医疗质量安全管理风险防范专项整顿督查表
- 2023燃气工程分包合同正规版
评论
0/150
提交评论