贪吃蛇课程设计.docx
《贪吃蛇课程设计.docx》由会员分享,可在线阅读,更多相关《贪吃蛇课程设计.docx(19页珍藏版)》请在冰豆网上搜索。
贪吃蛇课程设计
程序设计基础课程设计
贪吃蛇设计
院系:
计算机科学技术学院
班级:
软件11-2
组长:
闫建哲
组员:
别广路,曹家宁,陈小杰,陈阳,崔殿新
指导教师:
贺薪宇
2011年12月24日
一、概述
1研究的背景及意义…………………………………...3
2设计的任务和需要的知识点…………………………3
3具体完成的设计内容…………………………………3
二、需求分析
2操作方法………………………………………………..3
三、总体设计
1模块化分…………………………………….................4
2总体数据结构设计…………………………………………4
四、详细设计
1主控模块main函数……………………………………4
2背景……………………………………………………5
3游戏过程………………………………………………5
五、实验与总结……………………………………………6
六、程序清单…………………………………………………6
一·概述
本课程设计以软件方法为指导,采用了结构化和模块化的设计方法,以C语言技术为基础,使用WIN-TC为主要开发工具,对贪吃蛇进行了需要分析、总体设计、详细设计、最终完成系统的实现与测试。
1究的背景及意义
社会在发展,生活在进步,与日俱增的人加入全球化的世界。
人们不再拘泥在一块小天地,加班、出差成了人不可避免的公务。
此时娱乐小游戏成了不可取少的一部分。
在手机和电脑成为人们日用品的社会,一款能在其上与性的游戏称为卖家的参考点。
此次课程设计完成的贪吃蛇小游戏,正是为了满足上述需求而设计出来的,,希望能给玩家带来娱乐。
贪吃蛇这一界面友好,操作方便,娱乐性较强。
使人们很好的放松工具。
C语言是国际上广泛流传的、很有发展前途的计算机高级语言。
C语言是一种面向过程的高级语言。
所以说此次课程设计的目的就是更好的了解社会的高级语言。
2设计的任务和需要的知识点
1.课程设计的主要完成任务
(1)通过编写“贪吃蛇游戏“程序,掌握结构化、模块化程序设计的思想,培养解决实际问题的能力。
(2)设计好数组元素与蛇、食物对应关系。
(3)随机产生食物。
(4)有分数统计、分数存储、声音等效果。
2.修要掌握和运用的知识点:
(1)数组的应用。
(2)全局变量的使用。
(3)按键处理。
(4)结构体的应用。
(5)文件的基本操作。
(6)结构化、模块化的设计方法。
3具体完成的设计内容
在本次课程设计中,刘兴阳设计开头动画和音乐播放;李奉泽设计玩游戏的具体过程;郭强设计读取和写入文件函数;刘宏设计对五个人的数据进行排序的函数并存放到指定为文件中;我设计的是设计的是排行榜界面并填入指定文件中对应的数据;文件共同设计的有全局变量的定义和宏定义,函数声明以及主函数。
二·需求分析
1操作方法
(1)进入游戏进入游戏后是游戏片头。
可听见同步音乐。
(2)游戏界面游戏左上边生命和分数,右边是难度。
(3)游戏操作在游戏中,用上下左右控制蛇行动,按ESC键结束游戏。
三·总体设计
1模块化分
(1)主控模块
主控模块有main函数实现,主要用来依次调用哥哥下层模块,从而控制整个程序的功能。
主控模块
动画音乐
图形驱动
画主题界面
游戏过程
退
出
结束处理
写入文件
成绩排序
排行榜
读取记录
(2)动画音乐模块模块
该模块用来同步播放下雪的动画和简单的音乐,并在屏幕的中间输出颜色不断变化的欢迎词语。
(3)画主界面模块
画主界面模块由函数DrawK实现,它画出一个封闭的围墙。
(4)游戏过程模块。
该模块是整个程序的核心模块,它完成整个游戏过程,用GamePlay实现。
(5)游戏结束处理模块。
当游戏结束时,调用ENDPLAY函数进行游戏结束处理。
(6)读取记录模块
该模块由ReadFiles函数实现即用来读取排行榜信息记录。
(7)成绩排序模块
该模块由CompareScore函数实现。
(8)写入文件模块
该模块由WriteFiles函数实现,即将新的排行榜信息写入文件
。
(9)排行榜模块
该模块由Pain_board函数实现。
主要功能是建立排行榜界面,输出五个最高分的玩家姓名和成绩。
(该部分由我设计)
(10)退出
显示排行榜后,返回main函数,按任意键关闭图形系统,并退出程序。
2总体数据结构设计
(1)食物与蛇的数据结构。
Life=0表示蛇死了,不等于零活着。
(2)符号常量的宏定义。
#defineTIME1/就是延长时间,也就是生命/
#defineMARK02500/就是过关分数/
(3)全局变量的定义
Intlife=4/初始化生命4/
四详细设计(主要介绍下主函数和游戏的具体过程以及我设计的排行榜部分)
1主控模块main函数。
主函数是程序的主控模板。
首先初始化图形系统,然后调用DrawSnow函数播放动画和音乐,接着调用Init函数初始化图形系统,之后调用DrawK函数画出游戏开始画面,在调用GamePlay函数,即开始了游戏的具体过程,游戏结束后调用EndPlay函数进行游戏结束处理:
从文件中读取记录信息、排序、显示排行榜信息,最后关闭图形系统,结束程序。
主模块的算法流程图如图所示。
其中带有两个竖线的矩形框表示对自定义函数的调用。
关闭图形系统
画游戏开始界面
开始
结束
画游戏开始界面
进入游戏
具体过程
结束处理,
关闭
初始化图形系统
画游戏开始界面
画游戏开始界面
4
3游戏过程
进入游戏
初始化
按键
蛇移动
上、下、左、右控制
碰到食物
食物消失,得分
蛇加长,出现新食物
上下左右开始
撞墙,或撞到自己,生命减一。
Esc退出
是、否四次
退出
是
否
退出游戏
5
五实验与总结
实践出真知,通过对贪吃蛇游戏的制作过程,让我们认识到了许多,比如循环函数的应用、指针函数的应用,在加同步音乐时,总是不能正常的运行,但经过全组成员的努力,
总结:
我们的这款游戏软件基本上达到了设计题目的要求,功能上只是开场界面不是动画稍微负缺,界面有菜单、音乐和进入游戏的提示,游戏中界面美观,游戏操作正确,并能显示分数,并能正确退游戏。
我们希望在下次的程序设计中能更进一步,设计出更好的游戏。
在这次程序设计中我们充分认识到了集体合作的力量,如果一个人我想是无法完成这么大的一个工程量的,因为查代码和修改是很不容易的,没有多方的努力和老师的努力,不知道结果会怎么样。
所以我们组总结出的一句话是:
团结就是力量。
六程序清单
#include
#include
#include
#include
#include
#include
#include
#include
#defineN200
#defineLEFT0x4b00
#defineRIGHT0x4d00
#defineDOWN0x5000
#defineUP0x4800
#defineESC0x011b
#defineFILENAME"c:
\\person.dat"
structperson
{
charname[20];
intscore;
};
structpersonper[5];
structSnow
{
intx;
inty;
intspeed;
}snow[100];
intsnownum=0;
intsize;
intchange=10;
intscore=0;
void*save;
inti,key;
intgamespeed=400;
structFood
{
intx;
inty;
intyes;
}food;
structSnake
{
intx[N];
inty[N];
intnode;
intdirection;
intlife;
}snake;
voidDrawSnow();
voidReadFiles();
voidWriteFiles(structperson*);
voidInitScoreFiles();
voidCompareScore(structperson);
voidEndPlay();
voidpain_board();
voidPr()
{ints[15]={0,100,150,200,150,200,250,150,250,300,250,150,100,250,350};
setcolor(change/10);
settextstyle(0,0,4);
outtextxy(20,200,"WELCOMETOOURGAME!
!
");
sound(s[change/10]);
}
voidDrawSnow()
{inti;
intsx[62];
setlinestyle(SOLID_LINE,0,THICK_WIDTH);
line(1,1,9,9);
line(0,5,10,5);
line(9,1,1,9);
save=malloc(200);
getimage(0,0,10,10,save);
cleardevice();
randomize();
for(i=0;i<62;i++)
sx[i]=(i+2)*10;
while(!
kbhit())
{Pr();
if(snownum!
=100)
{snow[snownum].speed=2+random(5);
i=random(62);
snow[snownum].x=sx[i];
snow[snownum].y=10-random(100);
}
for(i=0;iputimage(snow[i].x,snow[i].y,save,COPY_PUT);
delay(100);
cleardevice();
Pr();
if(snownum!
=100)snownum++;
setfillstyle(SOLID_FILL,15);
for(i=0;i{snow[i].y+=snow[i].speed;
putimage(snow[i].x,snow[i].y,save,COPY_PUT);
if(snow[i].y>500)snow[i].y=10-random(200);
}
change++;
if(change==140)change=10;
}
nosound();
cleardevice();
}
voidInit(void)
{intgd=DETECT,gm;
initgraph(&gd,&gm,"C:
\\tc30\\BGI");
cleardevice();
}
voidDrawK(void)
{inti;
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);
}
outtextxy(20,5,"GreedySnakeGame1.4.0_1");
outtextxy(480,10,"scorelevel");
}
voidGamePlay(void)
{
intlevel=1;
charbuffer[10];
randomize();
food.yes=1;
snake.life=0;
snake.direction=1;
snake.x[1]=100;snake.y[1]=100;
snake.x[0]=110;snake.y[0]=100;
snake.node=2;
while
(1)
{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);
}
setfillstyle(1,1);
bar(475,18,590,35);
setcolor(15);
itoa(score,buffer,10);
outtextxy(480,20,buffer);
itoa(level,buffer,10);
outtextxy(560,20,buffer);
for(i=snake.node-1;i>0;i--)
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
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{
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{snake.life=1;
break;
}
}
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455)
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.node++;
food.yes=1;
score+=10;
if(score%50==0)
{
level+=1;
gamespeed-=50;
}
}
setcolor(4);
for(i=0;irectangle(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);
}
if(snake.life==1)break;
key=bioskey(0);
if(key==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;
}
}
voidReadFiles()
{
FILE*fpread;
if((fpread=fopen(FILENAME,"ab+"))==NULL)
{
printf("can'topenthefileperson.dat!
");
exit(0);
}
if(fgetc(fpread)==EOF)InitScoreFiles();
rewind(fpread);
fread(per,sizeof(structperson),5,fpread);
fclose(fpread);
}
voidWriteFiles(structperson*tmp)
{FILE*fpwrite;
if((fpwrite=fopen(FILENAME,"wb+"))==NULL)
{printf("can'topenthefileperson.dat!
");exit(0);
}
fwrite(tmp,sizeof(structperson),5,fpwrite);
fclose(fpwrite);
}
voidInitScoreFiles()
{inti;
structpersona[5];
for(i=0;i<5;i++)
{a[i].score=0;
strcpy(a[i].name,"nobody");
}
WriteFiles(a);
}
voidCompareScore(structpersondes)
{inti,j;
for(i=0;i<5;i++)
{if(des.score>=per[i].score)
{if(i<5)
{for(j=4;j>=i+1;j--)
per[j]=per[j-1];
}
per[i]=des;
break;
}
}
}
voidpain_board()
{
inti;
charstring[10];
ReadFiles();
setfillstyle(1,9);
bar(482,227,599,239);
outtextxy(490,230,"Highestboard");
setcolor(15);
rectangle(480,225,600,240);
setcolor(8);
rectangle(481,226,601,241);
setfillstyle(1,7);
bar(475,257,610,426);
setcolor(15);
line(475,257,610,257);
line(475,257,475,426);
setcolor
(1);
outtextxy(480,265,"namescore");
for(i=0;i<5;i++)
{setcolor(4);
outtextxy(480,290+i*30,per[i].name);
itoa(per[i].score,string,10);
setcolor(14);
outtextxy(580,290+i*30,string);
setcolor(8);
line(476,280+i*30,609,280+i*30);
setcolor(15);
line(476,281+i*30,609,281+i*30);
}
getch();
}
voidEndPlay()
{structpersonCurPerson;
ReadFiles();
if(score>per[4].score)
{setfillstyle(1,9);
bar(14,14,447,419);
outtextxy(50,250,"Refueling!
YourScoreEntertheBoard!
");
outtextxy(50,270,"pleaseenteryourname:
");
gotoxy(7,19);
printf("");
gotoxy(7,19);
scanf("%s",CurPerson.name);
CurPerson.score=score;
CompareScore(CurPerson);
WriteFiles(per);
}
elseouttextxy(70,250,"YourScoreisnotenoughontheBoard!
");
pain_board();
}
voidmain()
{structpersonCurPerson;
intgd=DETECT,gm;
initgraph(&gd,&gm,"c:
\\TC30\\BGI");
DrawSnow();
printf("PressEnterkeytocontinue...\n");
getchar();
Init();
DrawK();
GamePlay();
EndPlay();
getch();
closegraph();
}8