数据结构课程设计报告模板Word格式.docx
《数据结构课程设计报告模板Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告模板Word格式.docx(17页珍藏版)》请在冰点文库上搜索。
,接着通过选择是否继续游戏,如果是,通过引用库函数中的跳跃函数,回到指定位置循环程序;
如果否,则结束游戏。
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"
windows.h"
time.h"
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));
py=(int*)malloc(MAXNOD*sizeof(int));
//memset(pss->
px,0,MAXNOD);
//转换为ASCII码
py,0,MAXNOD);
px[0]=0;
pss->
py[0]=0;
px[1]=1;
py[1]=0;
direction=RIGHT;
nodlen=2;
score=0;
voidgetscoresys(Snackscr)//计分
{gotoxy(62,7);
cprintf("
分数:
%d"
scr.score);
intctrltoi(charctr)//方向的控制
{switch(ctr)
{case'
w'
:
returnUP;
case'
s'
returnDOWN;
a'
returnLEFT;
d'
returnRIGHT;
voidboundary()//边界及界面的显示
{intcnt,y;
gotoxy(15,3);
for(cnt=0;
cnt<
45;
cnt++)
{cprintf("
%c"
31);
}
gotoxy(15,20);
30);
for(y=4;
y<
20;
y++)
{gotoxy(15,y);
16);
gotoxy(59,y);
17);
}
gotoxy(62,9);
上:
W"
gotoxy(62,10);
下:
S"
gotoxy(62,11);
左:
A"
gotoxy(62,12);
右:
D"
gotoxy(62,14);
暂停:
空格"
gotoxy(62,15);
退出:
ESC"
intisdead(Snackts)//蛇死
{inti;
charselect;
for(i=0;
i<
ts.nodlen-1;
i++)
if((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);
\t\t\t\tGameOver!
\n\t\tPressESCtoexit,anyotherkeytoretry!
\a\n"
flushall();
select=getch();
if(select==27)exit(0);
system("
longjmp(retry,1);
//跳到指定位置
voidgetfood(Snacks,Food*pf)//输出食物
cnt:
do
{pf->
x=rand()%43;
pf->
y=rand()%16;
for(i=0;
s.nodlen;
i++)
{if(s.px[i]==pf->
x&
s.py[i]==pf->
y)
{gotocnt;
}
break;
}
while
(1);
status=YES;
voidstart()
{
chars;
color0e"
\n\n\n\t\t\t欢迎来玩贪吃蛇经典小游戏!
\n\n"
\n\n\n\t\t\t\t请选择关卡!
!
\t\t\t\t1:
简单\n\n"
\t\t\t\t2:
一般\n\n"
\t\t\t\t3:
困难\n\n"
s=getche();
switch(s)
{
case'
1'
_sleep(300);
break;
2'
_sleep(250);
3'
_sleep(200);
}
voidplay()
{Snackss;
Foodfoo;
inti,j,dire;
charctrl;
srand((unsigned)time(NULL));
//设置随机数种子
setjmp(retry);
//跳跃函数
initialization(&
ss);
getfood(ss,&
foo);
{boundary();
gotoxy(foo.x+16,foo.y+4);
if(foo.status==NO)
1);
if(_kbhit())
{ctrl=getch();
if(ctrl=='
||ctrl=='
)
{dire=ctrltoi(ctrl);
if(ss.direction==(0-dire));
elsess.direction=dire;
elseif(ctrl=='
'
)system("
pause"
elseif(ctrl==27)exit(0);
ss.nodlen-1;
{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;
caseDOWN:
ss.py[ss.nodlen-1]=ss.py[ss.nodlen-1]+1;
caseLEFT:
ss.px[ss.nodlen-1]=ss.px[ss.nodlen-1]-1;
caseRIGHT:
ss.px[ss.nodlen-1]=ss.px[ss.nodlen-1]+1;
ss.nodlen;
{gotoxy(ss.px[i]+16,ss.py[i]+4);
2);
isdead(ss);
if(ss.px[ss.nodlen-1]==foo.x&
ss.py[ss.nodlen-1]==foo.y)
{for(j=0;
j<
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);
//清除屏幕
//清除所有缓冲区
intmain()//贪吃蛇游戏的主函数
{
start();
//开始界面,关卡选择
play();
4、调试分析
开始界面:
游戏进程:
暂停界面:
游戏结束:
5、不足和改进
不足1:
蛇运行速度过快或过慢。
解决方案:
设置一个可调变量,使得可以根据个人喜好改变速度。
不足2:
程序开始运行时,会出现蛇与随机出现的食物重叠的情况。
去除掉食物随机输出时与蛇重叠位置的食物的输出。
不足3:
纵向边界无法封闭,有间距。
暂无。
不足4:
蛇死了之后无法跳回最初程序继续执行。
使用库函数的非局部跳跃函数实现操作。
3.算法改进设想:
我希望在该程序中使蛇变为可实现变速的,即吃掉一个食物速度加快一定的值;
另外希望该程序可以实现选择关卡的能力;
还有希望该程序可以进行全屏模式。
三、设计收获及心得体会
(1).收获
通过这次的课程设计我收获了许多,也更加让我认识到数据结构这门课程的重要,同时也巩固和加深了我对数据结构的理解,提高了综合利用本课程所学知识的能力。
另外还培养了我独立思考,深入研究,分析问题,解决问题的能力,以及查阅文献资料的能力,并且提高了我调试程序和对编译器使用的能力。
通过这次的课程设计,也培养了我严肃认真的工作作风,以及团队协作的意识和能力。
此外,通过这次的课程设计也使我理解了之前在数据结构课上没能理解的一些问题,使我认识到理论来源于实践,实践是检验真理的唯一标准。
(2).心得体会
通过这次的课程设计,不仅让我在知识上得到了很大程度的提高,认识到数据结构对我们这个专业的重要性,而且在精神上也使我丰收甚多,让我清楚的认识到学无止境。
这次当程序成功运行时我激动的心情其他人很难理解,而其中的挫折也只有我一个人深有体会,这次的课程设计经历让我感受很多,也让我受益匪浅,我相信在以后的课程设计中我会更加自信,也会更加高质量的完成。