版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGE1目录第1章课程设计的目的与要求 11.1课程设计目的 11.2课程设计的实验环境 11.3课程设计的预备知识 11.4课程设计要求 1第2章课程设计内容 22.1程序功能介绍 22.2程序整体设计说明 22.2.1设计思路 22.2.2数据结构设计及用法说明 22.2.3程序结构(流程图) 32.2.4各模块的功能及程序说明 62.3程序源代码及注释 9第3章课程设计总结 16参考资料 17
第1章课程设计的目的与要求1.1课程设计目的本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》课程后进行的一次全面的综合练习。本课程设计的目的和任务:1.巩固和加深学生对C语言课程的基本知识的理解和掌握2.掌握C语言编程和程序调试的基本技能3.利用C语言进行基本的软件设计4.掌握书写程序设计说明文档的能力5.提高运用C语言解决实际问题的能力1.2课程设计的实验环境硬件要求能运行Windows2000/XP操作系统的微机系统。C语言程序设计及相应的开发环境。1.3课程设计的预备知识熟悉C语言及C语言开发工具。1.4课程设计要求1.分析课程设计题目的要求
2.写出详细设计说明
3.编写程序代码,调试程序使其能正确运行
4.设计完成的软件要便于操作和使用
5.设计完成后提交课程设计报告
第2章课程设计内容2.1程序功能介绍贪吃蛇游戏是一个深受人们喜爱的游戏,一条在密闭的围墙内,在围墙内随机出现一个食物,通过按键盘上四个光标键控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被蛇吃掉,这时蛇的身体长一节,同时计10分,接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁或身体交叉蛇头撞到自己的身体游戏结束。2.2程序整体设计说明2.2.1设计思路程序关键在于表示蛇的图形及蛇的移动。用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用俩节表示。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现与消失也是画矩形块和覆盖矩形块。为了便于理解,定义两个结构体:食物与蛇。2.2.2数据结构设计及用法说明表示食物与蛇的矩形块设计为10*10个像素单位,食物的基本数据域为他所出现的位置,用x和y座标表示,则矩形块用函数rectangle(x,y,x+10,y+10)或rectangle(x,y,x+10,y-10)可以画出。由于每次只出现一个食物,所以设定yes表示是否要出现食物。蛇的一节身体为一个矩形块,表示矩形块只需起点座标x,y。身体不断增长,用数组存放每节座标,最大设定为N=200,node表示当前节数。保存蛇的移动方向的变量direction和生命的变量life,一旦life为1,表示蛇死,结束。
#defineN200
structFood
{
intx;/*食物的横坐标*/
inty;/*食物的纵坐标*/
intyes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/
structSnake
{
intx[N];
inty[N];
intnode;/*蛇的节数*/
intdirection;/*蛇移动方向*/
intlife;/*蛇的生命,0活着,1死亡*/
}snake;2.2.3程序结构(流程图)本程序流程图如下:开始Init();I开始Init();Intgd=DETECT.gm;Setcdor(11);i=50i<=6000rectangle(i,40,i+10,49)i+=10i=40i<=450ectangle(50,I,59,i+10);i+=10randomize();1!kbhit()Multiplexsnake.life==1break;key=bioskey(0);Multiplexclearderice();charstr[10];geth();结束2.2.4各模块的功能及程序说明1.蛇身基本单元模块SnakeSegment.cs
基本单元用一个矩形(Rectangle)来描述,详细构造如下
privateRectanglem_rect;
/**//************构造函数,传入顶点坐标和块宽度****************/
publicSnakeSegment(Pointlocation,intwidth)
...{
m_rect=newRectangle(location,newSize(width,width));
}
//属性
publicRectangleRectangle
...{
get
...{
returnm_rect;
}
}
publicPointLocation
...{
get
...{
returnthis.m_rect.Location;
}
set
...{
this.m_rect.Location=value;
}
}
publicSizeSize
...{
get
...{
returnthis.m_rect.Size;
}
}
2.蛇身结构位置模块Snake.cs
蛇身由若干基本单元组成,这些单元存放在一个Queue结构中,Queue处于命名空间System.Collections之下,表示对象的先进先出集合。Snake类里面主要包含Add(添加新对象),Clear(清除对象),Slither(蛇身移动),PointOnSnake(判断某点是否在蛇身内部)几个方法。
//向蛇身添加一个新节点
publicvoidAdd(PointnewLocation)
...{
SnakeSegmentnewhead=newSnakeSegment(newLocation,m_width);
//CheckiftheQueueExists
if(m_segs==null)
...{
m_segs=newQueue(MAXSNAKELENGTH);
}
elseif(m_segs.Count==MAXSNAKELENGTH)
...{
Slither(newLocation);
return;
}
m_segs.Enqueue(newhead);
}
publicvoidSlither(PointnewLocation)
...{
SnakeSegmentnewhead=newSnakeSegment(newLocation,this.m_width);
this.m_segs.Enqueue(newhead);
this.m_segs.Dequeue();
}
publicboolPointOnSnake(Pointpt)...{
IEnumeratormyenum=this.m_segs.GetEnumerator();
while(myenum.MoveNext())
...{
if(((SnakeSegment)myenum.Current).Rectangle.Contains(pt))
...{
returntrue;
}
}
returnfalse;
}
3.控制蛇身移动模块Control.cs
首先定义了三个全局变量
privatePointm_location;
privateintm_increment;
privateSnakeDirectionm_direction;其中的SnakeDirection的定义为
internalenumSnakeDirection
...{
None=-1,//保持默认
Down=1,
Left=0,
Right=2,
Up=3
}2.3程序源代码及注释#defineN200#include<graphics.h>#include<stdlib.h>#include<dos.h>#defineLEFT0x4b00#defineRIGHT0x4d00#defineDOWN0x5000#defineUP0x4800#defineESC0x011binti,key;intscore=0;/*得分*/intgamespeed=50000;/*游戏速度自己调整*/structFood{intx;/*食物的横坐标*/inty;/*食物的纵坐标*/intyes;/*判断是否要出现食物的变量*/}food;/*食物的结构体*/structSnake{intx[N];inty[N];intnode;/*蛇的节数*/intdirection;/*蛇移动方向*/intlife;/*蛇的生命,0活着,1死亡*/}snake;voidInit(void);/*图形驱动*/voidClose(void);/*图形结束*/voidDrawK(void);/*开始画面*/voidGameOver(void);/*结束游戏*/voidGamePlay(void);/*玩游戏具体过程*/voidPrScore(void);/*输出成绩*//*主函数*/voidmain(void){Init();/*图形驱动*/DrawK();/*开始画面*/GamePlay();/*玩游戏具体过程*/Close();/*图形结束*/}/*图形驱动*/voidInit(void){intgd=DETECT,gm;initgraph(&gd,&gm,"c:\\tc");cleardevice();}/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/voidDrawK(void){/*setbkcolor(LIGHTGREEN);*/setcolor(11);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/for(i=50;i<=600;i+=10)/*画围墙*/{rectangle(i,40,i+10,49);/*上边*/rectangle(i,451,i+10,460);/*下边*/}for(i=40;i<=450;i+=10){rectangle(50,i,59,i+10);/*左边*/rectangle(601,i,610,i+10);/*右边*/}}/*玩游戏具体过程*/voidGamePlay(void){randomize();/*随机数发生器*/food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/snake.life=0;/*活着*/snake.direction=1;/*方向往右*/snake.x[0]=100;snake.y[0]=100;/*蛇头*/snake.x[1]=110;snake.y[1]=100;snake.node=2;/*节数*/PrScore();/*输出得分*/while(1)/*可以重复玩游戏,压ESC键结束*/{while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/{if(food.yes==1)/*需要出现新食物*/{food.x=rand()%400+60;food.y=rand()%350+60;while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/food.x++;while(food.y%10!=0)food.y++;food.yes=0;/*画面上有食物了*/}if(food.yes==0)/*画面上有食物了就要显示*/{setcolor(GREEN);rectangle(food.x,food.y,food.x+10,food.y-10);}for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/{snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];}/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/switch(snake.direction){case1:snake.x[0]+=10;break;case2:snake.x[0]-=10;break;case3:snake.y[0]-=10;break;case4:snake.y[0]+=10;break;}for(i=3;i<snake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/{if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]){GameOver();/*显示失败*/snake.life=1;break;}}if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455)/*蛇是否撞到墙壁*/{GameOver();/*本次游戏结束*/snake.life=1;/*蛇死*/}if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/break;if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/{setcolor(0);/*把画面上的食物东西去掉*/rectangle(food.x,food.y,food.x+10,food.y-10);snake.x[snake.node]=-20;snake.y[snake.node]=-20;/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/snake.node++;/*蛇的身体长一节*/food.yes=1;/*画面上需要出现新的食物*/score+=10;PrScore();/*输出新得分*/}setcolor(4);/*画出蛇*/for(i=0;i<snake.node;i++)rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);delay(gamespeed);setcolor(0);/*用黑色去除蛇的的最后一节*/rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);}/*endwhile(!kbhit)*/if(snake.life==1)/*如果蛇死就跳出循环*/break;key=bioskey(0);/*接收按键*/if(key==ESC)/*按ESC键退出*/break;elseif(key==UP&&snake.direction!=4)/*判断是否往相反的方向移动*/snake.direction=3;elseif(key==RIGHT&&snake.direction!=2)snake.direction=1;elseif(key==LEFT&&snake.direction!=1)snake.direction=2;elseif(key==DOWN&&snake.direction!=3)snake.direction=4;}/*endwhile(1)*/}/*游戏结束*/voidGameOver(void){cleardevice();PrScore();setcolor(RED);settextstyle(0,0,4);outtextxy(200,200,"GAMEOVER");getch();}/*输出成绩*/voidPrScore(void){charstr[10];setfillstyle(SOLID_FILL,YELLOW);bar(50,15,220,35);setcolor(6);settextstyle(0,0,2);sprintf(str,"score:%d",score);outtextxy(55,20,str);}/*图形结束*/voidClose(void){getch();closegraph();}
第3章课程设计总结通过对数据结构的课程设计,我了解并发现了很多调试程序的方法,而且懂得了如何处理错误的方法。对C语言以及C++的使用得到了进一步的提高。针对数据结构的书本知识得到了进一步的巩固,具体化就是加深了我对线性表的结构的理解,栈和队链认识,二叉树的的应用,查找的方法,数的排序等。对程序的深层理解,清楚程序中每一步的功能,在程序的运行中是十分重要的,一个好的结构在运行中能够充分的发挥程序的功能。结构设计的合理性决定了这个程序的价值。在今后的学习中我要注意这方面,使得我的编程能力能有进一步的提高。学写程序自己一定先要把框架打好,已经程序间的联系一定要想清楚,这次失败的主要原因就是没有先写明白具体的框架,具体某个类要实现的功能,某个类里面要的一些具体变量和这变量所起的作用一定要在开始就描述清楚,已经一些函数功能的实现也要开始想好,这样在编写代码的时候逻辑关系搞的会比较清楚,编写程序的时候不会因为程序庞大而把搞的太复杂,最后自己也搞乱了,搞不清楚变量和函数的关系,终于理解到编程的开始工作很重要,好的开始就成功了一大半。其实写代码才是时间花的最少的。在这几天的学习中,我体会到老师对我们实训的目的,以及实训对每个人综合能力的检验。对自己平时积攒下来的知识那么少感到是多么的羞愧,通过实训我能充分的学习到一些平时书本上学不到的知识、与自己的动手操作能力。并且结合此次实训我能够通过上网或者是在图书馆查询一些相关的资料。通过这一过程,使我学会了很多,以前有好多时间都没有认真学习,此次实习,我深深体会到了积累知识的重要性。经历了这次课程设计,不仅对我的学习提供了帮助,而且在意志力方面也得到了锻炼。我相信在未来的生活中不论遇到什么困难我都会向这次学习C程序一样,一步一步解决问题找出问题的实质,加以解决。没有足够的耐力和信心就很难坚持对课程设计每一步的顺利进。
参考资料[1]刘振安,刘大路,张蕊,秦俊。《C++Builder4编程技术》1999年10月第一版。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 楼板裂缝加固工程施工设计方案
- 施工现场临时用电专项施工方案
- 工程管理总体目标
- 通风空调工程施工方案
- 便秘评估与管理指南
- ACCAHA高血压管理指南更新要点
- 企业内部网络规划方案
- 个人车辆买卖合同协议书模板
- 新华人寿附加学生平安 A 款住院医疗保险利益条款
- 2026年中学教师资格考试《综合素质》教育研究方法班级管理题(附答案)
- 2025年及未来5年中国DHA行业市场运营现状及投资规划研究建议报告
- 企业内部控制风险评估报告范本
- 五年(2021-2025)高考地理真题分类汇编:专题03 地球上的大气(全国)(解析版)
- 历年通信工程概预算考试试题与答案
- 航运国际合作机制创新-洞察及研究
- 《老年服务礼仪与沟通技巧》全套教学课件
- 2024年安徽省高级人民法院岗位招聘笔试真题
- 药品追溯管理培训试题(附答案)
- 公务接待基础培训课件
- 部编版六年级下册语文课堂作业(可打印)
- 材料承认管理办法
评论
0/150
提交评论