C语言课程设计报告示例 2.docx
《C语言课程设计报告示例 2.docx》由会员分享,可在线阅读,更多相关《C语言课程设计报告示例 2.docx(33页珍藏版)》请在冰豆网上搜索。
![C语言课程设计报告示例 2.docx](https://file1.bdocx.com/fileroot1/2022-11/25/703f164f-84ae-422d-988a-38339c52c7fc/703f164f-84ae-422d-988a-38339c52c7fc1.gif)
C语言课程设计报告示例2
前言
(1)熟练的运用计算机语言,培养了对计算机编程的热爱程度。
(2)学会怎样用c语言做一个完整的系统。
(3)掌握c语言的编辑,链接,运行等环节。
(4)掌握c语言中链表的建立,插入,删除,保存节点。
(5)熟练掌握forwhiledo-while循环语句的使用。
(6)熟练掌握指针的说明、赋值、使用。
(7)掌握用指针引用数组的元素,熟悉指向数组的指针的使用。
(8)熟练掌握字符数组与字符串的使用,掌握指针数组及字符指针数组的用法。
(9)掌握带有参数的main函数的用法。
(10)熟练掌握函数的定义、说明、参数传递及嵌套和递归调用方法。
(11)提高遇到困难解决困难的能力。
(12)提高书写代码的速度与正确率。
(13)提高对系统的完善能力以及思考问题的全面性,提高自己对所学知识的综合应用。
(14)独立实践,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力,提高学生适应实际,实践编程的能力。
目录
1、课程设计背景
2、系统需求分析
3、系统的主要功能
4、游戏的初始化
5、调试与测试软件
6、结论
7、总结
8、附录
1、课程设计背景
该游戏在1990年代由于一些手机将其引入而一时间再度流行起来。
在游戏中,玩家操控一条细长的蛇爬行于一个带边界的平面之上,一路拾起触碰到之事物或其它类似的物件,并要避免触碰到自身或者包围着游戏区的"墙"。
每次贪吃蛇吃掉一件食物,它的身体便增长一些,这让游戏的难度渐渐变大。
操控贪吃蛇时,玩家操控贪吃蛇的头部的朝向(向上、向下、向左或向右)控制贪吃蛇进行方向,贪吃蛇的身体将跟随着其头部行进。
另外,玩家不可在游戏中途停止贪吃蛇的进行。
随着贪吃蛇的成功移植到手机系统,贪吃蛇的操作按键要求与手机按键的完美匹配,使贪吃蛇游戏风靡起来。
贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着我,它的制作方法对于以前的我而言都是很神秘的。
我希望通过自己的所学知识把它剖析开来,真正的了解它的本质和精髓。
虽然我的编程能力不是很强,但是我有信心,在这次学习中我将从实践和实际的项目中提高自己的编程能力。
因此我选定了这个题目。
2、系统需求分析
要开发贪吃蛇游戏程序,首先要分析改程序应实现哪些功能。
对贪蛇游戏程序的功能需求可描述如下:
程序运行后显示动画,按ESC键退出游戏界面后,左边有一个矩形区,外游戏区域,在矩形区中有食物和贪食蛇,右方有统计分数及速度的显示区域。
蛇在封闭围墙利用*摆成矩形表示,围墙里随机的出现一个食物,通过按键盘四个光标键控制蛇向上,下,左,右四个方向移动,蛇头撞到食物,则食物被吃掉,蛇身体长一节,接着又出现食物,等待蛇来吃。
食物用一个*表示,并且每次食物的位置都是随机出现的。
游戏中要使贪吃蛇尽可能的长,但是不能使贪吃蛇撞到四周的墙壁,而且蛇的身体不能撞到一起,
否则游戏结束。
游戏中每吃掉一个食物要有得分,可以调整速度F1加快速度,F2减缓速度。
蛇和食物的数据较多,而且关系密切,贪吃蛇及食物都是定义结构体数据类型,这样定义便于操作与处理。
3、系统的主要功能
3.1模块划分
(1)设置光标的位置模块
(2)创建地图模块
(3)初始化蛇身模块
(4)随机出现食物模块
(5)判断是否咬到自己模块
(6)是否撞墙模块
(7)蛇的控制模块
(8)暂停模块
(9)控制游戏
(10)开始界面模块
(11)结束游戏模块
(12)游戏的初始化模块
3.2游戏界面的控制
3.2.1墙,框架的设计
voidcreatmap()//创建地图。
{
inti;
for(i=0;i<60;i+=2)//创建上下的边框。
{
Pos(i,0);
printf("*");
Pos(i,29);
printf("*");
}
for(i=1;i<29;i++)//创建左右的边框。
{
Pos(0,i);
printf("*");
Pos(58,i);
printf("*");
}
}
3.2.2蛇身的绘制
voidinitsnake()//初始化蛇身。
{
structsnake*tail;
inti;
tail=(snake*)malloc(sizeof(snake));//从蛇尾开始,头插法,以想x,y设定开始的位置
tail->x=24;
tail->y=5;
tail->next=NULL;
for(i=1;i<=4;i++)
{
head=(snake*)malloc(sizeof(snake));
head->next=tail;
head->x=24+2*i;
head->y=5;
tail=head;
}
while(tail!
=NULL)//从头到尾,输出蛇身。
{
Pos(tail->x,tail->y);
printf("*");
tail=tail->next;
}
}
3.2.3食物的绘制
voidcreatefood()//随机出现食物。
{
snake*food_1;
srand((unsigned)time(NULL));//为了防止每次产生的随机数相同,种子设置为time。
food_1=(snake*)malloc(sizeof(snake));
while((food_1->x%2)!
=0)//保证其为偶数,是的食物与蛇头对其。
{
food_1->x=rand()%52+2;
}
food_1->y=rand()%24+1;
q=head;
while(q->next==NULL)
{
if(q->x==food_1->x&&q->y==food_1->y)//判断蛇身是否与食物重合。
{
free(food_1);
createfood();
}
q=q->next;
}
Pos(food_1->x,food_1->y);
food=food_1;
printf("*");
}
3.3游戏的控制
3.3.1蛇的移动
voidsnakemove()//蛇的控制。
{
snake*nexthead;
notacrosswall();
nexthead=(snake*)malloc(sizeof(snake));
if(status==U)
{
nexthead->x=head->x;
nexthead->y=head->y-1;
if(nexthead->x==food->x&&nexthead->y==food->y)//如果有下一个食物。
{
nexthead->next=head;
head=nexthead;
q=head;
while(q!
=NULL)
{
Pos(q->x,q->y);
printf("*");
q=q->next;
}
score=score+add;
createfood();
}
else
{
nexthead->next=head;
head=nexthead;
q=head;
while(q->next->next!
=NULL)
{
Pos(q->x,q->y);
printf("*");
q=q->next;
}
Pos(q->next->x,q->next->y);
printf("");
free(q->next);
q->next=NULL;
}
}
if(status==D)
{
nexthead->x=head->x;
nexthead->y=head->y+1;
if(nexthead->x==food->x&&nexthead->y==food->y)//有食物。
{
nexthead->next=head;
head=nexthead;
q=head;
while(q!
=NULL)
{
Pos(q->x,q->y);
printf("*");
q=q->next;
}
score=score+add;
createfood();
}
else
{
nexthead->next=head;
head=nexthead;
q=head;
while(q->next->next!
=NULL)
{
Pos(q->x,q->y);
printf("*");
q=q->next;
}
Pos(q->next->x,q->next->y);
printf("");
free(q->next);
q->next=NULL;
}
}
if(status==L)
{
nexthead->x=head->x-2;
nexthead->y=head->y;
if(nexthead->x==food->x&&nexthead->y==food->y)
{
nexthead->next=head;
head=nexthead;
q=head;
while(q!
=NULL)
{
Pos(q->x,q->y);
printf("*");
q=q->next;
}
score=score+add;
createfood();
}
else
{
nexthead->next=head;
head=nexthead;
q=head;
while(q->next->next!
=NULL)
{
Pos(q->x,q->y);
printf("*");
q=q->next;
}
Pos(q->next->x,q->next->y);
printf("");
free(q->next);
q->next=NULL;
}
}
if(status==R)
{
nexthead->x=head->x+2;
nexthead->y=head->y;
if(nexthead->x==food->x&&nexthead->y==food->y)
{
nexthead->next=head;
head=nexthead;
q=head;
while(q!
=NULL)
{
Pos(q->x,q->y);
printf("*");
q=q->next;
}
score=score+add;
createfood();
}
else
{
nexthead->next=head;
head=nexthead;
q=head;
while(q->next->next!
=NULL)
{
Pos(q->x,q->y);
printf("*");
q=q->next;
}
Pos(q->next->x,q->next->y);
printf("");
free(q->next);
q->next=NULL;
}
}
if(inself()==1)//判断是否咬到自己。
{
gameover=2;
endgame();
}
}
3.3.2蛇死亡的判断
intinself()//判断是否咬到自己
{
snake*self;
self=head->next;
while(self!
=NULL)
{
if(self->x==head->x&&self->y==head->y)
{
return1;
}
self=self->next;
}
return0;
}
voidnotacrosswall()//不能穿墙。
{
if(head->x==0||head->x==58||head->y==0||head->y==29)
{
gameover=1;
endgame();
}
}
4、游戏的初始化
voidrungame()//控制游戏。
{
Pos(64,15);
printf("不能穿墙,不能咬到自己\n");
Pos(64,16);
printf("用上下左右键分别控制蛇的移动\n");
Pos(64,17);
printf("F1加速,F2减速\n");
Pos(64,18);
printf("ESC:
退出游戏,SPACE:
暂停游戏。
\n");
status=R;
while
(1)
{
Pos(64,10);
printf("得分:
%d",score);
Pos(64,11);
printf("每个食物得分:
%d分",add);
if(GetAsyncKeyState(VK_UP)&&status!
=D)
{
status=U;
}
elseif(GetAsyncKeyState(VK_DOWN)&&status!
=U)
{
status=D;
}
elseif(GetAsyncKeyState(VK_LEFT)&&status!
=R)
{
status=L;
}
elseif(GetAsyncKeyState(VK_RIGHT)&&status!
=L)
{
status=R;
}
elseif(GetAsyncKeyState(VK_SPACE))
{
pause();
}
elseif(GetAsyncKeyState(VK_ESCAPE))
{
gameover=3;
break;
}
elseif(GetAsyncKeyState(VK_F1))
{
if(sleeptime>=50)
{
sleeptime=sleeptime-30;
add=add+2;
if(sleeptime==320)
{
add=2;//防止减到1之后再加回来有错。
}
}
}
elseif(GetAsyncKeyState(VK_F2))
{
if(sleeptime<=350)
{
sleeptime=sleeptime+30;
add=add-2;
if(sleeptime==350)
{
add=1;//保证最低分为1
}
}
}
Sleep(sleeptime);
snakemove();
}
}
5、调试与测试软件
5.1目的
调试与测试软件的目标就是发现并改正潜伏的错误。
一个程序,必须经过认真的调试和测试,才能尽量减少错误、保证程序满足功能、性能需求,达到最初的设计、使用要求,从而保证程序的开发质量。
详细设计完成后,就可以用C语言根据各个模块的算法来设计程序,每个模块都要设计成一个自定义函数。
几个模块可以放在一起构成一个原函数程序文件,也可以一个模块构成一个源程序文件。
原程序设计好后,输入到计算机中,并存储到磁盘上;然后对每个源程序文件都进行了独立编译和调试(具体代码可以参看程序清单);并针对不同的模块程序设计测
试用例进行单元测试;最后,将几个分别开发的模块组装在一起,形成一个完整的程序,进行集成测试,从而发现并改正了程序程序中存在的一些潜藏的错误,并使程序的容错能力大大增强。
5.2错误的类型
本次实习过程中碰到的编译、连接的错误主要有:
(1)缺少变量定义,定义位置不正确;
前后有些变量前后定义和使用不一致,在错误信息的提示下一般还是很容易找到。
需要注意的是有些函数使用同样的变量名而表示不同的作用,因而使用要很小心,定义及定义的位置要特别留意。
为减少这样的错误我后来还是用不同的变量名来表示,结果引起的那些错误解决了。
(2)语法错误;
一些语法错误在信息框的提示下一般是能够排除的。
(3)标点符号错误;
有时输入法没有调整好就会出现中文的标点符号,以至于出错,这是粗心所致,不过辛运的是在信息框里提示一般都会很快的找出来
(4)忘记申明;
后面的又得结构体组,在前面没有进行声明,导致导致的错误。
6、结论
通过1周的课程设计,在我们两个人的开发小组共同努力下,终于完成了贪吃蛇游戏程序的开发任务。
该游戏程序实现了用方向键控制蛇在围墙内爬行、随机产生食物、控制蛇吃掉食物并加分、控制游戏中蛇的运行速度、实时显示得分和速度、结束时处理等功能。
该游戏程序具有界面友好、操作方便、控制准确和容错能力强等特点。
这个贪吃蛇游戏还存在一些缺陷,还应该在如下几个方面加以改进。
1)进入游戏后,到蛇死亡,只能玩一次就会退出程序。
应加入多次游戏的控制能力。
2)蛇的样子不美观,应将蛇头、蛇尾和蛇身进一步美化,
使其更像真实的蛇。
3)当食物吃下去30个时,游戏就会自动关闭,应适当控制蛇的食物量,以便使游戏更具有吸引力。
7、总结
这次的程序实设计实验是对我们进入大学以来学习程序设计语言结果的一次大检验。
发现了自己的许多不足。
平时没有掌握好的知识在这次实验中彻底暴露出来,经过不断思考,不断查阅资料和上机运行,解决其中大部分问题,当然还存在一些问题没有解决。
我相信在以后的学习能够解决好它们。
但是,收获还是不小的,我不仅对C的操作有了进一步的掌握,还了解到了程序设计的书写风格及其注释的格式。
当我选择客户信息这个题目时,一开始想运用大量链表及指针来完成,但是在慢慢琢磨之后,觉得这个不一定要用链表,于是改变了编程思路。
当然还有不少文件的读写问题,不过还是通过不断测试之后顺利解决了。
另外一点要说的就是这个程序用了很多的循环,因此对于循环的控制要十分小心,有时while和do-while的区别也是十分重要的。
总体来说,这次C语言程序设计实验还是比较成功的,虽然最终程序还存在一些不足,但能取得这样的成绩我还是比较高兴的。
最后,要感谢学校为我们提供这次实验机会,也要感谢老师的教导,帮助与支持。
8、附录
#include
#include
#include
#include
#defineU1
#defineD2
#defineL3
#defineR4//蛇身的控制,U是上,D是下,L是左,R是右。
typedefstructsnake//蛇身的结构体变量。
typedefstruct与struct的区别就是下面的声明没有typedef就必须用structsnake来声明。
{
intx;
inty;
structsnake*next;
}snake;
//全局的变量。
intscore=0,add=10;//初始化的分数为0;吃到的食物为10;
intstatus,sleeptime=200;//每次运行的时间间隔。
snake*tail,*food,*head;//蛇头的指针,食物的指针。
snake*q;//遍历蛇的时候用到的指针。
intgameover=0;//游戏结束的情况:
1、撞到墙;2、咬到自己;3、主动退出游戏。
//声明函数
voidPos();
voidcreatmap();
voidinitsnake();
voidcreatefood();
intinself();
voidnotacrosswall();
voidsnakemove();
voidpasue();
voidrungame();
voidinitgame();
voidendgame();
voidgameStart();
voidPos(intx,inty)//设置光标的位置。
{
COORDpos;//coord是windowsAPI中定义的一种结构,表示一个字符在控制台屏幕上的坐标。
HANDLEhOutput;
pos.X=x;
pos.Y=y;
hOutput=GetStdHandle(STD_OUTPUT_HANDLE);//返回标准的输入、输出或错误的设备的句柄,也就是获得输入、输出、错误的屏幕缓冲区的句柄。
SetConsoleCursorPosition(hOutput,pos);
}
voidcreatmap()//创建地图。
{
inti;
for(i=0;i<60;i+=2)//创建上下的边框。
{
Pos(i,0);
printf("*");
Pos(i,29);
printf("*");
}
/*for(i=0;i<30;i++)
{
Pos(i,30);
printf("*");
}*/
for(i=1;i<29;i++)//创建左右的边框。
{
Pos(0,i);
printf("*");
Pos(58,i);
printf("*");
}
}
voidinitsnake()//初始化蛇身。
{
structsnake*tail;
inti;
tail=(snake*)malloc(sizeof(snake));//从蛇尾开始,头插法,以想x,y设定开始的位置
tail->x=24;
tail->y=5;
tail->next=NULL;
for(i=1;i<=4;i++)
{
head=(snake*)malloc(sizeof(snake));
head->next=tail;
head->x=24+2*i;
head->y=5;
tail=head;
}
while(tail!
=NULL)//从头到尾,输出蛇身。
{
Pos(tail->x,tail->y);
printf("*");
tail=tail->next;
}
}
voidcreatefood()//随机出现食物。
{
snake*fo