贪吃蛇课程设计报告.docx

上传人:b****3 文档编号:4145655 上传时间:2022-11-28 格式:DOCX 页数:20 大小:208.18KB
下载 相关 举报
贪吃蛇课程设计报告.docx_第1页
第1页 / 共20页
贪吃蛇课程设计报告.docx_第2页
第2页 / 共20页
贪吃蛇课程设计报告.docx_第3页
第3页 / 共20页
贪吃蛇课程设计报告.docx_第4页
第4页 / 共20页
贪吃蛇课程设计报告.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

贪吃蛇课程设计报告.docx

《贪吃蛇课程设计报告.docx》由会员分享,可在线阅读,更多相关《贪吃蛇课程设计报告.docx(20页珍藏版)》请在冰豆网上搜索。

贪吃蛇课程设计报告.docx

贪吃蛇课程设计报告

贪吃蛇课程设计报告

 

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程序整体设计说明

一个游戏要有开始部分,运行部分,结束部分(实际上开始部分与运行部分是一体的)。

 

 

3.5设计的具体实现

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);

//画围墙

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)用于输出分数。

voidGameOver(intscore)

{

cleardevice();

PrScore(score);

setcolor(RED);

setfont(80,0,_T("微软雅黑"));

outtextxy(100,200,"GAMEOVER");

mciSendString("closemo.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];

}

//1,2,3,4表示右,左,上,下四个方向,来决定蛇头的移动

switch(snake.direction)

{caseMV_RIGHT:

snake.x[0]+=10;break;

caseMV_LEFT:

snake.x[0]-=10;break;

caseMV_UP:

snake.y[0]-=10;break;

caseMV_DOWN:

snake.y[0]+=10;break;

}

8)a.从蛇的第四节开始判断是否撞到自己,因为蛇头为两节,第三节不可能拐过来

for(i=3;i

{

if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])

{

GameOver(score);//显示失败

snake.life=1;//蛇死*/

break;

}

}

b.判断蛇是否撞到墙壁

if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455)

{

GameOver(score);//本次游戏结束

snake.life=1;//蛇死

}

c.判断是否撞到障碍物

for(intobs_i=0;obs_i

{

if(vox[obs_i]==snake.x[0]&&voy[obs_i]==snake.y[0])GameOver(score);

}

以上三种判断以后,如果蛇死就跳出内循环,重新开始。

9)吃到食物后画蛇

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.x[snake.joint]=-20;snake.y[snake.joint]=-20;

snake.joint++;//蛇的身体长一节

food.addFood=1;//画面上需要出现新食物

score+=10;

//-------------------------

PrScore(score);//输出新得分

}

//画蛇

setcolor(RED);

for(i=0;i

{

rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);

}

Sleep(gamespeed);//延时控制蛇的速度

//去除蛇的最后一节

setcolor(0);

rectangle(snake.x[snake.joint-1],snake.y[snake.joint-1],

snake.x[snake.joint-1]+10,snake.y[snake.joint-1]-10);

10)按键操作

key=getch();//接收按键

switch(key)

{//判断按键,是否往相反方向移动

case'w':

case'W':

{if(snake.direction!

=MV_DOWN)snake.direction=MV_UP;}break;

case'd':

case'D':

{if(snake.direction!

=MV_LEFT)snake.direction=MV_RIGHT;}break;

case'a':

case'A':

{if(snake.direction!

=MV_RIGHT)snake.direction=MV_LEFT;}break;

case's':

case'S':

{if(snake.direction!

=MV_UP)snake.direction=MV_DOWN;}break;

case'p':

case'P':

fun_pause();break;

case'r':

case'R':

fun_reset();break;

}

编好程序后进行编译、运行,生成可执行文件,就可以玩贪吃蛇游戏了。

4.程序测试

4.1测试内容与结果

1)开始:

程序运行后,会出来蓝色背景界面和提示语Ready?

,按任意键开始,注意不要在中文输入法下玩。

开始后只有两节的红色蛇和一个绿色的食物,并且蛇是运动的。

2)方向键和WSAD键:

蛇开始运行之后,当点击上下左右键(或WSAD)蛇就会按相应的方向运动,蛇不能180度转弯,只能进行90度的转弯。

程序检测时蛇确实会按点击方向运动且不会向相反方向运动,所有方向键使用正确。

3)暂停/继续:

当程序正在运行时,点击暂停/继续按钮“P”,蛇停在当前的位置,再次点击“P”蛇又从当前位置继续运动。

此按钮符合要求,所以暂停/继续按钮使用正确,功能能够实现。

4)重新开始:

当游戏结束或想重新开始一局时,点击按钮“R”,游戏又回到最初的状态,一个食物,一个运动着的红色蛇块,且游戏积分清零。

所以重新开始功能能够实现。

5)界面右侧能够出现按键提示和分数显示等有关信息。

 

4.2程序运行效果图

 

5.课程设计总结

在设计这个程序中我主要学会了如何运用以下有关C语言和C++的知识:

1)函数定义是要做到顾名思义是很重要的,它对读程序的人正确认识程序十分重要,在修改这个程序的过程中也能很快找到程序各模块的作用,大大增加了程序的可读性。

2)分析函数先从main()函数入手。

Main()函数是C++源程序编译时的开始,从main()函数开始读函数可将其他函数的功能理解得更透彻。

3)在做程序的时候先列框架,将这个程序所要达到的目的(功能)分析出来,选择正确的数据结构然后在将程序模块化,按照模块编写函数更加简单合理。

4)我还了解了很多的库函数的作用,如字符串函数中有很多对字符串进行处理的函数,其功能我都有所了解。

5)学会了有关头文件的使用方法,及系统调配问题的解决方法等。

6)了解到了注释的重要性。

通过这次试验,让我学到很多这个学期没有接触过的很多知识,完成一个贪吃蛇的项目;第一步就是先理清思路,设计主界面,主界面是以一块封闭的画布,并在画布内设计蛇体和食物。

蛇头如果碰到墙或者与蛇身的某一部分碰到就会死亡;如果蛇头碰到食物,就会自动增加一节蛇身,并更改得分。

想要写出好的程序,还是要有扎实的基础,这样遇到问题就不会一筹莫展来。

在编程时我们要有想象力,不要拘泥于现有的贪吃蛇游戏,而是要把自己想到的再加上所学的知识,遇到问题不能怕,而是要专心找出问题的原因,再回来看看书本的知识,不懂的还可以问问老师。

编程过程还要养成良好的编程习惯,这样不仅自己能够很好看懂自己的代码,也让人家容易看懂自己的代码,而不至于代码知识自己会看,出来问题只有自己会解决而其他人都不会解决;遇到问题时要考虑最简单的解决方案,只有简单的方案不能满足要求时再考虑复杂的方案。

最主要编程还是要多与人沟通,不会的不能立即问别人,但是一段时间后解决不了时还是应该向别人请教请教,“三人行必有我师”正是这个意思。

通过这次实验,我深刻地体会到了面向对象与面向过程的区别。

程序在最初设计时由于面向对象的思想不够成熟,导致在最后想要增加一些新的功能时,出现了一些麻烦。

总之,我们还需要进一步提升自己的能力。

6.参考文献

《C语言程序设计》武雅丽清华大学出版社

《C++面向对象程序设计》谭浩强清华大学出版社

《C语言课程设计案例精编》李丽娟中国水利水电出版社

附录:

源程序

///////////////////////////////////////////////

//程序名称:

贪吃蛇

//制作:

莫新存

//编译环境:

VisualC++6.0,EasyX

//////////////////////////////////////////////

#include

#include

#include

#include

#include

#include

#include

#include

#definerandom(a,b)(rand()%((b)-(a)))+(a)

#pragmacomment(lib,"Winmm.lib")//加入背景音乐时使用

usingnamespacestd;

#defineMAX_JOINTS200

#defineMV_RIGHT1

#defineMV_LEFT2

#defineMV_UP3

#defineMV_DOWN4

intrnd1,rnd2;

vectorvox;

vectorvoy;

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("playmo.mp3",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("closemo.mp3",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,170,_T("班级:

24041001"));

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,_

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1