




已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
辽 宁 工 业 大 学 C语言程序设计 课程设计(论文)题目: 俄罗斯方块 院(系): 软件学院 专业班级: 楼宇智能化工程技术114班 学 号: 111407116 学生姓名: 王辉 指导教师: 胡 峰 教师职称: 助 教 起止时间: 2011.12.05至2011.12.18 课程设计(报告)任务及评语院(系):软件学院 教研室:软件教研窒学 号111407116学生姓名王辉专业班级楼宇智能化工程技术114班程序设计(报告)题目俄罗斯方块程序设计(报告)任务程序设计的任务与要求:(1)掌握C语言编程的基础知识。(2)较熟练地编写C语言应用程序。(3)了解C语言的常用标准函数、编程技巧、异常处理。(5)联系已学过的内容,巩固所学的理论,增强独立工作能力。(6)通过设计主要使学生有一个独立编写程序的过程,对理论学习及动手能力都有一个很大的提高。(7)通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素质的提高起一个积极的推动作用。课程设计过程中,要严格遵守实践环节的时间安排,听从指导教师的指导。正确地完成上述内容,记录实习日记,规范完整地撰写出课程设计报告。指导教师评语及成绩成绩: 指导教师签字: 2011 年 12 月 22 日辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)目 录第1章 课程设计的目的与要求11.1 课程设计目的11.2 课程设计的实验环境11.3 课程设计的预备知识11.4 课程设计要求1第2章 课程设计内容22.1课程设计题目22.2课程设计整体设计说明22.2.1课程设计内容22.2.2系统功能模块结构图22.2.3数据结构设计及用法说明22.2.4程序结构(画流程图)22.2.5各模块的功能22.3程序源代码及注释2第3章 课程设计总结3参考资料4第1章 课程设计的目的与要求1.1 课程设计目的本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完程序设计语言(C)课程后进行的一次全面的综合练习。本课程设计的目的和任务: 1. 巩固和加深学生对C语言课程的基本知识的理解和掌握 2. 掌握C语言编程和程序调试的基本技能 3. 利用C语言进行基本的软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用C语言解决实际问题的能力1.2 课程设计的实验环境硬件要求能运行Windows 2000/XP操作系统的微机系统。C语言程序设计及相应的开发环境。1.3 课程设计的预备知识熟悉C语言及C语言开发工具。1.4 课程设计要求1. 分析课程设计题目的要求2. 写出详细设计说明3. 编写程序代码,调试程序使其能正确运行4. 设计完成的软件要便于操作和使用5. 设计完成后提交课程设计报告第2章 课程设计内容2.1程序功能介绍俄罗斯方块游戏功能描述图(1) 游戏方块预览功能。在游戏过程中,当在游戏底板中出现一个游戏方块时,必须在游戏方块预览区域中出现下一个游戏方块,这样有利于游戏玩家控制游戏的策略。由于在此游戏中存在19种不同的游戏方块,所以在游戏方块预览区域中需要显示随机生成的游戏方块。(2) 游戏方块控制功能。通过各种条件的判断,实现对游戏方块的左移、右移、快速下移、自由下落、旋转功能,以及行满消除行的功能。(3) 游戏显示更新功能。当游戏方块左右移动、下落、旋转时,要清除先前的游戏方块,用新坐标重绘游戏方块。当消除满行时,要重绘游戏底板的当前状态。(4) 游戏速度分数更新功能。在游戏玩家进行游戏过程中,需要按照一定的游戏规则给玩家计算游戏分数。比如,消除一行加10分。当游戏分数达到一定数量之后,需要给游戏者进行等级的上升,每上升一个等级,游戏方块的下落速度将加快,游戏的难度将增加。(5) 游戏帮助功能。玩家进入游戏后,将有对本游戏如何操作的友情提示。2.2程序整体设计说明2.2.1设计思路新游戏方块将在如图3.2所示的44的正方形小方块中预览。使用随机函数rand()来产生119之间的游戏方块编号,并作为预览的方块编号。其中的正方形小方块的大小为BSIZEBSIZE。BSIZE为设定的像素大小。游戏方块预览图2.2.2数据结构设计及用法说明 游戏底板BOARD结构体 Struct BOARD Int var; Int color; Table_boardVertical_boxsHorizontal_boxs; BOARD结构体表示游戏底板中每个小方块所具有的属性。其中var表示小方块当前状态,只有0与1两个值,表示此小方块已被占用,0表示未被占用。Color表示小方块的颜色,游戏底板的每个小方块可以拥有不同的颜色,以增强美观。Vertical_boxs为游戏底板上垂直的方向上小方块的个数,Horizontal_boxs为游戏底板上水平的方向上小方块的个数。游戏方块SHAPE结构体 struct SHAPE char box2; int color; /*每个方块的颜色*/ int next; /*下个方块的编号*/ ; SHAPE结构体表示某个游戏方块具有的属性。其中,char box2表示用2个字节来表示这个游戏方块的形状。每4位来表示一个游戏方块的一行。Color表示每个游戏方块的颜色,颜色可设为BLACK、BLUE、GREEN、CYAN、RE、MAGENTA、BROWN、LIGHTGRAY、DARKGRAY、LIGHTBLUE、LIGHTCYAN、LIGHTRED、LIGHTMAGENTA、YELLOW和WHITE。 next表示下个游戏方块的编号,在旋转时需要用到此编号。 如box0=0x88,box1=0xc0,其中0x88和0xc0为十六进制表示形式,具体表现的含义如图3.3所示。SHAPE结构示意图2.2.3程序结构(流程图) 2.2.4各模块的功能及程序说明 左移的实现过程如下: (1) 判断在当前的游戏底板中能否左移。这一判断必须满足如下两条件:游戏方块整体左移一位后,游戏方块不能超越游戏底板的左边线,否则越界;并且在游戏方块有值(值为1)的位置,游戏底板必须是没有被占用的(占用时,值为1)。若满足这两个条件,则执行下面的左移动作。否则不执行左移动作。 (2) 清除左移前的游戏方块。 (3) 在左移一位的位置,重新显示此游戏方块。 右移的实现过程如下: (1) 判断在当前游戏底板中能否右移。这一判断必须满足如下两个条件:游戏方块整体右移一位后,游戏方块不能超越游戏底板的右边线,否则越界;并且在游戏方块有值(值为1)的位置,游戏底板必须是没有被占用的(占用时,值为1)。若满足这两个条件,则执行下面的右移动作。否则不只执行右移动作。 (2) 清除右移前的游戏方块。 (3) 在右移一位的位置,重新显示此游戏方块。 下移的实现过程如下: (1) 判断在当前游戏底板中能否下移。这一判断必须满足如下两个条件:游戏方块整体下移一位后,游戏方块不能超越游戏底板的底边线,否则越界;并且在游戏方块有值(值为1)的位置,游戏底板必须是没有被占用的(占用时,值为1)。若满足这两个条件,则执行下面的下移动作。否则,将flag_newbox标志置1,主循环中会判断此标志,若为1,则会生成下一个游戏方块,并更新预览游戏方块。 (2) 清除下移前的游戏方块。 (3) 在下移一位的位置,重新显示此游戏方块。旋转的实现过程如下: (1) 判断在当前游戏底板中能否旋转。这一判断必须满足如下条件:游戏方块整旋转后,游戏方块不能超越游戏底板的左边线、右边线和底边线,否则越界;并且在游戏方块有值(值为1)的位置,游戏底板必须是没有被占用的(占用时,值为1)。若满足这些条件,则执行下面的旋转动作。否则不只执行旋转动作。 (2) 清除旋转前的游戏方块。 (3) 在游戏方块显示区域(44)不变的位置,利用保存当前游戏方块的数据结构中的next值作为旋转后形成的新游戏方块的编号,并重新显示这个编号的游戏方块。 当生成新的游戏方块前,执行行满的检查,判断行满的过程为: 一次从下到上扫描游戏底板中的各行,若某行中1的个数等于游戏底板水平方向上的小方块的个数,则表示此行是满的。找到满行后,立即将游戏底板中的数据往下顺移一行,直到游戏底板逐行扫描完毕。2.2.5程序结果 当用户刚进入游戏时,如图4.2所示。此时,分数初始化为0,等级默认为1。游戏当前设置为成绩每增加30分等级就升一级,升级后游戏方块在原来基础上下落速度有所加快,这主要是变化了定时器的时间间隔的缘故。用户可使用键盘左移键、右移键、上移键和下移键,分别进行左移、右移、旋转和下落操作。用户可按ESC键退出游戏。游戏初始状态下图为游戏等级提升了一级后的状态,级别越高,游戏方块下落速度越快。图4.3 游戏进行状态2.3程序源代码及注释/*加载头文件*/#include #include #include #include /*图形函数库*/*定义按键码*/#define VK_LEFT 0x4b00#define VK_RIGHT 0x4d00#define VK_DOWN 0x5000#define VK_UP 0x4800#define VK_ESC 0x011b#define TIMER 0x1c /*设置中断号*/*定义常量*/#define MAX_BOX 19 /*总共有19种各形态的方块*/#define BSIZE 20 /*方块的边长是20个象素*/#define Sys_x 160 /*显示方块界面的左上角x座标*/#define Sys_y 25 /*显示方块界面的左上角y座标*/#define Horizontal_boxs 10 /*水平的方向以方块为单位的长度*/#define Vertical_boxs 15 /*垂直的方向以方块为单位的长度*/#define Begin_boxs_x Horizontal_boxs/2 /*产生第一个方块时出现的起始位置*/#define FgColor 3 /*前景颜色,如文字.2-green*/#define BgColor 0 /*背景颜色.0-blac*/#define LeftWin_x Sys_x+Horizontal_boxs*BSIZE+46 /*右边状态栏的x座标*/#define false 0#define true 1/*移动的方向*/#define MoveLeft 1#define MoveRight 2#define MoveDown 3#define MoveRoll 4/*以后坐标的每个方块可以看作是像素点是BSIZE*BSIZE的正方形*/*定义全局变量*/int current_box_numb; /*保存当前方块编号*/int Curbox_x=Sys_x+Begin_boxs_x*BSIZE,Curbox_y=Sys_y; /*x,y是保存方块的当前坐标的*/int flag_newbox=false; /*是否要产生新方块的标记0*/int speed=0; /*下落速度*/int score=0; /*总分*/int speed_step=30; /*每等级所需要分数*/void interrupt (*oldtimer)(void); /* 指向原来时钟中断处理过程入口的中断处理函数指针 */struct BOARD /*游戏底板结构,表示每个点所具有的属性*/ int var; /*当前状态 只有0和1,1表示此点已被占用*/ int color; /*颜色,游戏底板的每个点可以拥有不同的颜色.增强美观*/Table_boardVertical_boxsHorizontal_boxs;/*方块结构*/struct SHAPE char box2; /*一个字节等于8位,每4位来表示一个方块的一行 如:box0=0x88,box1=0xc0表示的是: 1000 1000 1100 0000*/ int color; /*每个方块的颜色*/ int next; /*下个方块的编号*/;/*初始化方块内容.即定义MAX_BOX个SHAPE类型的结构数组,并初始化*/struct SHAPE shapesMAX_BOX=/* * 口 口口口 口口 口 * 口 口 口 口口口 * 口口 口 */ 0x88, 0xc0, CYAN, 1, 0xe8, 0x0, CYAN, 2, 0xc4, 0x40, CYAN, 3, 0x2e, 0x0, CYAN, 0,/* * 口 口口 口口口 * 口 口 口 口 * 口口 口口口 口 */ 0x44, 0xc0, MAGENTA, 5, 0x8e, 0x0, MAGENTA, 6, 0xc8, 0x80, MAGENTA, 7, 0xe2, 0x0, MAGENTA, 4,/* * 口 * 口口 口口 * 口 口口 */ 0x8c, 0x40, YELLOW, 9, 0x6c, 0x0, YELLOW, 8,/* * 口 口口 * 口口 口口 * 口 */ 0x4c, 0x80, BROWN, 11, 0xc6, 0x0, BROWN, 10,/* * 口 口 口 * 口口口 口口 口口口 口口 * 口 口 口 */ 0x4e, 0x0, WHITE, 13, 0x8c, 0x80, WHITE, 14, 0xe4, 0x0, WHITE, 15, 0x4c, 0x40, WHITE, 12,/* 口 * 口 * 口 口口口口 * 口 */ 0x88, 0x88, RED, 17, 0xf0, 0x0, RED, 16,/* * 口口 * 口口 */ 0xcc, 0x0, BLUE, 18;unsigned int TimerCounter=0; /*定时计数器变量*/void main() int GameOver=0; int key,nextbox; int Currentaction=0;/*标记当前动作状态*/ int gd=VGA,gm=VGAHI,errorcode; initgraph(&gd,&gm,); errorcode = graphresult(); if (errorcode != grOk) printf(nNotice:Graphics error: %sn, grapherrormsg(errorcode); printf(Press any key to quit!); getch(); exit(1); setbkcolor(BgColor); setcolor(FgColor); randomize(); SetTimer(newtimer); initialize(Sys_x,Sys_y,Horizontal_boxs,Vertical_boxs);/*初始化*/ nextbox=MkNextBox(-1); show_box(Curbox_x,Curbox_y,current_box_numb,shapescurrent_box_numb.color); show_box(LeftWin_x,Curbox_y+200,nextbox,shapesnextbox.color); show_intro(Sys_x,Curbox_y+320); getch(); while(1) /* Currentaction=0; flag_newbox=false; 检测是否有按键*/ if (bioskey(1)key=bioskey(0); else key=0; switch(key) case VK_LEFT: if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveLeft) EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_x-=BSIZE;Currentaction=MoveLeft; break; case VK_RIGHT: if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveRight) EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_x+=BSIZE;Currentaction=MoveRight; break; case VK_DOWN: if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown) EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_y+=BSIZE;Currentaction=MoveDown; else flag_newbox=true; break; case VK_UP:/*旋转方块*/ if(MoveAble(Curbox_x,Curbox_y,shapescurrent_box_numb.next,MoveRoll) EraseBox(Curbox_x,Curbox_y,current_box_numb);current_box_numb=shapescurrent_box_numb.next; Currentaction=MoveRoll; break; case VK_ESC: GameOver=1; break; default: break; if(Currentaction) /*表示当前有动作,移动或转动*/ show_box(Curbox_x,Curbox_y,current_box_numb,shapescurrent_box_numb.color); Currentaction=0; /*按了往下键,但不能下移,就产生新方块*/ if(flag_newbox) /*这时相当于方块到底部了,把其中出现点满一行的清去,置0*/ ErasePreBox(LeftWin_x,Sys_y+200,nextbox); nextbox=MkNextBox(nextbox); show_box(LeftWin_x,Curbox_y+200,nextbox,shapesnextbox.color); if(!MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown)/*刚一开始,游戏结束*/ show_box(Curbox_x,Curbox_y,current_box_numb,shapescurrent_box_numb.color); GameOver=1; else flag_newbox=false; Currentaction=0; else /*自由下落*/ if (Currentaction=MoveDown | TimerCounter (20-speed*2) if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown) EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_y+=BSIZE; show_box(Curbox_x,Curbox_y,current_box_numb,shapescurrent_box_numb.color); TimerCounter=0; if(GameOver )/*| flag_newbox=-1*/ printf(game over,thank you! your score is %d,score); getch(); break; getch(); KillTimer(); closegraph();void initialize(int x,int y,int m,int n) int i,j,oldx; oldx=x; for(j=0;jn;j+) for(i=0;i=t_boardy;n-) if(n=Vertical_boxs )continue; /*超过低线了*/ for(m=0;mHorizontal_boxs;m+) /*水平的方向*/ if(!Table_boardn+full_numbm.var)break; /*发现有一个是空就跳过该行*/ if(m=Horizontal_boxs) /*找到满行了*/ if(n=t_boardy+3) /*第一次献给了n,最高的*/ top=DelFullRow(n+full_numb); /*清除游戏板里的该行,并下移数据*/ else DelFullRow(n+full_numb); full_numb+; /*统计找到的行数*/ if(full_numb) int oldx,x=Sys_x,y=BSIZE*top+Sys_y; oldx=x; score=score+full_numb*10; /*加分数*/ /*这里相当于重显调色板*/ for(n=top;n=Vertical_boxs)continue; /*超过低线了*/ for(m=0;m=0;n-)/*从当前行往上看*/ totoal=0; for(m=0;mHorizontal_boxs;m+) if(!Table_boardnm.var)totoal+; /*没占有方格+1*/ if(Table_boardnm.var!=Table_boardn-1m.var) /*上行不等于下行就把上行传给下行 xor关系*/ Table_boardnm.var=Table_boardn-1m.var; Table_boardnm.color=Table_boardn-1m.color; if(totoal=Horizontal_boxs) /*发现上面有连续的空行提前结束*/ top=n; break; return(top); /*返回最高点*/* *显示指定的方块 */void show_box(int x,int y,int box_numb,int color) int i,ii,ls_x=x; if(box_numb=MAX_BOX)/*指定的方块不存在*/ box_numb=MAX_BOX/2; setfillstyle(SOLID_FILL,color); for(ii=0;ii2;ii+) int mask=128; for(i=0;i8;i+) if(i%4=0 & i!=0) /*表示转到方块的下一行了*/ y+=BSIZE; x=ls_x; if(shapesbox_numb.boxii)&mask) bar(x,y,x+BSIZE,y+BSIZE); line(x,y,x+BSIZE,y); line(x,y,x,y+BSIZE); line(x,y+BSIZE,x+BSIZE,y+BSIZE); line(x+BSIZE,y,x+BSIZE,y+BSIZE); x+=BSIZE; mask/=2; y+=BSIZE; x=ls_x; /* * 擦除(x,y)位置开始的编号为box_numb的box. */void EraseBox(int x,int y,int box_numb) int mask=128,t_boardx,t_boardy,n,m; setfillstyle(SOLID_FILL,BgColor); for(n=0;n4;n+) for(m=0;m4;m+) /*看最左边四个单元*/ if( (shapesbox_numb.boxn/2) & mask) )/*最左边有方块并且当前游戏板也有方块*/ bar(x+m*BSIZE,y+n*BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE+BSIZE); line(x+m*BSIZE,y+n*BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE); line(x+m*BSIZE,y+n*BSIZE,x+m*BSIZE,y+n*BSIZE+BSIZE); line(x+m*BSIZE,y+n*BSIZE+BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE+BSIZE); line(x+m*BSIZE+BSIZE,y+n*BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE+BSIZE); mask=mask/(2); if(mask=0)mask=128; void ErasePreBox(int x,int y,int box_numb) int mask=128,t_boardx,t_boardy,n,m; setfillstyle(SOLID_FILL,BgColor); for(n=0;n4;n+) for(m=0;m4;m+) /*看最左边四个单元*/ if( (shapesbox_numb.boxn/2) & mask) )/*最左边有方块并且当前游戏板也有方块*/ bar(x+m*BSIZE,y+n*BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE+BSIZE); mask=mask/(2); if(mask=0)mask=128; /* * 将新形状的方块放置在游戏板上,并返回此方块号 */int MkNextBox(int box_numb) int mask=128,t_boardx,t_boardy,n,m; t_boardx=(Curbox_x-Sys_x)/BSIZE; t_boardy=(Curbox_y-Sys_y)/BSIZE; for(n=0;n4
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年石英玻璃光掩模基片项目立项申请报告模板
- 2025年中国便携卷烟器行业市场分析及投资价值评估前景预测报告
- 图书馆吊顶施工方案
- 变压器及配电室建设项目风险评估报告
- 甲醇手套应急预案
- 3.1 重要的自然资源 说课稿-2023-2024学年八年级地理上学期仁爱科普版
- 幕墙系统综合测试与调试方案
- xx镇集中供水工程风险评估报告
- Unit 1 I'm Sam.教学设计-2025-2026学年小学英语三年级上册外研版(三起)(陈琳主编)
- 版权清算合同
- 资阳产业投资集团有限公司第三轮一般员工市场化招聘笔试参考题库附答案解析
- 2025年淮南市大通区和寿县经开区公开招聘社区“两委”后备干部30名笔试备考题库及答案解析
- 《文献检索与科技论文写作入门》课件(共八章)
- 2025云南红河红家众服经营管理有限公司社会招聘工作人员8人笔试参考题库附带答案详解
- 共享实验室合作协议书
- 城管协管员面试题目及答案
- DL-T 794-2024 火力发电厂锅炉化学清洗导则
- 天津市受问责干部管理办法
- 内科进修汇报护理
- 口腔咨询师沟通技巧培训
- T/CSWSL 004-2018饲料原料酿酒酵母发酵白酒糟
评论
0/150
提交评论