贪吃蛇wordabc最后的文档格式.docx
- 文档编号:22108082
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:38
- 大小:173.19KB
贪吃蛇wordabc最后的文档格式.docx
《贪吃蛇wordabc最后的文档格式.docx》由会员分享,可在线阅读,更多相关《贪吃蛇wordabc最后的文档格式.docx(38页珍藏版)》请在冰豆网上搜索。
课程设计验收成绩:
课程设计报告成绩:
课程设计总成绩:
指导教师签章
2010年12月31日
c
目录
一概述2
二总体设计方案…………………………………....4
三详细设计……………………………………………7
四程序的调试与运行结果说明16
五调试出现的问题与修改…………………………..17
六课程设计总结18
参考文献19
附录20
一概述
1程序设计的目的
1)使学生更深入地理解和掌握该课程中的基本概念,程序设计的思想、技术和方法。
2)培养学生综合运用所学知识独立完成课题以及撰写课程设计报告的能力。
3)培养学生勇于探索、严谨推理、实事求是、有过必改,用实践来检验理论,全方位考虑问题等科学技术人员应该具有的素质。
4)提高学生对工作认真负责、一丝不苟,对同学团结友爱、协作攻关的基本素质。
5)培养学生从资料文献、科学实验中获得新知识的能力,提高学生从别人的经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。
6)对学生掌握知识的深度、运用理论去处理问题的能力、实践动手能力、课程设计能力、书面及口头表达能力进行综合考核。
2课程设计要求
1)学生自由组成课程设计软件开发小组(即开发团队),可由指导教师确定没组的人数建议每组为3人左右,并选举1人任组长。
指导教师可根据各个开发小组的实际情况进行必要的调整。
2)每组选择课程设计题目中的一个课题,即开发一个所选课题的软件系统,每组独立完成。
3)该软件系统运行时应先播放同步的动画音乐,要求每个人有自己的动画音乐,播放完后,通过口令验证(即登录)才能进入带有下拉菜单的“XXX系统”的窗口界面。
4)进一步掌握C语言集成开发环境。
5)熟练掌握C语言的数据类型、几种基本结构、数组、指针、结构体、文件、链表。
6)从书中或从互联网上查阅相关资料,自学具体课程中涉及到的新知识。
7)采用结构化、模块化程序设计方法进行设计,功能要完善,界面要美观,应具有一定的创新。
8)软件开发小组组长带领本小组成员团结协作,共同完成本课题的设计务。
要求开发小组中每个组员都应该独立设计若干个模块,每个人设计的有效源程序代码应在200行以上。
同时要读
懂其他组员完成的内容。
3课程设计的主要设计思想
现将此程序化分几个模块,然后分组进行编排程序。
其中模块包括主控模块(main函数.14行)动画音乐模块(DrawSnow函数33行)画主界面模块(DrawK函数15行)游戏过程模块(GamePlay函数85行)读取记录模块游戏结束处理模块(EndPlay函数18行)成绩排序模块写入文件模块排行榜模块退出。
还包含命令.全局变量的定义和宏定义,函数声明(50行)
二总体设计方案
确定贪吃蛇游戏体系结构,给出总体模块结构图,确定程序的主要函数之间的调用关系,同时设计蛇与游戏者等的数据结构
1.本程序采用结构化程序设计的方法,按照自顶向下、逐步细化的方法对要解决的问题进行逐层分解。
首先画出顶层模块(第0层),记主控模块,只完成对下层模块的调用功能,即调用其他的功能模块;
接着,按需求分析中的功能需求设计第一层模块有音乐动画、图形驱动、画主界面、游戏过程、结束处理、退出等6个主要功能;
接着,画出第二层模块。
总体模块结构如图所示:
2总体数据结构设计
设计思路:
程序的关键在于表示蛇的图形及蛇的移动。
用一个小矩形方块表示蛇的一节身体身体每长一节,增加一个矩形块,蛇头也用同样的一节小矩形方块表示。
移动时必须从舌头开始,要求蛇在爬行时不能向反方的方向移动。
如果没有按下方向键,蛇自行在当前方向上向前爬行,当按下有效方向键后,蛇头朝该方向移动,一步一动一节身体。
所以按下有效方向键后,应先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇。
这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一节蛇身。
为了便于理解,定义两个结构体:
食物与蛇。
下面介绍贪吃蛇的主要数据结构。
1)食物与蛇的数据结构
表示食物与蛇的矩形块设计为10*10个像素单位,食物的基本数据域为它所出现的位置,用x和y坐标表示,则矩形块用函数rectangle(x,y,x+10,y+10)或rectangle(x,y,x+10,y-10)可以画出。
由于每次只出现一个食物,所以设定yes表示是否需要出现食物。
yes=1表示没有食物或食物已被蛇吃掉,需要画出食物。
放置食物后,置yes=0。
蛇的一节身体为一个矩形块,表示矩形块只需左上角点坐标(x,y)。
由于在游戏过程中蛇的身体不断增长,需用数组存放每节坐标,最大设定为N=200,node表示当前节数。
direction是保存蛇的移动方向的变量,其值可为1,2,3,4之一,分别表示右,左,上,下的方向。
Life是表示生命的变量,life=0表示蛇活着,一旦life=1,表示蛇死,游戏结束。
#defineN200
structFood{intx;
inty;
intyes;
}
food;
/*蛇的结构*/
structSnake
{intx[N];
inty[N];
intnode;
intdirection;
intlife;
}snake;
2.排行榜中优胜者的姓名和成绩。
为了存放排行榜信息,可定义如下的结构体类型,其中字符数组name成员存放优胜者的姓名,整型变量score成员存放优胜者的成绩。
structperson
{
charname[20];
intscore;
};
3.其他全局变量的定义
structpersonper[5];
intscore=0;
intgamespeed=400;
4.符号常量的宏定义
#defineLEFT0x4b00
#defineRIGHT0x4d00
#defineDOWN0x5000
#defineUP0x4800
#defineESC0x011b
#defineFILENAME"
c:
\\person.dat"
三详细设计
算法设计(程序流程图)
(1).系统功能与分析(填写你所设计的菜单及流程图)。
在游戏程序中,主任务0主要完成一些初始化的工作,开机画面的显示。
在任务2种一开始将屏幕清屏,然后绘制贪食蛇游戏的边界和计分状态,最后进入一个无限循环,在循环体中根据游戏者的按键进行相应的处理,详细流程图如下图所示:
Reset键暂停键
方向键
图3.3贪食蛇吃豆的任务流程图
游戏具体过程模块的流程图如下:
T
蛇的动态显示建立在任务2,主要是不停的更新蛇的位置,另外每更新一次还需要判断蛇是否碰到边界,是否碰到自己身子,是否吃到豆子等。
其流程图如下;
功能:
进行贪食蛇游戏
分析:
定义键盘方向键操作,随机数发生器产生食物,并分别利用函数判断贪食蛇的长度及游戏是否成功等.
并能够输入游戏成绩.
(2).数据结构
structFood
intx;
/*食物的横坐标*/
inty;
/*食物的纵坐标*/
intyes;
/*判断是否要出现食物的变量*/
}food;
/*食物的结构体*/
structSnake
}
intx[N];
inty[N];
intnode;
/*蛇的节数*/
intdirection;
/*蛇移动方向*/
intlife;
/*蛇的生命,0活着,1死亡*/
}snake;
(3).模块设计
根据功能需要:
源文件:
#include<
stdio.h>
#include<
graphics.h>
stdlib.h>
dos.h>
函数名功能
voidmain()游戏主程序
voidInit(void);
图形驱动
voidClose(void);
图形结束
voidDrawK(void);
开始画面
voidGameOver(void);
结束游戏
voidGamePlay(void);
玩游戏具体过程
voidPrScore(void);
输出
1、蛇自由移动:
在没有任何按键的时候,蛇按照初始方向向前移动;
2、方向键控制蛇的移动方向:
用方向键控制蛇结构体里面的方向成员。
同时如果不出现蛇死亡或者按ESC键,我们可以永远玩游戏。
永远玩游戏这里将用到一个什么语句?
永循环
while
(1)
while(bioskey
(1)==0)表示无键盘输入
Gameplay()程序结构
while
(1)
{
while(bioskey
(1)==0)
{
蛇身、蛇头坐标的改变
画出蛇,并使蛇运动
}
/*endwhile(!
bioskey
(1))*/
监听方向键及ESC键
}
/*endwhile*/
判断是否需要出现食物,并进行相应的操作
食物及蛇状态的初始化
数据结构设计:
用一个小矩形方块表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头也同样的增加一节小矩形方块表示。
移动时必须从蛇头开始,要求蛇在爬行时向相反的方向移动。
如果没有按下方向键,蛇自行在当前方向上爬行,当按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体。
所以按下有效方向键后,,应先确定舌头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇。
这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一节蛇身,即看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。
食物的出现与消失也是画矩形块和覆盖矩形块。
为了便于理解,定义两个结构体,食物与蛇。
3、蛇的移动
移动的思想:
(1)蛇身、蛇头坐标的改变
蛇身:
将蛇的第二节在屏幕中的坐标移动到第一
节,第三节中的坐标节移动到第二节……
蛇头:
随着方向键走。
(2)蛇向前运动:
画出蛇,延时(gamespeed),并用用背景色去除
蛇的最后一节
4、蛇的坐标改变
for(i=snake。
node-1;
i>
0;
i--)
{
snake。
x[i]=snake。
x[i-1];
y[i]=snake。
y[i-1];
5、方向键的表示
上
下
左
右
UP
DOWN
LEFT
RIGHT
1
2
3
4
6、如果蛇结构体的方向成员为
1:
y[0]-=10;
2:
……………
3:
4:
7、蛇向前运动
画蛇(for)
delay(gamespeed);
用背景色去除蛇的最后一结:
(1)接受按键:
key=bioskey(0);
(2)按ESC键退出游戏
(3)方向键改变蛇的结构体方向成员
如果key==UP&
&
snake。
direction!
=2:
snake。
direction=1;
………依此………。
。
类推…………………………
(二)、方向键控制蛇的移动
四、设置游戏规则
1、判断蛇是否撞击自己,如果撞击自己游戏就结束(调用gameover()函数,在程序外面定义gameover()函数,同时蛇的生命成员为1;
2、判断蛇是否撞击墙壁,如果撞击墙边游戏就结束(调用gameover()函数),同时蛇的生命成员为1;
3、判断蛇是否吃到食物,如果吃到食物,先把食物擦除,蛇长度加1,食物的判断变量food。
yes=1,分数加10,输出分数(调用显示
分数函数printscore(),在程序外面定义printscore()函数);
判断蛇是否撞击自己
for(i=3;
i<
node;
i++)
if(snake。
x[i]==snake。
x[0]&
y[i]==snake。
y[0])
{
GameOver();
life=1;
break;
判断蛇是否撞击墙壁
判断蛇头坐标是否撞击墙壁
若撞击,调用GameOver();
并将蛇的状态设置为1
判断蛇是否吃到食物
判断蛇头与食物坐标是否相同
相同:
擦除食物
蛇的身体长一节
改变food。
yes的状态
score增加10
输出新得分:
PrScore();
Gameover()函数
使用到的库函数:
cleardevice()
/*图形模式下清除屏幕上的内容*/
settextstyle();
/*设置图形模式下字符显示的字体、方向和大小*/
outtextxy();
/*图形模式下在x,y坐标位置显示一行字符串*/
Printscore()函数
用到的库函数:
setfillstyle(pattern,color);
/*设置填充模式和填充颜色*/
bar(left,top,right,bottom);
/*画矩形,并填充矩形内部区域*/用于分数的底色*/
setcolor(6);
/*用于分数的底色*/
settextstyle(0,0,2);
sprintf(str,“score:
%d”,score);
/*把要输出的字符转移给字符数组str(str要先定义)*/
outtextxy(55,20,str);
/*输出分数*/
Gameplay()
食物及蛇状态的初始化
Printscore()
while
(1)
判断是否需要出现食物
判断蛇是否撞击自己
判断蛇是否撞击墙壁
life==1)break;
判断蛇是否吃到食物
画出蛇,并使蛇运动
}/*endwhile(!
/*endwhile
(1)*/
四程序的调试与运行结果说明
a)表示蛇的图形及蛇的移动方向。
用一个小矩形块表示蛇的一节身体,身体每长一节,增加一个矩形块。
移动时必须从蛇头开始,所以蛇不能向相反的方向移动。
如果不安任何键,蛇自行在当前方向上移动,当游戏者按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动。
在图形的实现上,从蛇头的新位置开始画出蛇。
这时,由于没有清屏的原因,原来蛇的位置和新蛇的位置差一个单位,将蛇的最后一节用背景色覆盖。
b)检测蛇有无撞到食物、围墙或是自己的身体。
当蛇开始移动之后,需要判断蛇头要移动到的新的位置的情况,然后根据新位置是空白、食物、围墙还是蛇的身体来做出相应的操作。
可以用一个二维数组来表示整个场景,以不同的值来表示每个位置的情况。
c)事物的随机产生。
当食物被吃掉后,要在场景中重新随机产生。
利用C语言提供的随机函数rand()产生随机数并将该随机数缩小到符合场景大小的范围中来,以此作为食物位置的横纵坐标。
d)蛇的移动速度调节。
在高级功能中,当分数达到一定的值后,移动速度将进行一定的提升。
主要利用蛇的两次移动
e)之间的时间间隔来实现,也就是调整两次循环之间的停顿时间,可以使用TuborC函数库中的delay()函数来实现。
f)奖励事物的定时机制。
解决这个问题要用到时钟中断。
时钟中断大约每秒钟发生18.2次。
截获正常的时钟中断后,先处理完正常的时钟中断,将计时变量加1.这样,每秒钟计时变量约增加18。
需要控制时间的时候,只要看这个计时变量就行了。
截获时钟中断要用到函数getvect()和setvect()。
五调试出现的问题与修改
1)速度
问题:
在原始的代码中,在开始时速度太慢,消耗的时间太长没有给玩家带来乐趣,反而觉得无聊:
随着等级的提升,速度越来越快,但是在达到8级时速度的时间差就成为0mas了,游戏就不能继续进行了。
修改:
我们考虑到玩家的感受,在游戏开始时(即等级低时)进行了速度的提高,使玩家没有无聊的感受。
并且随着等级的提升,速度会加快,蛇身会变长,难度加大。
在等级提升到一定程度时,速度不再变大,蛇身的长度足以满足玩家对难度的要求。
2)分数与等级
问题:
在原始代码中,蛇吃一个食物得10分,吃食物太过单调;
每得50分升一级,在玩游戏的过程中没有体现到低等级与高等级难度的差别。
为了提高游戏的乐趣与刺激性,我组在得分上进行了改进,在毎吃一个食物得10分基础上进行了修改,我们在每五个食物中的最后一个食物的得分改为50分,使玩家可以在第五个食物出现时增加紧张度,增加刺激性,使玩家得到更多的乐趣!
在升级的方面,我们对程序进行了修改,随着等级的升高,升级所需的分数成等差增加,使升级越来越难,体现低等级和高等级的区别,使玩家乐于追求新的高度!
六课程设计总结
通过在编写游戏的过程中不仅考查了我们所学的知识,而且也提高了我们的动手的能力,培养了我们思考问题并解决问题的能力,同时也使得我们更能进一步去了解程序设计的思想、技术和方法。
增加量我们在编程方面的兴趣,也进一步告诉我们理论知识必须要通过实践来检验。
当然,在编程的过程中我们遇到了很多的困难,这就要我们组员间合作来解决并把进一步完善程序,让我们懂得团队合作的重要性。
同时,在编程完成后使我们懂得编写一个程序的不易,加大了我们对以后学习刻苦努力的决心,不要让一些错误发生在我们学过的知识中。
在编程的同时也告诉我们在编写一个程序的时候不要拘于所学的知识,要广涣阅读课外书籍,向同学借鉴经验,努力编好每一段代码。
最后,在本次编程过程中让我们学到了很多在课本上学不到的知识,首先是团队间的合作是编写一个程序的关键所在,没有
一个团结的团队是不可能完成任务的。
其次是学会了包容,这但对于一个团队也是不可或缺的,有了一颗包容的心,再大的困那也难不到我们。
最后一点也是很重要的那就是不论遇到什么困难都要有一颗不怕输的精神,只有这样才能使我们的团体永攀高峰。
我们在这次编写程序的过程中遇到的一些困难之所以能够及时地解决要非常感谢我们的课程设计指导老师郑惠老师,有了她的细心指导和耐心的帮助,她不仅教授了我们很多的知识,同时还告诉了很多在编程方面的技巧,在日常生活中做人的准则。
在编程过程中,我们组员间也结下了深厚的友谊,感受到了编程的乐趣。
在本次编程结束之际,我们要再次感谢那些曾今帮助过我们的同学和老师,有了你们的帮助,我们少走了不少的弯路,你们是我们在这次编程中的明灯。
参考文献
【1】谭浩强.C程序设计题(第三版)
【M】.北京:
清华大学出版社,2005.
【2】王成瑞,魏先民.C语言程序设计实训——题解,实验,课程设计与样题【M】.
北京:
中国水利水电出版社,2005.
【3】谭浩强.C程序设计题解与上级指导(第三版)
【4】贪食蛇算法C语言版(借鉴其算法)
网址:
附录
#include<
time.h>
conio.h>
/*排行
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪吃 wordabc 最后