贪吃蛇程序设计报告附C源码.docx

上传人:b****4 文档编号:3846441 上传时间:2023-05-06 格式:DOCX 页数:15 大小:152.72KB
下载 相关 举报
贪吃蛇程序设计报告附C源码.docx_第1页
第1页 / 共15页
贪吃蛇程序设计报告附C源码.docx_第2页
第2页 / 共15页
贪吃蛇程序设计报告附C源码.docx_第3页
第3页 / 共15页
贪吃蛇程序设计报告附C源码.docx_第4页
第4页 / 共15页
贪吃蛇程序设计报告附C源码.docx_第5页
第5页 / 共15页
贪吃蛇程序设计报告附C源码.docx_第6页
第6页 / 共15页
贪吃蛇程序设计报告附C源码.docx_第7页
第7页 / 共15页
贪吃蛇程序设计报告附C源码.docx_第8页
第8页 / 共15页
贪吃蛇程序设计报告附C源码.docx_第9页
第9页 / 共15页
贪吃蛇程序设计报告附C源码.docx_第10页
第10页 / 共15页
贪吃蛇程序设计报告附C源码.docx_第11页
第11页 / 共15页
贪吃蛇程序设计报告附C源码.docx_第12页
第12页 / 共15页
贪吃蛇程序设计报告附C源码.docx_第13页
第13页 / 共15页
贪吃蛇程序设计报告附C源码.docx_第14页
第14页 / 共15页
贪吃蛇程序设计报告附C源码.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

贪吃蛇程序设计报告附C源码.docx

《贪吃蛇程序设计报告附C源码.docx》由会员分享,可在线阅读,更多相关《贪吃蛇程序设计报告附C源码.docx(15页珍藏版)》请在冰点文库上搜索。

贪吃蛇程序设计报告附C源码.docx

贪吃蛇程序设计报告附C源码

报告名称

1.课程设计内容

产生一个固定大小没有边界的游戏区域,蛇从区域的中心开始,由玩家通过键盘控制蛇的运动方向,用蛇头去吃随机分布在游戏区域内的食物;

蛇的运动限制在游戏区域内,游戏区域没有边界,所以蛇在区域内作循环运动;

蛇的运动方向为直线运动,只走横和竖的方向,不走斜线;

蛇的运动速度由游戏的难度来控制,难度越高,速度越快,游戏难度分为9个等级;

蛇身体的长度从1开始每吃掉一份食物就增加一个长度;

食物的出现安照随机分布的原则,蛇吃掉一份后随即在游戏区域内放一份新的食物;

每吃掉一份食物得分为10*游戏的难度,游戏结束后统计全部的得分;

游戏结束的条件为:

在控制蛇的过程中蛇头碰到蛇的身体的任何部位;

2.课程设计目的

(1)、通过c语言编程实现贪吃蛇游戏的运行。

(2)、对代码进行进一步的调试优化,以使游戏高效运行,操作化强,人性化强。

(3)、通过编程,使自己掌握C语言编程的基本方法,有独立编程的能力,并学到实战经验。

3.背景知识(可选项)

本程序主要是一个交互式的游戏程序,通过玩家的键盘上下左右键控制贪吃蛇的运动方向。

程序会根据您按下的键判断贪吃蛇走向。

运行环境

本程序运行时需要硬件环境和支持环境。

a.硬件环境:

一般的PC机

b.软件环境:

WINGDOWS95或以上

这个程序的关键是表示蛇的图形以及蛇的移动。

用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块。

移动时必须从蛇头开始,所以蛇不能向相反方向移动,也就是蛇尾不能改作蛇头。

如果不按任何键,蛇自行在当前方向上前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,这时由于没有清屏的原因,原来蛇的位置和新蛇的位置差一个单位,所以看起来社会多一节身体,所以将蛇的最后一节用背景色覆盖。

食物的出现和消失也是画圆形和覆盖圆形

4.工具/准备工作(可选项)

设计者应该首先考虑实现一个可以游动的蛇。

通过寻找规律,对实际对象进行抽象概括建立对象模型,首先从物理的角度来分析蛇得运动规律。

它是蠕动的,像水一样流动。

他有个特性就是身体的每一个点都经过他头部所在的点,他每一个时刻骨节所要运动的目的地是他前一个骨节所在的位置。

所以我们事先必须了解并掌握一些基本的画图函数,并学会调用和运行。

5.程序设计步骤、方法。

5.1.步骤1:

图形的转换及实现

由图A到图B可以看到实际对象的模型到抽象模型,

图A实际的的蛇的照片

图B蛇抽象成为骨骼状态(头和骨节)

程序设想了一个骨骼结构图

 

 

其中蛇的全身都是一样的绿边的正方形构成但是在分析时注意到

头部与其它的骨节不同,只有蛇头才能控制整个蛇的运动方向。

 

5.2.步骤2:

主要算法和关键数据结构

系统流程

a.用流程图示出程序的主要控制流程和处理流程;

 

5.3.步骤3:

系统数据结构设计

1.structFood/*食物的结构体*/

{

intx;/*食物的横坐标*/

inty;/*食物的纵坐标*/

intyes;/*食物是否出现的变量*/

}food;

structSnack/*蛇的结构体*/

{

intx[N];

inty[N];

intnode;/*蛇的节数*/

intdirection;/*蛇的方向*/

intlife;/*蛇的生命,0活着,1死亡*/

}snake;

voidInit(void);/*图形驱动*/

voidClose(void);/*关闭游戏函数*/

voidDrawK(void);/*画图函数*/

voidGameOver(void);/*输出失败函数*/

voidGamePlay();/*游戏控制函数主要程序*/

voidPrScore(void);/*分数输出函数*/

2.DELAY(charch)/*调节游戏速度*/

{

if(ch=='3')

{

delay(gamespeed);/*delay是延迟函数*/

delay(gamespeed);

}

3.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;

}

6.设计结果及分析

开始时,一直就是失败,设计了几十遍,仍然无法运行,后来经过一系列的调试查错,程序达到基本可运行,再后来经过进一步的调试,优化,算法简洁高效了很多,使得游戏达到老师的所有要求,并有很强的运行效果,可操作性,人性化强。

通过和同学的一些交流,也实现一些特殊功能,使游戏更加丰富多彩。

7.设计结论

通过此次贪吃蛇游戏的设计,确实学到了很多实战的经验。

以前只是纸上谈兵,真正下起手来才发现自己其实对C语言还没有掌握到编程的程度。

开始编译之后,自己通过与同学交流,查阅资料,独立的编写出了游戏代码,并进一步优化,加强可操作性,从中得到了很多课上没有的知识,体会到了编程的快乐,也许,编程就是,由简单到复杂,由复杂到简单。

8.问题及心得体会

刚开始时,一直失败,好多错误,其实就是些基本的错误,比如变量的定义,整型变量的范围,结构体的运用,指针的定义,函数的调用等等,通过这些问题才发现自己学习的知识是那么不牢固。

再有就是些技术上的难题,比如画图函数,初次接触,需要去查阅运用。

最后就是软件的问题,比如这一节:

voidInit(void)

{

intgd=DETECT,gm;

initgraph(&gd,&gm,"c:

\\BGI");

cleardevice();

}

用红色字体标示的一句代码会因为路径的不同而在不同的pc上运行效果不同,为了是代码质量高,可以改变一下软件的路径,即改变BGI的存放路径,可以解决问题。

通过一路的解决问题,也发现了自己到底哪方面存在问题,是自己的编程能力有了很大提高。

9.对本设计过程及方法、手段的改进建议

比如一些画图函数的实现,最好选用常见普及的函数,不然在不同pc上运行效果不同,还有一些函数效果不理想。

比如控制蛇的速度的函数就有些僵化,不是太灵活,控制颜色的函数也有些单调,还有事物的出现是随机函数控制的,但随即函数存在漏洞,可能出现食物刚好出现在蛇身上的错误,对于以上的函数问题,可以通过对函数的改进及优化解决问题。

 

10.参考文献

a.贪食蛇算法C语言版(借鉴其算法)

网址:

b.《VisualC++面向对象与可视化程序设计》(第二版)

编著者:

黄维通出版者:

清华大学出版社版次:

2007年8月

 

附录:

贪吃蛇游戏源代码

 

#defineN200

#include

#include

#include

#defineLEFT0x4b00

#defineRIGHT0x4d00

#defineDOWN0x5000

#defineUP0x4800

#defineESC0x011b

inti,key;

intscore=0;

intgamespeed=50000;

intlevel;

structFood

{

intx;

inty;

intyes;

}food;

structSnake

{

intx[N];

inty[N];

intnode;

intdirection;

intlife;

}snake;

voidInit(void);

voidClose(void);

voidDrawK(void);

voidGameOver(void);

voidGamePlay(void);

voidPrScore(void);

voidmain(void)

{printf("welcometoplaythegame!

\n");

printf("pleaseinputthelevel(1~~9):

");

scanf("%d",&level);

Init();

DrawK();

GamePlay();

Close();

}

voidInit(void)

{

intgd=DETECT,gm;

initgraph(&gd,&gm,"c:

\\BGI");

cleardevice();

}

voidDrawK(void)

{

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

}

}

voidGamePlay(void)

{

randomize();

food.yes=1;

snake.life=0;

snake.direction=1;

snake.x[0]=100;snake.y[0]=100;

snake.x[1]=110;snake.y[1]=100;

snake.node=2;

PrScore();

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

}

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

{

GameOver();

snake.life=1;

break;

}

}

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

snake.y[0]>455)

{

GameOver();

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

snake.node++;

food.yes=1;

score+=10;

PrScore();

}

setcolor(4);

for(i=0;i

rectangle(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;

else

if(key==UP&&snake.direction!

=4)

snake.direction=3;

else

if(key==RIGHT&&snake.direction!

=2)

snake.direction=1;

else

if(key==LEFT&&snake.direction!

=1)

snake.direction=2;

else

if(key==DOWN&&snake.direction!

=3)

snake.direction=4;

}

}

voidGameOver(void)

{

cleardevice();

PrScore();

setcolor(RED);

settextstyle(0,0,4);

outtextxy(200,200,"GAMEOVER");

getch();

}

voidPrScore(void)

{

charstr[10];

setfillstyle(SOLID_FILL,YELLOW);

bar(50,15,220,35);

setcolor(6);

settextstyle(0,0,2);

sprintf(str,"score:

%d",score);

outtextxy(55,20,str);

}

voidClose(void)

{

getch();

closegraph();

}

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2