c语言课程设计报告.docx
《c语言课程设计报告.docx》由会员分享,可在线阅读,更多相关《c语言课程设计报告.docx(25页珍藏版)》请在冰豆网上搜索。
![c语言课程设计报告.docx](https://file1.bdocx.com/fileroot1/2023-1/21/340ed602-afb3-47bc-8588-e12948eaf0c4/340ed602-afb3-47bc-8588-e12948eaf0c41.gif)
c语言课程设计报告
贪吃蛇游戏系统
院系:
计算机科学技术学院
班级:
组长:
学号:
指导教师:
XXX年X月X日
程序设计基础课程设计任务书
一、题目:
贪吃蛇游戏系统
二、设计要求
(1)自己组成课程设计小组。
(2)查阅相关资料,自学具体课题中涉及到的新知识。
(3)采用结构化、模块化程序设计方法设计,功能要完善,界面美观。
(4)所设计的系统应有菜单、动画。
(5)按要求写出课程设计报告,并于设计结束后1周内提交。
其主要内容包括:
封皮、课程设计任务书,指导教师评语与成绩、目录、概述、软件需求分析、总体设计、详细设计、程序的调试与测试、总结、结束语、程序清单(带中文注释)、参考文献等。
课程设计报告一律用A4纸打印,并严格按照课程设计指导书中规定的毕业设计报告的撰写规范进行排版装订。
三、课程设计工作量
由于是设计小组团结协作完成设计任务,一般每人的程序量在200行有效程序行以上,必须有创新(如自己编的简单动画和音乐),不得抄袭。
四、课程设计工作计划
2017年2月25前,指导教师讲课;
2017年2月26日,设计小组进行总体方案设计和任务分工;
2017年2月27日,每人完成自己承担的程序模块并通过独立编译;
2017年2月28日~3月1日,分模块集体解决核心问题;
2017年3月2日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行,数据必须存储到磁盘文件中,以备验收;
2017年3月2日,撰写课程设计报告。
2017年3月3日,进行课程设计验收。
指导教师签章:
教研室主任签章
程序设计基础课程设计指导教师评语与成绩
指导教师评语:
课程设计表现成绩:
课程设计验收成绩:
课程设计报告成绩:
课程设计总成绩:
指导教师签章
2017年6月日
目录
一.概述1
1.1研究的背景及意义1
1.2课程设计的目的1
1.3课程设计的要求2
1.4课程设计的任务和涉及的知识点2
二.需求分析4
2.1功能需求4
2.2操作方法(键盘操作)4
三.总体方案设计5
3.1模块划分:
5
3.2整体框图:
5
四.程序的调试与运行结果说明6
4.1图形初始化失败6
4.2其他问题6
五.详细设计7
5.1主要模块界面7
5.2源程序代码8
六.结论20
七.结束语21
八.参考文献22
一.概述
本课程设计以软件工程方法为指导,采用了结构化,模块化得课程设计方法,以C++技术为基础,使用vc为主要工具,总体设计,详细设计,最终完成系统的实现与测试。
1.1研究的背景及意义
随着社会的发展,人们交友范围越加广泛,越来越多的人迫切的需要一种可以存储联系人信息的工具。
因此设计一款随时查询联系人信息的软件成了很多人以及商家们的需要。
此次课程设计完成的通讯录管理系统,正是为了满足上诉需求设计出来的,希望能给人们带来便利。
C++是国际上广泛流行的,很有发展前途的计算机高级语言。
他适合作为系统秒速语言,既可用来编写系统软件,也可以用来编写应用软件。
对于计算机专业和相关学科的学生来说,“课程设计基础”是一门非常重要的专业基础课程,对其学习好坏,直接关系到后续课程的学习效果。
C++是一种面向过程的高级语言。
要学好C++,不但要掌握C++的语法,更重要的是要掌握使用C++进行结构化、模块化程序设计的方法。
有了较好的C++基础,就可以进一步学好面向对象的程序设计语言和可视的编程语言如VC++6.0、C#等。
对于面向对象的程序设计,当设计到具体实现部分的时候,也就是编写一个对象中具体的方法(即外部服务函数)时,必然要使用结构化得程序来实现。
可见,结构化、模块化程序设计的方法是必然要学习的,而C++是结构化程序设计思想中比较经典的语言,不可不学好。
学习结构化、模块化程序设计的思想和方法,可以掌握设计解决一个问题的过程,即如何对问题进行分解,划分成各个功能模块,每个模块如何分步骤实施,通过什么样的一个流程图控制可以实现该模块的功能,这也是学习这门课程的中心内容。
1.2课程设计的目的
使学生更深入地理解和掌握该课程中的有关基本概念,程序设计的思想、技术和方法。
培养学生综合运用所学知识独立完成课题的能力。
培养学生勇于探索、严谨推理、实事求是、有过必改,用实践来检验理论,全方位考虑问题等科学人员应具有的须素质。
提高学生对工作认真负责、一丝不苟,对同学友爱团结,协作攻关的基本素质。
培养学生从资料文献、科学实验中获得新知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。
对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。
1.3课程设计的要求
为实现上述目的,提出以下具体要求:
1.以学生自由组织成课程设计游戏开发小组,可由指导教师确定每组的人数,建议每组为3个人左右,并选1人担任组长.指导教师可跟据各个开发小组的试验情况进行必要的调整
2.每组选择课程设计中的一个题目,即开发一个所选课题的"软件系统",每组独立完成。
3.该系统要有主菜单,动画与音乐,且游戏功能上尽可能模拟操作系统中的贪吃蛇游戏,系统界面尽量美观。
4.进一步掌握C++集成开发环境
5.熟练掌握C++的数据类型,三种基本结构,模块化设计,指针,结构体,文件,链表等知识点。
6.丛书或互联网上查阅相关资料,自学具体课题中涉及到的知识。
7.采用结构化,模块化程序设计方法进行设计,功能要完善,界面要美观,应具有一定创新。
8软件开发小组组长带领本小组成员团结协作,共同完成课题的设计任务。
要求开发小组中每个组员都有自己独立的设计的若干模块,每个人设计的有效源代码应在200行以上,同时要读懂其他组员完成的内容。
1.4课程设计的任务和涉及的知识点
1.课程设计的主要完成任务
(1)通过编写“贪吃蛇游戏”程序,掌握结构化、模块化程序设计的思想,培养解决实际问题的能力。
(2)设计数组元素与蛇、食物的对应关系。
(3)随机产生食物。
(4)有分数统计、排行榜、分数存储等功能。
(5)有同步播放的动画、声音效果。
2.课程设计中涉及的知识点
(1)数组的应用。
(2)全局变量的应用。
(3)按键处理。
(4)结构体的应用。
(5)图形、音乐和动画的有关知识。
(6)随机函数的使用。
(7)文件的基本操作。
(8)结构化、模块化的设计方法。
二.需求分析
贪吃蛇是大众化的游戏,游戏简单容易上手,但确能给玩家放松心情,身心得到娱乐,从而能更好地投入到学习或工作中。
现代人,无乱是工作的,或是学生都面临的巨大压力,而这一款简单的游戏能让每个人随时随地上手,令不少玩家对它爱不释手。
对于繁忙的现代人,玩大型游戏是浪费时间,然而这样的小游戏,不仅可以随时随地娱乐,对硬件要求很低,可以不夸张地说,只要你有数码产品,都可以玩。
而且在为人们节省不少宝贵的时间的同时,达到了身心娱乐的目的。
2.1功能需求
进入游戏前,可以观看选择观看小组成员的动画。
按任意键进入游戏。
蛇在一个封闭的墙内移动,遇到食物后,蛇身加长,分数上升。
要是碰到墙壁或者是蛇自己,即游戏结束。
当分数上升到一定,蛇速度加快。
2.2操作方法(键盘操作)
(1)进入游戏:
回车键。
(2)游戏操作:
在游戏中,通过键盘上下左右控制蛇的方向。
三.总体方案设计
特点:
为方便操作,加入了口令登录、动画音乐、数据维护和系统帮助。
算法的整体思路:
随机产生食物,按相应的键执行相应的功能。
3.1模块划分:
(一)游戏动画
(二)游戏菜单:
(三)游戏过程:
(四)退出:
3.2整体框图:
图1软件总体模块结构图
四.程序的调试与运行结果说明
4.1图形初始化失败
预期效果:
进入动画能观看所画图形。
实际运行效果:
编译成功,但无法进入动画。
图4图形初始化失败
错误分析:
未指定显卡驱动位置。
修改:
将显卡驱动文件Egavga.bgi复制到动画源程序目录下。
修改后程序运行效果与预期效果一致。
如图5所示。
图5动画
4.2其他问题
比如全局变量重命名、函数重复声明或未声明和主函数重定义等问题。
如:
图10重定义主函数main
五.详细设计
5.1主要模块界面
5.1.1游戏动画
5.1.2菜单界面
5.1.3游戏界面
5.1.4辅助界面
5.1.5游戏结束界面
5.2源程序代码
#include
#include
#include
#include
#include
voidgotoxy(intx,inty);//移动
voidLoc(int,int);//定位函数
voidBeginning();//游戏开始
voidCreatMap();//创建地图
voidGameInit();//初始化
voidGameStart();//游戏开始
voidDeadOrNo();//判断是否和自身相撞
charDeadOrNoByPos(int,int);//蛇的生命
voidJudgeFood();//判断食物是否和自身
voidMakeFood();//制造食物
voidThroWall();//是否穿墙
voidSnakeMove();//蛇的移动
voidMoveNo(structBody*p_body,structBody*nofood);//没有食物时蛇的移动
voidMoveYes(structBody*yesfood);//有食物时蛇的移动
voidDrawShank(char);//画蛇
voidEnding();//游戏结束
voidHiSleep(int);
voidsnack()
{
printf("$$$$$$\n");
printf("$$$__$$_$$$\n");
printf("$____$$___$$$$\n");
printf("$$$$________$$$$\n");
printf("$$$$$$___$__$$$$\n");
printf("$$$$$___$_$$$$$\n");
printf("$$$$$$___$_$$$$$$\n");
printf("$$$$$$___$$$$$$$$\n");
printf("$$$$$$_$___$$$$$$\n");
printf("$$$$$$$__$_$$$$$$$\n");
printf("$$$$$$$___$$$$$$$$\n");
printf("$$$$$$$__$_$$$$$$$\n");
printf("$$$$$$___$_$$$$$$\n");
printf("$$$$$___$_$$$$$$\n");
printf("$$$____$_$$$$$\n");
printf("$____$_$$$$\n");
printf("$$___$__$$\n");
printf("$$______$$按回车进入游戏\n");
printf("$______$$_$\n");
printf("$$_____$$_$$$______$$$$$$$$$$$\n");
printf("$______$___$$$$$$$$___________$\n");
printf("$$$$$_$$___$_$$____$$$$$$____$$$______$\n");
printf("$$$$____$$$$_$_$_$$$$$$$$____$$$$$$$$$$$__$\n");
printf("$$____$____$$___$_$$______$$$$__________$$$$$\n");
printf("$_____$______$_$___$$_$$$$$____________$_____$$$\n");
printf("$______$$$$$$$$____$_$$$_________________$$_____$$\n");
printf("$______$$_____$_$____$$__________$$$$$$$$$$______$\n");
printf("$$_______$$$$_$$_$$_$_$$_____$$$$$$_______$______$\n");
printf("$$____________$$____$_$$$$$$$__________$$_______$\n");
printf("$$___________$_____$__$$$_______$$$$$$_______$$\n");
printf("$$$$$____$$$________$$$$$$$$$___________$$\n");
printf("$$$$$$$$$$_$$$________________________$$$\n");
printf("$$$$__________________$$$$\n");
printf("$$$$$$$$$$$$$$$$$$$\n");
system("colorb");
}
structBody
{
shortx,y;
structBody*next;//指向下一个蛇身的指针
};
intlength=sizeof(structBody);//Body结构体所占字节数
intDelay=500;
shortX=0,Y=0;
shortfood_x,food_y,food=0;
shortlife=1;
shortscore1=0;
charmovdir='R';
shortlockdelay=20;
structnode
{
intx,y;
structnode*next;
};
structnode*p;
structBody*head;
inti,j;
voidLoc(intx,inty)
{
COORDpos={x,y};//调用windows库里的函数坐标转换
HANDLEhOut=GetStdHandle(STD_OUTPUT_HANDLE);//获得输出设备的句柄
SetConsoleCursorPosition(hOut,pos);
}
voidgotoxy(intx,inty)
{
COORDloc={x,y};
HANDLEhOut=GetStdHandle(STD_OUTPUT_HANDLE);//获得输出设备的句柄
SetConsoleCursorPosition(hOut,loc);//光标定位
}
voidinit()//游戏开始时蛇的位置
{
gotoxy(9,2);
p=(structnode*)malloc(sizeof(structnode));//将P指向一个新分配的structnode型指针地址是链表()
p->x=9;
p->y=2;
}
voidBeginning()//初始
{
voidgotoxy(intx,inty);
intinitz=30,initx=14,inity=8,init=2;//下面printf字开始右移的初始位置,init代表左右方向
charch1='\0';
gotoxy(38,18);
puts("王慧");
while(ch1!
=13)
{
gotoxy(initz,inity-1);
printf("经典小游戏");
gotoxy(initx,inity);
printf("超级宇宙无敌无边框贪吃蛇按ENTER键开始游戏");
Sleep(Delay);
gotoxy(initx,inity);
printf("");
if(init>0&&initx>=30||initx==2&&init<0)
init*=-1;
initx+=init;
initz+=init;
if(kbhit())//有键盘输入时接受若是13(ENTER)键结束循环
ch1=getch();
}
system("cls");
}
voidCreatMap()//创建外围
{
inti;
for(i=0;i<=100;i+=2)
{
Loc(i,0);
printf("□");
Loc(i,28);
printf("□");
}
for(i=0;i<=28;i++)
{
Loc(0,i);
printf("□");
Loc(70,i);
printf("□");
Loc(100,i);
printf("□");
}
}
voidGameInit()//开始游戏时
{
structBody*p_cur,*p_new;//定义四个蛇身指针
intxh;
CreatMap();
head=(structBody*)malloc(length);
head->x=12;head->y=2;
p_cur=head;
p_cur->next=NULL;
for(xh=0;xh<3;xh++)
{
p_new=(structBody*)malloc(length);
p_cur->next=p_new;
p_new->x=p_cur->x-2;
p_new->y=p_cur->y;
p_cur=p_new;
p_cur->next=NULL;
}
Delay=500;
food=0;
life=1;
score1=0;
movdir='R';
lockdelay=20;
DrawShank(0);
Loc(80,3);
puts("每吃一个");
Loc(80,4);
puts("蛇会加速");
Loc(78,13);
puts("控制键:
↑←↓→");
}
voidGameStart()//游戏开始
{
while
(1)
{
DeadOrNo();
if(life==0)
break;
MakeFood();
if(GetAsyncKeyState(VK_UP)&&movdir!
='D'&&movdir!
='U')
movdir='U';
elseif(GetAsyncKeyState(VK_DOWN)&&movdir!
='U'&&movdir!
='D')
movdir='D';
elseif(GetAsyncKeyState(VK_LEFT)&&movdir!
='R'&&movdir!
='L')
movdir='L';
elseif(GetAsyncKeyState(VK_RIGHT)&&movdir!
='L'&&movdir!
='R')
movdir='R';
SnakeMove();
Loc(80,7);
printf("1得分:
%3d",score1);
Loc(80,10);
printf("速度:
%5.1f",1000.0/(float)Delay);
HiSleep(Delay);
}
}
voidDeadOrNo()//判断是否死亡
{
structBody*p_body=head;
while(p_body->next!
=NULL)//定位到最后一个蛇身
{
p_body=p_body->next;
if(p_body->x==head->x&&p_body->y==head->y)
life=0;
}
}
charDeadOrNoByPos(intx,inty)//判断生命
{
structBody*p_body=head;
while(p_body->next!
=NULL)//定位到最后一个蛇身
{
if(p_body->x==x&&p_body->y==y)//如果有任何一个蛇身坐标与蛇头重合,蛇即死亡
return1;
p_body=p_body->next;
}
return0;
}
voidJudgeFood()//判断食物是否与蛇身重叠
{
structBody*p_body=head;
while(p_body!
=NULL)
{
if(food_x==p_body->x&&food_y==p_body->y)
{
food=0;
Loc(62,8);
MakeFood();
}
p_body=p_body->next;
}
}
voidMakeFood()//制造食物
{
if(food==0)
{
food_x=rand()%53+2;
food_y=rand()%23+1;
if(food_x%2==1)
food_x++;
food=1;
JudgeFood();
}
}
voidThroWall(structBody*p)//是否穿墙
{
if(p->x==69)
life=0;
if(p->x==1)
life=0;
if(p->y==1)
life=0;
if(p->y==27)
life=0;
}
voidSnakeMove()//蛇的移动
{
structBody*p_body;
structBody*nofood;
structBody*yesfood;
structBodytmppos;
switch(movdir)
{
case'U':
X=0;Y=-1;break;
case'D':
X=0;Y=1;break;
case'L':
X=-2;Y=0;break;
case'R':
X=2;Y=0;break;
}
tmppos=*head;
tmppos.x+=X;
tmppos.y+=Y;
ThroWall(&tmppos);
if(DeadOrNoByPos(tmppos.x,tmppos.y))
{
if(lockdelay<=0)
life=0;
else
lockdelay--;
}
else
{
lockdelay=(1000/Delay)+1;
if(tmppos.x==food_x&&tmppos.y