1、辽 宁 工 业 大 学 C语言程序设计 课程设计(论文)题目: 俄罗斯方块游戏 院(系): 软件学院 专业班级: 电子商务112班 学 号: 111401043 学生姓名: 张欢廷 指导教师: 武志刚 教师职称: 讲师 起止时间: 2011.12.05至2011.12.18 课程设计(报告)任务及评语院(系):软件学院 教研室:软件教研窒学 号111401043学生姓名张欢廷专业班级电子商务112班程序设计(报告)题目机房收费管理系统程序设计(报告)任务程序设计的任务与要求:(1)掌握C语言编程的基础知识。(2)较熟练地编写C语言应用程序。(3)了解C语言的常用标准函数、编程技巧、异常处理。(
2、5)联系已学过的内容,巩固所学的理论,增强独立工作能力。(6)通过设计主要使学生有一个独立编写程序的过程,对理论学习及动手能力都有一个很大的提高。(7)通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素质的提高起一个积极的推动作用。课程设计过程中,要严格遵守实践环节的时间安排,听从指导教师的指导。正确地完成上述内容,记录实习日记,规范完整地撰写出课程设计报告。指导教师评语及成绩成绩: 指导教师签字: 2011 年 12 月 22 日辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)目 录第1章 课程设计的目的与要求11.1 课程设计目的11.2 课程设计的实验环境11.3
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语言编程和程序调试的基本技
4、能 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、一个用于摆放小型正方形的平面虚拟场地,其标准大小:行宽为10,列高为20,以每个小正方形为
5、单位。 2、一组由4个小型正方形组成的规则图形,英文称为Tetromino,中文通称为方块共有7种,分别以S、Z、L、J、I、O、T这7个字母的形状来命名。 I:一次最多消除四层 J(左右):最多消除三层,或消除二层 L:最多消除三层,或消除二层 O:消除一至二层 S(左右):最多二层,容易造成孔洞 Z (左右):最多二层,容易造成孔洞 T:最多二层2.2程序整体设计说明(1)部分游戏有单格方块,可以穿透固定的方块到达最下层空位。其他的改版中出现更多特别的造型。 方块会从区域上方开始缓慢继续落下。 (2)玩家可以做的操作有:以90度为单位旋转方块,以格子为单位左右移动方块,让方块加速落下。 (
6、3)方块移到区域最下方或是着地到其他方块上无法移动时,就会固定在该处,而新的方块出现在区域上方开始落下。 (4)当区域中某一列横向格子全部由方块填满,则该列会消失并成为玩家的得分。同时删除的列数越多,得分指数上升。 (5)当固定的方块堆到区域最上方而无法消除层数时,则游戏结束2.2.1设计思路1. 按游戏界面的开始按钮或者F2键来开始游戏,自己使用右边的窗口,对手使用左边的窗口。 俄罗斯方块2. 键盘操作:系统缺省设置使用右边的窗口,用光标操作,左移一格;右移一格;旋转方块; 方块丢下(方块下落到底),End健可以一格格的下落,用户还可以自定义习惯的按键来操作游戏。 3. 计分牌显示的内容:
7、“分数”为双方本局的分数,计分标准为下落一个块10分,一次消一行100分、2行200分、3行400分、4行800分。 “等级”为双方的游戏设置等级,当分数达到一定的值,等级就会提升、速度加快。 “行数”第一行为双方消的行数,第二行是送给对方的行数。 “比分”为双方赢的局数。2.2.2数据结构设计及用法说明 ,3、通过设计者预先设置的随机发生器不断地输出单个方块到场地顶部,以一定的规则进行移动、旋转、下落和摆放,锁定并填充到场地中。每次摆放如果将场地的一行或多行完全填满,则组成这些行的所有小正方形将被消除,并且以此来换取一定的积分或者其他形式的奖励。而未被消除的方块会一直累积,并对后来的方块摆放
8、造成各种影响。 4、如果未被消除的方块堆放的高度超过场地所规定的最大高度(并不一定是20或者玩家所能见到的高度),则游戏结束。2.2.3程序结构(流程图)2.2.4各模块的功能及程序说明2.2.5程序结果2.3程序源代码及注释#include graphics.h /*头文件*/ #include time.h #include stdlib.h #include bios.h #include dos.h #include stdio.h #define ESC 0x11b /*键盘扫描码*/ #define UP 0x4800 #define DOWN 0x5000 #define LEF
9、T 0x4b00 #define F1 0x3b00 #define RIGHT 0x4d00 #define YES 0x1579 #define NO 0x316e #define RESTART 0x1372 struct diamond /*记录每种方块每种状态的信息*/ int x4; int y4; int start_x; int start_y; int color; struct diamond *next; ; int grid1223; /*记录所有格子的状态 (0)没有方块 (1)有固定方块 (2)有活动方块*/ int x; /*活动方块所在位置*/ int y; i
10、nt level; /*游戏难度*/ int count; /*计数器*/ int score;/*得分*/ struct diamond *nowinfo; /*当前活动方块*/ struct diamond *nextinfo; /*下一个方块*/ int color;/*画格子的颜色*/ int backcolor;/*游戏区域背景色*/ void show_interface (int mode);/*显示游戏界面*/ void show_copsign (int topx,int topy,int size,int color);/*显示公司标志-恒基伟业*/ void show_i
11、ntro (int xs,int ys);/*显示软件介绍区*/ /*void print(); 测试用函数*/ void scandel();/*扫描所有格子看是否有可消除行*/ void show_down ();/*方块下落后的下一个状态*/ void show_next ();/*方块翻转后的下一个状态*/ void show_left ();/*方块向左移动后的下一个状态*/ void show_right ();/*方块向右移动后的下一个状态*/ void interrupt (*oldtimer)();/*指向未安装前的中断向量,即函数指针,指向一段可执行的代码*/ void i
12、nstall();/*安装新的中断向量,即将中断服务程序安装到中断向量表中*/ void interrupt newtimer();/*中断服务程序*/ struct diamond *get_diamond();/*随机得到一个方块*/ struct diamond *create_I();/*函数用来构造各种类形方块的环形链表*/ struct diamond *create_T();/*返回链表中随机一个状态的指针*/ struct diamond *create_L(); struct diamond *create_J(); struct diamond *create_Z(); s
13、truct diamond *create_N(); struct diamond *create_H(); void delinfo (struct diamond *info);/*释放当前方块所占用的空间*/ void addtobuffer(int c);/*向键盘缓冲区中增加一个DOWN*/ /*void clrkey();调用dos中断清空键盘缓冲区,未使用此方法.*/ void showsubwin(struct diamond *next);/*在小窗口显示下一个方块*/ void showscore(int scoreget);/*显示分数*/ void startset()
14、;/*初始化游戏*/ main () int nowy; int i;/*计数器*/ int j; int haveit;/*当前格子是否已经显示*/ struct diamond *next;/*当前方块的翻转后的下一个状态*/ next=nowinfo-next; if (next=NULL) gotoxy(1,1);printf(null); for (i=0;ixy+next-y=1) return; setfillstyle(SOLID_FILL,backcolor);/*设置背景色以消除不需要的格子*/ for (i=0;i=3;i+) haveit=0; for (j=0;jxj
15、=nowinfo-x&next-yj=nowinfo-y) haveit=1;break; if (haveit=0) /*判断翻转后该格子是否显示,若不显示,将该格子设为背景色*/ gridx+nowinfo-xy+nowinfo-y=0; if (y+nowinfo-y=4)/*判断该格子是否到了可以显示的区域*/ floodfill(80+(nowinfo-x+x)*20+1,-20+(nowinfo-y+y)*20+1,color); nowinfo=next; nowx=x; nowy=y; setfillstyle(SOLID_FILL,nowinfo-color);/*设置填冲色
16、为方块的颜色*/ for (i=0;ixy+nowinfo-y!=2)/*如果该格子还没有被显示*/ nowx=x+nowinfo-x; nowy=y+nowinfo-y; if (y+nowinfo-y=4) floodfill(80+nowx*20+1,-20+nowy*20+1,color); gridnowxnowy=2; /*设置该格子当前有活动方块*/ return; void show_left () int i;/*计数器*/ int j; int haveit;/*当前格子是否已经显示*/ int nowx;/*记录当前每个格子的位置*/ int nowy; for (i=0
17、;ixy+nowinfo-y=1) return; setfillstyle(SOLID_FILL,backcolor);/*设置背景色以消除不需要的格子*/ for (i=0;i=3;i+) haveit=0; for (j=0;jx=nowinfo-xj-1&nowinfo-y=nowinfo-yj) haveit=1;break; if (haveit=0) /*判断翻转后该格子是否显示,若不显示,将该格子设为背景色*/ gridx+nowinfo-xy+nowinfo-y=0; if (y+nowinfo-y=4)/*判断该格子是否到了可以显示的区域*/ floodfill(80+(n
18、owinfo-x+x)*20+1,-20+(nowinfo-y+y)*20+1,color); setfillstyle(SOLID_FILL,nowinfo-color);/*设置填冲色为方块的颜色*/ for (i=0;ix-1; nowy=y+nowinfo-y; if (gridnowxnowy!=2)/*如果该格子还没有被显示*/ if (nowy=4) if (gridnowxnowy!=2) if (nowy=4)/*判断该格子是否到了可以显示的区域*/ floodfill(80+nowx*20+1,-20+nowy*20+1,color); gridnowxnowy=2; x=
19、x+1; return; void show_down () int i;/*计数器*/ int j; int haveit;/*当前格子是否已经显示*/ int nowx;/*记录当前每个格子的位置*/ int nowy; int key; for (i=0;ixy+nowinfo-y+1=1)/*判断方块是否能够下落*/ for (j=0;jxjy+nowinfo-yj=1; if (y+nowinfo-yj=3) /*判断游戏是否已经玩完*/ install(oldtimer); setfillstyle(SOLID_FILL,1); bar(0,465,640,480); outtex
20、txy(5,469,Do you want to restart (Y/N).); for (;)key=bioskey(0); if (key=YES) startset(); setfillstyle(SOLID_FILL,9); bar(0,465,640,480); return; if (key=NO) closegraph(); exit (0); gridnowxnowy=2; y=y+1; return; /*void print()测试用函数 int i; int j; gotoxy(1,1); for (j=0;j=22;j+) for (i=0;i=4;k-) num=0
21、; for (i=1;inext; next=info-next; while(next!=info) next=now-next; free(now); now=next; free(info); void addtobuffer(int c)/*向键盘缓冲区中增加一个DOWN*/ unsigned i; i=*(unsigned far *)0x0040001CL; *(unsigned far *)(0x00400000L | i)=c; i+=2; if (i=*(unsigned far *)0x00400082L) i=*(unsigned far *)0x00400080L; *
22、(unsigned far *)0x0040001CL=i; /*void clrkey()调用dos中断清空键盘缓冲区,未使用此方法. union REGS in ; in.h.ah = 0x0c ; in.h.al = 0x00 ; intdos(&in , &in) ; */ void showsubwin(struct diamond *next) int i;/*计数器*/ int j; setfillstyle (SOLID_FILL,backcolor); for (i=0;i=3;i+) for(j=0;jcolor); for (i=0;ix*20,81+next-y*20,
23、color); void showscore(int scoreget) char sscore6; char slevel2; score+=scoreget; if (score1000) level=score/100+1; sprintf(sscore,%d,score); sprintf(slevel,%d,level); setfillstyle(SOLID_FILL,9); bar(406,179,490,203); setcolor(14); outtextxy (408,180,slevel); outtextxy (408,195,sscore); void startse
24、t() int i; int j; setfillstyle(SOLID_FILL,backcolor); for(i=0;i=21;i+)/*重新初始化*/ for(j=1;j=4) floodfill(80+j*20+1,-20+i*20+1,color); score=0; showscore(0); nowinfo=get_diamond ();/*得到一个当前方块*/ x=nowinfo-start_x;/*初始化方块位置*/ y=nowinfo-start_y; nextinfo=get_diamond ();/*得到下一个方块*/ showsubwin(nextinfo); in
25、stall(newtimer); 第3章 课程设计总结 通过本次C程序课程设计,我觉得对自己提高很大:克服了的偷懒的毛病,这在我以后的学习和工作中的心理定位与调节有很大的帮助。我感受到了编程是一项非常烦琐周密的活动,他不但需要一个人周密的思考问题的能力,处理问题的能力,还需要有足够的耐心和严谨治学的作风,来不得半点马虎。本次我通过课程设计学会了团体合作也初步学会了论文设计的基本方法,学会了怎样去借鉴别人的方法和经验,知道如何去查找资料和整合处理这些资料的能力,这为以后的大学毕业设计论文打下了一个初步的基础使我收益最大的是享受到了一种成功的喜悦,在这两个星期之中从开始的确定论文题目,然后是上网和
26、上图书馆查找资料,编写C语言原程序,然后是进行编译,这个环节是一个非常痛苦和艰难的,常常会因为一小点的错误而在编译失败与再次修改的漫漫循环之路中,但失败的越多,对人的考验就越多,在编译运行成功之后的享受成功的喜悦也就越多,另外在调试程序的过程中不断的思考和运用已经学到的知识,这对于自己是有很大的提高的。这个俄罗斯方块原程序的最大特点是采用了在主函数中调用子函数思想,每一种功能都是用子函数的办法来进行处理,简洁,清晰,方便,不容易出现错误。 由于所学的知识不多,自己的编程经验不足,按现有的知识水平有些东西暂时还无法解决,还有待于在以后的学习中不断提高和改进!参考资料1 李成付.C语言程序设计基础.北京:科学出版社,1992.10第108页2 徐君毅.C语言程序设计基础.上海:复旦大学出版社,1992第264页3 姜仲秋.C语言程序设计基础.南京:南京大学出版社,1999第53页4 李大友.C语言程序设计基础.北京:清华大学出版社,1999第152页 13