数据结构课程设计报告模板.docx
《数据结构课程设计报告模板.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告模板.docx(17页珍藏版)》请在冰点文库上搜索。
![数据结构课程设计报告模板.docx](https://file1.bingdoc.com/fileroot1/2023-5/5/7ef89d5f-de11-4bf7-b8a6-ae392cd808da/7ef89d5f-de11-4bf7-b8a6-ae392cd808da1.gif)
数据结构课程设计报告模板
[贪吃蛇程序设计]
一、设计课题
贪吃蛇程序设计
二、设计内容
1.工作说明
(1)实现贪吃蛇小游戏的运行,各功能模块分别为食物类型的定义,蛇类型的定义,界面光标位置的显示,蛇的初始化,计分方向控制的显示,边界及界面的显示,食物的输出,控制蛇的死亡,游戏的实现过程等等。
以字符形式输入数据,控制程序的运行,通过ASCII码的转换输出边界、食物、蛇形等界面,并通过字符形式输出分数,操作控制方式,等具体界面显示内容。
否
(2)主函数流程图
否
是
否
是
否
是
是
否
(3)所用到的数据结构的知识及相关数据结构的描述形式
数据类型的表示及实现,算法和算法分析,线性表的链式表示和实现,数组的顺序表示,动态存储管理等。
(4)函数介绍
a界面光标位置函数:
控制界面光标位置,为显示边界、食物等界面显示内容提供依据。
b.方向控制函数:
通过键盘输入指定字母实现对蛇移动方向的控制。
c.初始化蛇函数:
通过链表方式显示蛇的形象,并控制蛇的初始长度、初始移动方向及初始分数。
d.边界及界面显示函数:
通过引用界面光标位置函数,实现在指定位置输出上下左右边界,显示操作方法。
e.计分显示函数:
通过引用界面光标位置函数,实现在指定界面位置输出分数。
f.控制蛇的死亡函数:
讨论当蛇碰到左右上下边界以及咬到自身等几种情况时,通过引用库函数清除当前屏幕,再通过界面光标位置函数在指定位置输出"GameOver!
"、"PressESCtoexit,anyotherkeytoretry!
",接着通过选择是否继续游戏,如果是,通过引用库函数中的跳跃函数,回到指定位置循环程序;如果否,则结束游戏。
g.食物输出函数:
通过引用库函数中的随机数函数随机输出食物,并当蛇吃到食物时,控制蛇长度增长,同时使用递归函数循环输出食物。
h.游戏实现过程函数:
调用以上函数,实现蛇的移动、增长、死亡的具体游戏实现过程。
(5)函数的调用关系
(1)调用了gotoxy()函数的有:
boundary()函数,getscoresys()函数,isdead()函数,play()函数。
(2)play()函数调用的函数有:
gotoxy()函数,boundary()函数,getscoresys()函数,isdead()函数。
(3)主函数main()调用了play()函数。
3、任务实现
(1)在程序中,首先调用蛇的初始化函数initialization()得到蛇,再通过食物输出函数getfood()随机输出一个食物,然后经过使用一个do-while循环。
在这个循环中先调用边界及界面显示函数和界面光标位置函数控制边界及食物的显示,然后判断食物是否被吃掉,如果是,那么继续输出食物;如果否,那么通过调用库函数_kbhit()输入使蛇移动的指令w、a、s、d,以及当输入空格键时暂停程序,当输入ESC键时退出程序。
接着通过判断蛇每吃到一次食物使蛇长度增加1,然后继续通过一个switch()循环不断控制蛇的移动方向,接着调用控制蛇死亡的函数isdead(),然后判断当蛇每吃到一个食物分数加10,长度加1,食物消失,然后调用分数统计函数在界面指定位置输出,最后调用库函数控制蛇的移动速度,完成整个屏幕和缓冲区的清除。
经过该do-while循环达到该程序中蛇的移动,蛇吃食物增长,分数增长等主要主要部分功能的实现。
(2)时间复杂度T(n)=O(n^2)
(3)源代码
#include"stdio.h"
#include"windows.h"
#include"time.h"
#include"setjmp.h"
#include"conio.h"
#defineMAXNOD500
#defineUP1
#defineDOWN-1
#defineLEFT-2
#defineRIGHT2
#defineYES1
#defineNO0
jmp_bufretry;//定义retry为跳跃状态变量
typedefstruct//定义食物类型
{intx;
inty;
intstatus;
}Food;
typedefstruct//定义蛇类型
{int*px;
int*py;
intdirection;
intnodlen;
intscore;
}Snack;
intgotoxy(intx,inty)//界面光标位置
{COORDcd;
cd.X=x-12;
cd.Y=y;
returnSetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cd);
}
voidinitialization(Snack*pss)//初始化蛇
{system("color0a");
pss->px=(int*)malloc(MAXNOD*sizeof(int));
pss->py=(int*)malloc(MAXNOD*sizeof(int));
//memset(pss->px,0,MAXNOD);//转换为ASCII码
//memset(pss->py,0,MAXNOD);
pss->px[0]=0;pss->py[0]=0;
pss->px[1]=1;
pss->py[1]=0;
pss->direction=RIGHT;
pss->nodlen=2;
pss->score=0;
}
voidgetscoresys(Snackscr)//计分
{gotoxy(62,7);
cprintf("分数:
%d",scr.score);
}
intctrltoi(charctr)//方向的控制
{switch(ctr)
{case'w':
returnUP;
case's':
returnDOWN;
case'a':
returnLEFT;
case'd':
returnRIGHT;
}
}
voidboundary()//边界及界面的显示
{intcnt,y;
gotoxy(15,3);
for(cnt=0;cnt<45;cnt++)
{cprintf("%c",31);}
gotoxy(15,20);
for(cnt=0;cnt<45;cnt++)
{cprintf("%c",30);}
for(y=4;y<20;y++)
{gotoxy(15,y);
cprintf("%c",16);
gotoxy(59,y);
cprintf("%c",17);
}
gotoxy(62,9);
cprintf("上:
W");
gotoxy(62,10);
cprintf("下:
S");
gotoxy(62,11);
cprintf("左:
A");
gotoxy(62,12);
cprintf("右:
D");
gotoxy(62,14);
cprintf("暂停:
空格");
gotoxy(62,15);
cprintf("退出:
ESC");
}
intisdead(Snackts)//蛇死
{inti;
charselect;
for(i=0;iif((ts.px[i]==ts.px[ts.nodlen-1]&&ts.py[i]==ts.py[ts.nodlen-1])||((ts.px[ts.nodlen-1]<0))||(ts.px[ts.nodlen-1]>42)||(ts.py[ts.nodlen-1]<0)||(ts.py[ts.nodlen-1]>15))
{system("cls");
gotoxy(15,12);
cprintf("\t\t\t\tGameOver!
\n\t\tPressESCtoexit,anyotherkeytoretry!
\a\n");
flushall();
select=getch();
if(select==27)exit(0);
system("cls");
longjmp(retry,1);//跳到指定位置
}
}
voidgetfood(Snacks,Food*pf)//输出食物
{inti;
cnt:
do
{pf->x=rand()%43;
pf->y=rand()%16;
for(i=0;i{if(s.px[i]==pf->x&&s.py[i]==pf->y)
{gotocnt;}
}
break;
}
while
(1);
pf->status=YES;
}
voidstart()
{
chars;
system("color0e");
cprintf("\n\n\n\t\t\t欢迎来玩贪吃蛇经典小游戏!
\n\n");
cprintf("\n\n\n\t\t\t\t请选择关卡!
!
!
\n\n");
cprintf("\t\t\t\t1:
简单\n\n");
cprintf("\t\t\t\t2:
一般\n\n");
cprintf("\t\t\t\t3:
困难\n\n");
s=getche();
switch(s)
{
case'1':
_sleep(300);break;
case'2':
_sleep(250);break;
case'3':
_sleep(200);break;
}
}
voidplay()
{Snackss;
Foodfoo;
inti,j,dire;
charctrl;
srand((unsigned)time(NULL));//设置随机数种子
setjmp(retry);//跳跃函数
initialization(&ss);
getfood(ss,&foo);
do
{boundary();
gotoxy(foo.x+16,foo.y+4);
if(foo.status==NO)
getfood(ss,&foo);
cprintf("%c",1);
if(_kbhit())
{ctrl=getch();
if(ctrl=='w'||ctrl=='s'||ctrl=='a'||ctrl=='d')
{dire=ctrltoi(ctrl);
if(ss.direction==(0-dire));
elsess.direction=dire;
}
elseif(ctrl=='')system("pause");
elseif(ctrl==27)exit(0);
}
for(i=0;i{ss.px[i]=ss.px[i+1];
ss.py[i]=ss.py[i+1];
}
switch(ss.direction)
{caseUP:
ss.py[ss.nodlen-1]=ss.py[ss.nodlen-1]-1;break;
caseDOWN:
ss.py[ss.nodlen-1]=ss.py[ss.nodlen-1]+1;break;
caseLEFT:
ss.px[ss.nodlen-1]=ss.px[ss.nodlen-1]-1;break;
caseRIGHT:
ss.px[ss.nodlen-1]=ss.px[ss.nodlen-1]+1;
}
for(i=0;i{gotoxy(ss.px[i]+16,ss.py[i]+4);
cprintf("%c",2);
}
isdead(ss);
if(ss.px[ss.nodlen-1]==foo.x&&ss.py[ss.nodlen-1]==foo.y)
{for(j=0;j{ss.px[ss.nodlen-j]=ss.px[ss.nodlen-j-1];
ss.py[ss.nodlen-j]=ss.py[ss.nodlen-j-1];
}
ss.score+=10;
ss.nodlen++;
foo.status=NO;
}
getscoresys(ss);
system("cls");//清除屏幕
flushall();//清除所有缓冲区
}
while
(1);
}
intmain()//贪吃蛇游戏的主函数
{
start();//开始界面,关卡选择
play();
}
4、调试分析
开始界面:
游戏进程:
暂停界面:
游戏结束:
5、不足和改进
不足1:
蛇运行速度过快或过慢。
解决方案:
设置一个可调变量,使得可以根据个人喜好改变速度。
不足2:
程序开始运行时,会出现蛇与随机出现的食物重叠的情况。
解决方案:
去除掉食物随机输出时与蛇重叠位置的食物的输出。
不足3:
纵向边界无法封闭,有间距。
解决方案:
暂无。
不足4:
蛇死了之后无法跳回最初程序继续执行。
解决方案:
使用库函数的非局部跳跃函数实现操作。
3.算法改进设想:
我希望在该程序中使蛇变为可实现变速的,即吃掉一个食物速度加快一定的值;另外希望该程序可以实现选择关卡的能力;还有希望该程序可以进行全屏模式。
三、设计收获及心得体会
(1).收获
通过这次的课程设计我收获了许多,也更加让我认识到数据结构这门课程的重要,同时也巩固和加深了我对数据结构的理解,提高了综合利用本课程所学知识的能力。
另外还培养了我独立思考,深入研究,分析问题,解决问题的能力,以及查阅文献资料的能力,并且提高了我调试程序和对编译器使用的能力。
通过这次的课程设计,也培养了我严肃认真的工作作风,以及团队协作的意识和能力。
此外,通过这次的课程设计也使我理解了之前在数据结构课上没能理解的一些问题,使我认识到理论来源于实践,实践是检验真理的唯一标准。
(2).心得体会
通过这次的课程设计,不仅让我在知识上得到了很大程度的提高,认识到数据结构对我们这个专业的重要性,而且在精神上也使我丰收甚多,让我清楚的认识到学无止境。
这次当程序成功运行时我激动的心情其他人很难理解,而其中的挫折也只有我一个人深有体会,这次的课程设计经历让我感受很多,也让我受益匪浅,我相信在以后的课程设计中我会更加自信,也会更加高质量的完成。