贪吃蛇课程设计报告.docx
- 文档编号:30257755
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:20
- 大小:48.14KB
贪吃蛇课程设计报告.docx
《贪吃蛇课程设计报告.docx》由会员分享,可在线阅读,更多相关《贪吃蛇课程设计报告.docx(20页珍藏版)》请在冰豆网上搜索。
贪吃蛇课程设计报告
1.课程设计目的……………………………………………………………3
2.课程设计任务与要求…………………………………………………3
课程设计内容…………………………………………………………3
课程设计要求…………………………………………………………3
课程设计环境…………………………………………………………3
3.课程设计方案……………………………………………………………3
方案论证………………………………………………………………3
程序整体设计说明………………………………………………………3
设计思路………………………………………………………………4
设计总体流程图………………………………………………………4
设计的具体实现………………………………………………………5
4.程序测试…………………………………………………………………8
测试内容与结果………………………………………………………8
程序运行效果图………………………………………………………9
5.课程设计总结…………………………………………………………10
6.参考文献…………………………………………………………………11
附录源程序…………………………………………………………………11
1.课程设计目的:
●复习、巩固才C、C++的基础知识,进一步加深对VC技术的理解和掌握;
●课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。
●培养学生在项目开发中团队合作精神、创新意识及能力
2.课程设计任务与要求
课程设计内容
贪吃蛇游戏开发,首先它可以为大家提供一种当前比较流行的休闲小游戏。
贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着很多人,它的制作方法对于很多同学而言都是很神秘的。
所以我们希望通过这学期所学知识把它剖析开来,真真正正的了解它的本质和精髓。
在这次学习中我们将从实践和实际的项目中提高自己的编程能力。
因此决定选择这个题目作为VC的课程设计。
最后一部分就是游戏的模块划分,根据分析,贪吃蛇这个程序一共要实现如下几个功能,包括游戏方面开始游戏、暂停游戏以及停止游戏,游戏设置(蛇的颜色、食物的颜色操作说明等)与积分。
课程设计要求
●对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理;
●系统设计要实用,采用模块化程序设计方法,编程简练、可用,功能全面;
●说明书、流程图要清楚;
●记录设计情况(备查,也为编写设计说明书作好准备);
课程设计环境
Windows7操作系统,开发环境。
3.课程设计方案
方案论证
方案一:
基于MFC设计
该方案的好处是系统自动生成软件框架,设计者只需填充编写的代码即可,程序设计比较复杂,对于编程能力不强的同学来说难度较大。
方案二:
基于easyX设计
该方案的好处是设计者只需编写程序文件,完成后编译即可生成可执行文件,编程前需要先安装easyX图形库。
由于编程能力不强,方案二设计简单,易于调试,故选择方案二。
程序整体设计说明
一个游戏要有开始部分,运行部分,结束部分(实际上开始部分与运行部分是一体的)。
游戏界面:
1)开始游戏(加载并开始)
2)暂停游戏(从当前进度结束)
3)重新开始(在某一时刻暂停后可以继续接着玩)
游戏设置:
1)蛇的颜色(红色)
2)游戏帮助(游戏控制说明)
3)积分(每次吃掉一个食物增加10分,并显示出来)
设计思路
这个程序的关键是表示蛇的图形以及蛇的移动。
用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块。
移动时必须从蛇头开始,所以蛇不能向相反方向移动,也就是蛇尾不能改作蛇头。
如果不按任何键,蛇自行在当前方向上前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,这时原来蛇的位置和新蛇的位置差一个单位,所以看起来蛇会多一节身体,所以将蛇的最后一节用背景色覆盖。
食物的出现和消失也是画矩形块和覆盖矩形块。
设计总体流程图
设计的具体实现
1)食物类
structFood/*食物的结构体定义*/
{
intx;/*食物的横坐标*/
inty;/*食物的纵坐标*/
intaddFood;/*判断是否要出现食物的变量*/
};
2)蛇块类
把蛇分成一块一块,一个蛇相当于有若干个块,蛇块类就是用来描述每块的信息。
structSnake/*蛇的结构体定义*/
{
intx[MAX_JOINTS];/*保存蛇身每一节位于屏幕上的列坐标*/
inty[MAX_JOINTS];/*保存蛇身每一节位于屏幕上的行坐标*/
intjoint;/*蛇的节数*/
intdirection;/*蛇移动方向*/
intlife;/*蛇的生命,0活着,1死亡*/
};
3)初始化游戏
游戏开始界面的初始化:
voidInitGraph()
{
cleardevice();
setbkcolor(BLUE);/*设置背景颜色*/
setcolor(WHITE);/*设置前景颜色*/
cleardevice();
setfont(25,0,_T("微软雅黑"));
outtextxy(170,150,"GreedySnake");/*在坐标(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)也用于画矩形。
voidDrawFence(){
inti;
setbkcolor(LIGHTGREEN);
setlinestyle(PS_SOLID,5);
蛇的第四节开始判断是否撞到自己,因为蛇头为两节,第三节不可能拐过来
for(i=3;i<;i++)
{
if[i]==[0]&&[i]==[0])
{
GameOver(score);断蛇是否撞到墙壁
if[0]<55||[0]>595||[0]<55||[0]>455)
{
GameOver(score);断是否撞到障碍物
for(intobs_i=0;obs_i<();obs_i++)
{
if(vox[obs_i]==[0]&&voy[obs_i]==[0])GameOver(score);
}
以上三种判断以后,如果蛇死就跳出内循环,重新开始。
9)吃到食物后画蛇
if[0]==&&[0]==序测试
测试内容与结果
1)开始:
程序运行后,会出来蓝色背景界面和提示语Ready,按任意键开始,注意不要在中文输入法下玩。
开始后只有两节的红色蛇和一个绿色的食物,并且蛇是运动的。
2)方向键和WSAD键:
蛇开始运行之后,当点击上下左右键(或WSAD)蛇就会按相应的方向运动,蛇不能180度转弯,只能进行90度的转弯。
程序检测时蛇确实会按点击方向运动且不会向相反方向运动,所有方向键使用正确。
3)暂停/继续:
当程序正在运行时,点击暂停/继续按钮“P”,蛇停在当前的位置,再次点击“P”蛇又从当前位置继续运动。
此按钮符合要求,所以暂停/继续按钮使用正确,功能能够实现。
4)重新开始:
当游戏结束或想重新开始一局时,点击按钮“R”,游戏又回到最初的状态,一个食物,一个运动着的红色蛇块,且游戏积分清零。
所以重新开始功能能够实现。
5)界面右侧能够出现按键提示和分数显示等有关信息。
程序运行效果图
5.课程设计总结
在设计这个程序中我主要学会了如何运用以下有关C语言和C++的知识:
1)函数定义是要做到顾名思义是很重要的,它对读程序的人正确认识程序十分重要,在修改这个程序的过程中也能很快找到程序各模块的作用,大大增加了程序的可读性。
2)分析函数先从main()函数入手。
Main()函数是C++源程序编译时的开始,从main()函数开始读函数可将其他函数的功能理解得更透彻。
3)在做程序的时候先列框架,将这个程序所要达到的目的(功能)分析出来,选择正确的数据结构然后在将程序模块化,按照模块编写函数更加简单合理。
4)我还了解了很多的库函数的作用,如字符串函数中有很多对字符串进行处理的函数,其功能我都有所了解。
5)学会了有关头文件的使用方法,及系统调配问题的解决方法等。
6)了解到了注释的重要性。
通过这次试验,让我学到很多这个学期没有接触过的很多知识,完成一个贪吃蛇的项目;第一步就是先理清思路,设计主界面,主界面是以一块封闭的画布,并在画布内设计蛇体和食物。
蛇头如果碰到墙或者与蛇身的某一部分碰到就会死亡;如果蛇头碰到食物,就会自动增加一节蛇身,并更改得分。
想要写出好的程序,还是要有扎实的基础,这样遇到问题就不会一筹莫展来。
在编程时我们要有想象力,不要拘泥于现有的贪吃蛇游戏,而是要把自己想到的再加上所学的知识,遇到问题不能怕,而是要专心找出问题的原因,再回来看看书本的知识,不懂的还可以问问老师。
编程过程还要养成良好的编程习惯,这样不仅自己能够很好看懂自己的代码,也让人家容易看懂自己的代码,而不至于代码知识自己会看,出来问题只有自己会解决而其他人都不会解决;遇到问题时要考虑最简单的解决方案,只有简单的方案不能满足要求时再考虑复杂的方案。
最主要编程还是要多与人沟通,不会的不能立即问别人,但是一段时间后解决不了时还是应该向别人请教请教,“三人行必有我师”正是这个意思。
通过这次实验,我深刻地体会到了面向对象与面向过程的区别。
程序在最初设计时由于面向对象的思想不够成熟,导致在最后想要增加一些新的功能时,出现了一些麻烦。
总之,我们还需要进一步提升自己的能力。
6.参考文献
《C语言程序设计》武雅丽清华大学出版社
《C++面向对象程序设计》谭浩强清华大学出版社
《C语言课程设计案例精编》李丽娟中国水利水电出版社
附录:
源程序
///////////////////////////////////////////////
//程序名称:
贪吃蛇
//制作:
莫新存
//编译环境:
VisualC++,EasyX
//////////////////////////////////////////////
#include
#include<>
#include<>
#include<>
#include<>
#include<>
#include<>
#include
#definerandom(a,b)(rand()%((b)-(a)))+(a)
#pragmacomment(lib,"")//加入背景音乐时使用
usingnamespacestd;
#defineMAX_JOINTS200
#defineMV_RIGHT1
#defineMV_LEFT2
#defineMV_UP3
#defineMV_DOWN4
intrnd1,rnd2;
vector
vector
voidInitGraph(void);/*图形界面初始化函数*/
voidDrawFence(void);/*绘制游戏场景*/
voidGameOver(intscore);/*结束游戏*/
voidGamePlay(void);/*玩游戏具体过程*/
voidPrScore(intscore);/*显示分数*/
voidfun_pause();/*暂停游戏*/
voidfun_reset();/*重置游戏*/
voidfun_obstacle();/*设置障碍物*/
structFood{/*食物的结构体定义*/
intx;/*食物的横坐标*/
inty;/*食物的纵坐标*/
intaddFood;/*判断是否要出现食物的变量*/
};
structSnake{/*蛇的结构体定义*/
intx[MAX_JOINTS];/*保存蛇身每一节位于屏幕上的列坐标*/
inty[MAX_JOINTS];/*保存蛇身每一节位于屏幕上的行坐标*/
intjoint;/*蛇的节数*/
intdirection;/*蛇移动方向*/
intlife;/*蛇的生命,0活着,1死亡*/
};
voidplay()
{
initgraph(800,600);
InitGraph();
DrawFence();
GamePlay();
getch();
}
intmain()
{mciSendString("play",NULL,0,NULL);//播放音乐
play();
return0;
}
//初始化
voidInitGraph(){
cleardevice();
setbkcolor(BLUE);
setcolor(WHITE);
cleardevice();
setfont(25,0,_T("微软雅黑"));
outtextxy(170,150,"GreedySnake");
outtextxy(219,254,"Ready");
getch();
setbkcolor(0);
cleardevice();
}
//绘制游戏场景
voidDrawFence(){
inti;
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);//右边
}
}
//结束游戏
voidGameOver(intscore){
cleardevice();
PrScore(score);
setcolor(RED);
setfont(80,0,_T("微软雅黑"));
outtextxy(100,200,"GAMEOVER");
mciSendString("close",NULL,0,NULL);//关闭音乐
getch();
exit(0);
}
//输出成绩
voidPrScore(intscore)
{
charstr_score[10];
//setfillstyle(YELLOW);
//bar(50,15,220,35);
//setcolor(6);
//setfont(25,0,_T("微软雅黑"));
//setfillstyle(BLACK);
setbkmode(TRANSPARENT);//---new---
BeginBatchDraw();
setfillstyle(BLACK);
bar(601,0,800,600);
setfont(60,0,_T("微软雅黑"));
setcolor(YELLOW);
outtextxy(625,30,_T("贪吃蛇"));
setfont(30,0,_T("微软雅黑"));
setcolor(LIGHTGREEN);
outtextxy(625,140,_T("制作:
莫新存"));
outtextxy(625,200,_T("学号:
19"));
setfont(25,0,_T("微软雅黑"));
setcolor(CYAN);
outtextxy(625,380,_T("上:
W"));
outtextxy(625,400,_T("下:
S"));
outtextxy(625,420,_T("左:
A"));
outtextxy(625,440,_T("右:
D"));
outtextxy(625,460,_T("分数:
"));
outtextxy(625,490,_T("暂停(P键)"));
outtextxy(625,520,_T("重新游戏(R键)"));
setcolor(LIGHTBLUE);
sprintf(str_score,"%i",score);
outtextxy(680,460,str_score);
EndBatchDraw();
if(score>0&&score%50==0)fun_obstacle();
}
voidGamePlay(){
inti,key;
intgamespeed=200;//控制游戏速度*
intscore=0;//记录游戏得分
structFoodfood;//食物结构体变量
structSnakesnake;//蛇结构体变量
=1;//1表示需要出现新食物,0表示已经存在食物
=0;//置蛇的生命状态为活着
=MV_RIGHT;//置蛇头方向往右
[0]=100;[0]=100;//置蛇头初始位置
[1]=110;[1]=100;
=2;//置蛇的初始节数为2
PrScore(score);//显示游戏得分
//重复玩游戏,直到按Esc键结束
srand(time(NULL));
while
(1)
{
while(!
kbhit())
{mciSendString("play",NULL,0,NULL);//播放音乐
if==1){//需要出现新食物
=rand()%400+60;
=rand()%350+60;
//食物出现后必须在整格内才能让蛇吃到
while%10!
=0)
{
++;
}
while%10!
=0){
++;
}
=0;//画面上有食物
}
if==0){//画面上有食物,则显示
setcolor(GREEN);
rectangle,,+10,;
}
//在没有按键的情况下,蛇自己移动身体
for(i=;i>0;i--){//蛇的每个节往前移动
[i]=[i-1];
[i]=[i-1];
}
//1,2,3,4表示右,左,上,下四个方向,来决定蛇头的移动
switch{
caseMV_RIGHT:
[0]+=10;break;
caseMV_LEFT:
[0]-=10;break;
caseMV_UP:
[0]-=10;break;
caseMV_DOWN:
[0]+=10;break;
}
//从蛇的第四节开始判断是否撞到自己,因为蛇头为两节,第三节不可能拐过来
for(i=3;i<;i++){
if[i]==[0]&&[i]==[0]){
GameOver(score);//显示失败
=1;//蛇死*/
break;
}
}
//判断蛇是否撞到墙壁
if[0]<55||[0]>595||[0]<55||[0]>455){
GameOver(score);//本次游戏结束
=1;//蛇死
}
for(intobs_i=0;obs_i<();obs_i++){//-----判断是否撞到障碍物----
if(vox[obs_i]==[0]&&voy[obs_i]==[0])GameOver(score);
}
//以上三种判断以后,如果蛇死就跳出内循环,重新开始
if==1)break;
if[0]==&&[0]=={//吃到食物后
//把画面上的食物清除
setcolor(0);
rectangle,,+10,;
//新的一节先放在看不见的位置,下次循环就取前一节的位置
[]=-20;[]=-20;
++;//蛇的身体长一节
=1;//画面上需要出现新食物
score+=10;
//-------------------------
PrScore(score);//输出新得分
}
//画蛇
setcolor(RED);
for(i=0;i<;i++)
{
rectangle[i],[i],[i]+10,[i]-10);
}
Sleep(gamespeed);//延时控制蛇的速度
//去除蛇的最后一节
setcolor(0);
rectangle[],[],
[]+10,[]-10);
}//endofwhile(!
kbhit)
if==1)break;//如果蛇死,则跳出循环
key=getch();//接收按键
switch(key){//判断按键,是否往相反方向移动,按Esc键则退出
case'w':
case'W':
{if!
=MV_DOWN)=MV_UP;}break;
case'd':
case'D':
{if!
=MV_LEFT)=MV_RIGHT;}break;
case'
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪吃 课程设计 报告