ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:121.23KB ,
资源ID:6977876      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-6977876.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(c语言俄罗斯方块.docx)为本站会员(b****3)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

c语言俄罗斯方块.docx

1、c语言 俄罗斯方块辽 宁 工 业 大 学 C语言程序设计 课程设计(论文)题目: 俄罗斯方块 院(系): 软件学院 专业班级: 楼宇智能化工程技术114班 学 号: 111407116 学生姓名: 王辉 指导教师: 胡 峰 教师职称: 助 教 起止时间: 2011.12.05至2011.12.18 课程设计(报告)任务及评语院(系):软件学院 教研室:软件教研窒学 号111407116学生姓名王辉专业班级楼宇智能化工程技术114班程序设计(报告)题目俄罗斯方块程序设计(报告)任务程序设计的任务与要求:(1)掌握C语言编程的基础知识。(2)较熟练地编写C语言应用程序。(3)了解C语言的常用标准函

2、数、编程技巧、异常处理。(5)联系已学过的内容,巩固所学的理论,增强独立工作能力。(6)通过设计主要使学生有一个独立编写程序的过程,对理论学习及动手能力都有一个很大的提高。(7)通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素质的提高起一个积极的推动作用。课程设计过程中,要严格遵守实践环节的时间安排,听从指导教师的指导。正确地完成上述内容,记录实习日记,规范完整地撰写出课程设计报告。指导教师评语及成绩成绩: 指导教师签字: 2011 年 12 月 22 日第1章 课程设计的目的与要求1.1 课程设计目的本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完程序设计语

3、言(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.

4、 设计完成后提交课程设计报告第2章 课程设计内容2.1程序功能介绍俄罗斯方块游戏功能描述图(1) 游戏方块预览功能。在游戏过程中,当在游戏底板中出现一个游戏方块时,必须在游戏方块预览区域中出现下一个游戏方块,这样有利于游戏玩家控制游戏的策略。由于在此游戏中存在19种不同的游戏方块,所以在游戏方块预览区域中需要显示随机生成的游戏方块。(2) 游戏方块控制功能。通过各种条件的判断,实现对游戏方块的左移、右移、快速下移、自由下落、旋转功能,以及行满消除行的功能。(3) 游戏显示更新功能。当游戏方块左右移动、下落、旋转时,要清除先前的游戏方块,用新坐标重绘游戏方块。当消除满行时,要重绘游戏底板的当前状

5、态。(4) 游戏速度分数更新功能。在游戏玩家进行游戏过程中,需要按照一定的游戏规则给玩家计算游戏分数。比如,消除一行加10分。当游戏分数达到一定数量之后,需要给游戏者进行等级的上升,每上升一个等级,游戏方块的下落速度将加快,游戏的难度将增加。(5) 游戏帮助功能。玩家进入游戏后,将有对本游戏如何操作的友情提示。2.2程序整体设计说明2.2.1设计思路新游戏方块将在如图3.2所示的44的正方形小方块中预览。使用随机函数rand()来产生119之间的游戏方块编号,并作为预览的方块编号。其中的正方形小方块的大小为BSIZEBSIZE。BSIZE为设定的像素大小。游戏方块预览图2.2.2数据结构设计及

6、用法说明 游戏底板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 b

7、ox2; 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,bo

8、x1=0xc0,其中0x88和0xc0为十六进制表示形式,具体表现的含义如图3.3所示。SHAPE结构示意图2.2.3程序结构(流程图) 2.2.4各模块的功能及程序说明 左移的实现过程如下: (1) 判断在当前的游戏底板中能否左移。这一判断必须满足如下两条件:游戏方块整体左移一位后,游戏方块不能超越游戏底板的左边线,否则越界;并且在游戏方块有值(值为1)的位置,游戏底板必须是没有被占用的(占用时,值为1)。若满足这两个条件,则执行下面的左移动作。否则不执行左移动作。 (2) 清除左移前的游戏方块。 (3) 在左移一位的位置,重新显示此游戏方块。 右移的实现过程如下: (1) 判断在当前游戏底

9、板中能否右移。这一判断必须满足如下两个条件:游戏方块整体右移一位后,游戏方块不能超越游戏底板的右边线,否则越界;并且在游戏方块有值(值为1)的位置,游戏底板必须是没有被占用的(占用时,值为1)。若满足这两个条件,则执行下面的右移动作。否则不只执行右移动作。 (2) 清除右移前的游戏方块。 (3) 在右移一位的位置,重新显示此游戏方块。 下移的实现过程如下: (1) 判断在当前游戏底板中能否下移。这一判断必须满足如下两个条件:游戏方块整体下移一位后,游戏方块不能超越游戏底板的底边线,否则越界;并且在游戏方块有值(值为1)的位置,游戏底板必须是没有被占用的(占用时,值为1)。若满足这两个条件,则执

10、行下面的下移动作。否则,将flag_newbox标志置1,主循环中会判断此标志,若为1,则会生成下一个游戏方块,并更新预览游戏方块。 (2) 清除下移前的游戏方块。 (3) 在下移一位的位置,重新显示此游戏方块。旋转的实现过程如下: (1) 判断在当前游戏底板中能否旋转。这一判断必须满足如下条件:游戏方块整旋转后,游戏方块不能超越游戏底板的左边线、右边线和底边线,否则越界;并且在游戏方块有值(值为1)的位置,游戏底板必须是没有被占用的(占用时,值为1)。若满足这些条件,则执行下面的旋转动作。否则不只执行旋转动作。 (2) 清除旋转前的游戏方块。 (3) 在游戏方块显示区域(44)不变的位置,利

11、用保存当前游戏方块的数据结构中的next值作为旋转后形成的新游戏方块的编号,并重新显示这个编号的游戏方块。 当生成新的游戏方块前,执行行满的检查,判断行满的过程为: 一次从下到上扫描游戏底板中的各行,若某行中1的个数等于游戏底板水平方向上的小方块的个数,则表示此行是满的。找到满行后,立即将游戏底板中的数据往下顺移一行,直到游戏底板逐行扫描完毕。2.2.5程序结果 当用户刚进入游戏时,如图4.2所示。此时,分数初始化为0,等级默认为1。游戏当前设置为成绩每增加30分等级就升一级,升级后游戏方块在原来基础上下落速度有所加快,这主要是变化了定时器的时间间隔的缘故。用户可使用键盘左移键、右移键、上移键

12、和下移键,分别进行左移、右移、旋转和下落操作。用户可按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 /*设置中断号*/*定义常量

13、*/#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

14、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; /*保存

15、当前方块编号*/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; /*

16、当前状态 只有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

17、 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

18、, 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

19、,/* * 口口 * 口口 */ 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, grapher

20、rormsg(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)

21、; 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(Cur

22、box_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_bo

23、x_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_

24、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

25、(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=fals

26、e; 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; i

27、f(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;im;i+) Table_boardji.var=0; Table_boardji.color=BgColor; line(x,y,x+BSIZE,y);

28、 line(x,y,x,y+BSIZE); line(x,y+BSIZE,x+BSIZE,y+BSIZE); line(x+BSIZE,y,x+BSIZE,y+BSIZE); x+=BSIZE; y+=BSIZE; x=oldx; Curbox_x=x; Curbox_y=y;/*x,y是保存方块的当前坐标的*/ flag_newbox=false; /*是否要产生新方块的标记0*/ speed=0; /*下落速度*/ score=0; /*总分*/ ShowScore(score); ShowSpeed(speed);void interrupt newtimer(void) (*oldti

29、mer)(); /* call the old routine */ TimerCounter+;/* increase the global counter */* 设置新的时钟中断处理过程 */void SetTimer(void interrupt(*IntProc)(void) oldtimer=getvect(TIMER); /*获取中断号为TIMER的中断处理函数的入口地址*/ disable(); /* 设置新的时钟中断处理过程时,禁止所有中断 */ setvect(TIMER,IntProc); /*将中断号为TIMER的中断处理函数的入口地址改为IntProc()函数的入口地址 即中断发生时,将调用IntProc()函数。*/ enable(); /* 开启中断 */* 恢复原有的时钟中断处理过程 */void KillTimer() disable(); setvect(TIMER,oldtimer); enable();void ShowScore(int score) int x,y; char score_str5;/*保存游戏得分*/ setfillstyle(SOLID_FILL,BgCo

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2