贪吃蛇课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
1.课程设计目的 (3)
2.课程设计任务与要求 (3)
2.1课程设计内容 (3)
2.2课程设计要求 (3)
2.3课程设计环境 (3)
3.课程设计方案 (3)
3.1方案论证 (3)
3.2程序整体设计说明 (3)
3.3设计思路 (4)
3.4设计总体流程图 (4)
3.5设计的具体实现 (5)
4.程序测试 (8)
4.1测试内容与结果 (8)
4.2程序运行效果图 (9)
5.课程设计总结 (10)
6.参考文献 (11)
附录源程序 (11)
1.课程设计目的:
复习、巩固才C、C++的基础知识,进一步加深对VC技术的理解和掌握;
●课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知
识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。
●培养学生在项目开发中团队合作精神、创新意识及能力
2.课程设计任务与要求
2.1 课程设计内容
贪吃蛇游戏开发,首先它可以为大家提供一种当前比较流行的休闲小游戏。贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着很多人,它的制作方法对于很多同学而言都是很神秘的。所以我们希望通过这学期所学知识把它剖析开来,真真正正的了解它的本质和精髓。在这次学习中我们将从实践和实际的项目中提高自己的编程能力。因此决定选择这个题目作为VC的课程设计。
最后一部分就是游戏的模块划分,根据分析,贪吃蛇这个程序一共要实现如下几个功能,包括游戏方面开始游戏、暂停游戏以及停止游戏,游戏设置(蛇的颜色、食物的颜色操作说明等)与积分。
2.2课程设计要求
●对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;
可以加以其他功能或修饰,使程序更加完善、合理;
●系统设计要实用,采用模块化程序设计方法,编程简练、可用,功能全面;
●说明书、流程图要清楚;
●记录设计情况(备查,也为编写设计说明书作好准备);
2.3课程设计环境
Windows7操作系统,VC6.0开发环境。
3.课程设计方案
3.1方案论证
方案一:基于MFC设计
该方案的好处是系统自动生成软件框架,设计者只需填充编写的代码即可,程序设计比较复杂,对于编程能力不强的同学来说难度较大。
方案二:基于easyX设计
该方案的好处是设计者只需编写程序文件,完成后编译即可生成可执行文件,编程前需要先安装easyX图形库。
由于编程能力不强,方案二设计简单,易于调试,故选择方案二。
3.2程序整体设计说明
一个游戏要有开始部分,运行部分,结束部分(实际上开始部分与运行部分是一体的)。
游戏界面:
1)开始游戏(加载并开始)
2)暂停游戏(从当前进度结束)
3)重新开始(在某一时刻暂停后可以继续接着玩)
游戏设置:
1)蛇的颜色(红色)
2)游戏帮助(游戏控制说明)
3)积分(每次吃掉一个食物增加10分,并显示出来)
3.3设计思路
这个程序的关键是表示蛇的图形以及蛇的移动。用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块。移动时必须从蛇头开始,所以蛇不能向相反方向移动,也就是蛇尾不能改作蛇头。如果不按任何键,蛇自行在当前方向上前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,这时原来蛇的位置和新蛇的位置差一个单位,所以看起来蛇会多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现和消失也是画矩形块和覆盖矩形块。
3.4设计总体流程图
3.5设计的具体实现
1)食物类
struct Food
/*食物的结构体定义*/ {
int x;
/*食物的横坐标*/ int y;
/*食物的纵坐标*/ int addFood;
/*判断是否要出现食物的变量*/
};
2)蛇块类
把蛇分成一块一块,一个蛇相当于有若干个块,蛇块类就是用来描述每块的信息。
struct Snake /*蛇的结构体定义*/
{
int x[MAX_JOINTS]; /*保存蛇身每一节位于屏幕上的列坐标*/
int y[MAX_JOINTS]; /*保存蛇身每一节位于屏幕上的行坐标*/
int joint; /*蛇的节数*/
int direction; /*蛇移动方向*/
int life; /*蛇的生命,0活着,1死亡*/
};
3)初始化游戏
游戏开始界面的初始化:
void InitGraph()
{
cleardevice();
setbkcolor(BLUE); /*设置背景颜色
*/
setcolor(WHITE); /*设置前景颜色*/
cleardevice();
setfont(25, 0, _T("微软雅黑"));
outtextxy(170,150,"Greedy Snake"); /*在坐标(170,150)处输出字符串*/
outtextxy(219,254,"Ready?");
getch();
setbkcolor(0);
cleardevice();
}
4)绘制游戏场景
setlinestyle(PS_SOLID, 5)用于绘制实心的宽度为5个像素的线型,bar(i,40,i+7,47);为画一个左上角为(i,40),右下角为(i+7,47)的矩形条,rectangle(i, 40, i+10, 49)也用于画矩形。
void DrawFence(){
int i;
setbkcolor(LIGHTGREEN);
setlinestyle(PS_SOLID, 5);
//画围墙
setfillstyle(LIGHTBLUE);
for (i=50; i<=591; i+=10){
// rectangle(i, 40, i+10, 49); //上边
bar(i,40,i+7,47);
bar(i, 551, i+7,558); //下边
}
for (i=40; i<=550; i+=10){
bar(50, i, 57, i+7); //左边
bar(591, i, 598, i+7); //右边
}
}
5)结束游戏
PrScore(score)用于输出分数。
void GameOver(int score)
{
cleardevice();
PrScore(score);
setcolor(RED);
setfont(80, 0, _T("微软雅黑"));
outtextxy(100, 200, "GAME OVER");
mciSendString("close mo.mp3", NULL, 0, NULL); //关闭音乐
getch();
exit(0);
}
6)判断是否需要出现食物
if (food.addFood == 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.addFood=0; //画面上有食物
}
if (food.addFood==0) //画面上有食物,则显示
{
setcolor(GREEN);
rectangle(food.x, food.y, food.x+10, food.y-10);
}
7)在没有按键的情况下,蛇自己移动身体
for (i=snake.joint-1; i>0; i--) //蛇的每个节往前移动
{snake.x[i] = snake.x[i-1];
snake.y[i] = snake.y[i-1];