C语言贪吃蛇游戏
课程设计报告
姓名:***
学号:**********
专业:计算机科学与技术
指导教师:***
海南大学三亚学院
2011-8-1
贪吃蛇游戏《课程设计报告》
海南大学三亚学院,2011
Page2of13
目录
【摘要】...............................................................................................................................................3
第1章游戏概述..................................................................................................................................4
1.1实现的目标................................................................................................................................4
1.2实现的方案................................................................................................................................4
1.3实现的环境................................................................................................................................4
1.4具体的开发方法...............................................................4
第2章游戏设计..................................................................................................................................5
2.1功能的设计................................................................................................................................5
2.2数据的设计................................................................................................................................5
2.3界面的设计................................................................................................................................7
第3章游戏实现..................................................................................................................................8
参考文献..........................................................................................................................................13
贪吃蛇游戏《课程设计报告》
海南大学三亚学院,2011
Page3of13
【摘要】
【C语言游戏贪吃蛇】
本次课程设计的任务是设计有关贪吃蛇游戏的程序,通过这次游戏程序的设计,巩固和加
深对C语言课程的基本知识的理解和掌握,简单掌握了C语言编程和程序调试的基本技能,使
我能够利用C语言进行基本的软件设计,能够利用所学的基本知识和技能,解决简单的程序设计
问题,进而掌握书写程序设计说明文档的能力。
刚开始看到题目,可以说是一头雾水,根本无法下手,尤其对于我这样一个新手,更加困
难重重。为此,我上网查阅了很多资料,逐渐理清丝路,程序的关键点在于表示蛇的图形及蛇
的移动,因此我想到可以用一个小矩形块表示蛇的一节身体,身体每长一节,增加一个矩形块,
再定义两个结构体:食物和蛇。具体实现过程可以说是非常艰难,无数次按照程序运行的错误
提示,对原程序进行修改,在调试过程中有时也会遇到不懂的问题,只能上网查阅一些资料,
一一修改,直到运行成功。
通过这次课程设计,使我对C语言有了更进一步的认识和了解,要想学好它要重在实践,
要通过不断的上机操作才能更好地学习它,我也发现我的好多不足之处,首先是自己在指法上
还不行,经常按错字母,通过学习也有所改进;再有对C语言的一些标准库函数不太了解,还
有对函数调用的正确使用不够熟悉,对C语言中经常出现的错误也不了解,通过实践的学习,
我认识到学好计算机要重视实践操作,不仅仅是学习C语言,还是其它的语言,以及其它的计
算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地
学好计算机。在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,
懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上
的不良情绪。
贪吃蛇游戏《课程设计报告》
海南大学三亚学院,2011
Page4of13
第1章游戏概述
1.1实现的目标
设计一个贪吃蛇游戏程序。游戏时,一条蛇在密闭的围墙内,围墙内会随机出
现一个食物通过键盘上的awsd键控制蛇向上下左右4个方向移动,蛇头接到食
物,则表示食物被蛇吃掉,这时蛇的身体加长一节,同时计10分。接着又出现食物
等待被蛇吃掉。如果蛇在移动过程中,撞到墙壁或身体交叉(蛇头撞到自己的身体),
则游戏结束。
1.2实现的方案
这个程序的关键点在于表示蛇的图形及蛇的移动。用一个小矩形块表示蛇的一
节身体,身体每长一节,增加一个矩形块。移动时必须从蛇头开始,所以蛇不能向
相反的方向移动,也就是蛇尾不能改作蛇头。如果不按任意键,蛇自行在当前方向
上前移,但按下有效方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所
以当按下有效方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实
现是从蛇头新位置开始画出蛇,这时,由于没有清屏的原因,原来的蛇的位置和新
蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆
盖。食物的出现与消失也是画矩形块和覆盖矩形块。为了便于理解,定义了两个结
构体:食物和蛇。
1.3实现的环境
(1)操作系统:Windows7
(2)应用软件:MicrosoftVisualC++6.0
1.4具体的开发方法
(1)通过随机函数产生随机数,控制游戏过程食物的出现;
(2)定义键盘操作,控制游戏过程蛇的移动方向;
(3)画出边界,并判断游戏是否结束;
(4)统计游戏过程蛇吃的食物数量,计算并输出游戏成绩。
贪吃蛇游戏《课程设计报告》
海南大学三亚学院,2011
Page5of13
第2章游戏设计
2.1功能的设计
开始
初始化界面和蛇身
放置食物
蛇开始运动
蛇吃到食物?
蛇变长
蛇死亡?
继续?
退出界面
N
N
Y
N
Y
游戏者按键选择
Y
贪吃蛇游戏《课程设计报告》
海南大学三亚学院,2011
Page6of13
()主函数
主函数是程序的主流程,首先定义使用到的常数、全局变量及函数原型说明,
然后初始化图形系统,调用函数DrawK()画出开始画面,调用函数GamePlay(),即
玩游戏的具体过程,游戏结束后调用Clo()关闭图形系统,结束程序。
2.画界面函数DrawK()
主界面就是一个密封的围墙,用两个循环语句分别在水平方向和垂直方向输出
连续的宽度和高度均为10个单位的矩形小方块,围成密闭图形,表示围墙,为了醒
目,设置为淡青颜色,用函数tlinestyle(SOLID_LINE,0,THICK_WIDTH)设置线型
宽度为3个像素。设置3个像素的围墙线,蛇在贴墙走的时候,会擦掉部分围墙线,
使线变细图形变得不好看,如果不想这种情况出现,则将线型宽度设置为1个像素。
3.游戏具体过程函数GamePlay()
这个函数是游戏的主要部分,难点在表示蛇的新位置并消除前一次的图形。采
用的方法是每次移动的时候从最后一节开始到倒数第二节(因蛇头为两节),将前一
节的坐标赋值给后一节的坐标,移动后只要把最后一节用背景色去除即可,因为新
位置0到n-1节还是要出现在画面上的。然后蛇头按照方向键来更改位置。
另外,食物的随机出现要确保它的位置在10的倍数位置上,因为蛇的坐标都是
以10为模的,这样的话就可以让蛇吃到,蛇吃到食物的判断是蛇头的坐标和食物的
坐标相等。
其算法过程为:
(1)设置初始值。为防止食物出现在一个位置上,要设置随机数发生器,真正
产生随机数。初始时,蛇只有蛇头,设定一个开始的方向。
(2)循环执行直到按Esc键退出
1)没有按键的情况下,循环执行。
如果没有食物,随机出现食物;如果有食物,则显示食物蛇移动身体根据蛇的
方向改变坐标值,并判断蛇是否撞到了墙或自己吃了自己,如果出现这两种情况之
一,则蛇死调用游戏结束函数GameOver(),结束本次游戏,重新开始。
如果蛇吃到了食物,蛇身体长一节,数组元素增加一个,身体节数,分数都进
行相应的改变。
在新位置画出蛇。
2)如果有按键,则识别键值。如果按键为Esc键则结束游戏,程序运行结束;
如果所按键为方向键,则根据该键改变代表蛇方向的变量direction的值,要考虑
相反方向键无效。
4.游戏结束函数GameOver()
游戏结束,清除屏幕,输出分数,显示游戏结束信息。
e()输出分数
在指定位置利用sprintf()将整数转换为字符串,用outtextxy()输出,bar()
函数的应用是为了覆盖原来的值。
()图形结束
在显示游戏结束信息的画面时,按任意键关闭图形系统,程序结束。
贪吃蛇游戏《课程设计报告》
海南大学三亚学院,2011
Page7of13
2.2数据的设计
表示食物和蛇的矩形块都设计为10*10个像素单位,食物的基本数据域为它所出
现的位置,用x和y坐标表示,则矩形块用函数rectangle(x,y,x+10,y+10)或
rectangle(x,y,x+10,y-10)可以画出。由于每次只出现一个食物,而食物被吃掉后,
才出现下一个食物,所以设定yes表示是否要出现食物的变量。蛇的一节身体为一个
矩形块,这样表示每个矩形块只需起点坐标x和y。身体是不断增长的,所以用数组
存放每一节的坐标,最大设定为N=200,node表示当前节数。另外还需要保存蛇移动
方向的变量direction和表示生命的变量life,一但life为1,则蛇死,游戏结束。
所以程序功能的实现就是数组的操作。
#defineN200
structFood
{
intx;//食物的横坐标inty;//食物的纵坐标
intyes;//判断是否要出现食物的变量
}food;//食物的结构体
structSnake
{
intx[N];inty[N];intnode;/*蛇的节数*/
intdirection;/*蛇移动方向*/intlife;/*蛇的生命,0活着,1死亡*/
}snake;
2.3界面的设计
程序运行时的游戏界面如图所示,边框表示围墙,红色矩形块代表蛇,绿色小
方块代表食物。
贪吃蛇游戏《课程设计报告》
海南大学三亚学院,2011
Page8of13
第3章游戏实现
#defineN200
#include
#include
#include
#defineLEFT0x4b00
#defineRIGHT0x4d00
#defineDOWN0x5000
#defineUP0x4800
#defineESC0x011b
inti,key;
intscore=0;/*得分*/
intgamespeed=50000;/*游戏速度自己调整*/
structFood
{
intx;/*食物的横坐标*/
inty;/*食物的纵坐标*/
intyes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/
structSnake
{
intx[N];
inty[N];
intnode;/*蛇的节数*/
intdirection;/*蛇移动方向*/
intlife;/*蛇的生命,0活着,1死亡*/
}snake;
voidInit(void);/*图形驱动*/
voidClo(void);/*图形结束*/
voidDrawK(void);/*开始画面*/
voidGameOver(void);/*结束游戏*/
voidGamePlay(void);/*玩游戏具体过程*/
voidPrScore(void);/*输出成绩*/
/*主函数*/
voidmain(void)
{
Init();/*图形驱动*/
DrawK();/*开始画面*/
贪吃蛇游戏《课程设计报告》
海南大学三亚学院,2011
Page9of13
GamePlay();/*玩游戏具体过程*/
Clo();/*图形结束*/
}
/*图形驱动*/
voidInit(void)
{
intgd=DETECT,gm;
registerbgidriver(EGAVGA_driver);
initgraph(&gd,&gm,"c:programfileswinyestc20hbgi");
cleardevice();
}
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
voidDrawK(void)
{
/*tbkcolor(LIGHTGREEN);*/
tcolor(11);
tlinestyle(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();/*随机数发生器*/
=1;/*1表示需要出现新食物,0表示已经存在食物*/
=0;/*活着*/
ion=1;/*方向往右*/
snake.x[0]=100;snake.y[0]=100;/*蛇头*/
snake.x[1]=110;snake.y[1]=100;
=2;/*节数*/
PrScore();/*输出得分*/
while(1)/*可以重复玩游戏,压ESC键结束*/
贪吃蛇游戏《课程设计报告》
海南大学三亚学院,2011
Page10of13
{
while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/
{
if(==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++;
=0;/*画面上有食物了*/
}
if(==0)/*画面上有食物了就要显示*/
{
tcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10);
}
for(i=-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇
的关键算法*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
switch(ion)
{
ca1:snake.x[0]+=10;break;
ca2:snake.x[0]-=10;break;
ca3:snake.y[0]-=10;break;
ca4:snake.y[0]+=10;break;
}
for(i=3;i<;i++)/*从蛇的第四节开始判断是否撞到自己了,因为
蛇头为两节,第三节不可能拐过来*/
{
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{
GameOver();/*显示失败*/
=1;
贪吃蛇游戏《课程设计报告》
海南大学三亚学院,2011
Page11of13
break;
}
}
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||
snake.y[0]>455)/*蛇是否撞到墙壁*/
{
GameOver();/*本次游戏结束*/
=1;/*蛇死*/
}
if(==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
break;
if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/
{
tcolor(0);/*把画面上的食物东西去掉*/
rectangle(food.x,food.y,food.x+10,food.y-10);
snake.x[]=-20;snake.y[]=-20;
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
++;/*蛇的身体长一节*/
=1;/*画面上需要出现新的食物*/
score+=10;
PrScore();/*输出新得分*/
}
tcolor(4);/*画出蛇*/
for(i=0;i<;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10);
delay(gamespeed);
tcolor(0);/*用黑色去除蛇的的最后一节*/
rectangle(snake.x[-1],snake.y[-1],
snake.x[-1]+10,snake.y[-1]-10);
}/*endwhile(!kbhit)*/
if(==1)/*如果蛇死就跳出循环*/
break;
key=bioskey(0);/*接收按键*/
if(key==ESC)/*按ESC键退出*/
break;
el
if(key==UP&&ion!=4)
/*判断是否往相反的方向移动*/
ion=3;
贪吃蛇游戏《课程设计报告》
海南大学三亚学院,2011
Page12of13
el
if(key==RIGHT&&ion!=2)
ion=1;
el
if(key==LEFT&&ion!=1)
ion=2;
el
if(key==DOWN&&ion!=3)
ion=4;
}/*endwhile(1)*/
}
/*游戏结束*/
voidGameOver(void)
{
cleardevice();
PrScore();
tcolor(RED);
ttextstyle(0,0,4);
outtextxy(200,200,"GAMEOVER");
getch();
}
/*输出成绩*/
voidPrScore(void)
{
charstr[10];
tfillstyle(SOLID_FILL,YELLOW);
bar(50,15,220,35);
tcolor(6);
ttextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy(55,20,str);
}
/*图形结束*/
voidClo(void)
{
getch();
clograph();
}
贪吃蛇游戏《课程设计报告》
海南大学三亚学院,2011
Page13of13
参考文献
[1]谭浩强,C语言程序设计,北京清华大学出版社,1999.12
[2]杨开城,C语言教程实验与练习,北京人民邮电出版社,2002.8
[3]浦滨,C游戏编程从入门到精通,北京北京希望电子出版社,2002.5
[4]张翔,C语言函数大全,北京电子工业出版社,2002.4
[5]江汉秀,C语言实用程序荟萃,西安西安电子科技大学出版社,1993.2
本文发布于:2023-01-28 17:45:38,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/152731.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |