程序设计基础
项目报告
项 目 名 称
贪吃蛇
1. 项目功能简要说明:贪吃蛇游戏,该有游戏主要指通过控制小蛇的移动方向,来吃掉随机
生成的食物,从而使小蛇达到一个成长的效果。小蛇每吃掉一次食物都
会加相应得分数。当小蛇碰到自身或者碰到墙就会结束游戏。
2.程序基本算法的文字描述(500 字)
(一)函数头必不可少要包含 TC 里面的图形库()、()里面定义了五种类型、一些宏和
通用工具函数、()这是一个头文件,里面包含了很多 BIOS 和 DOS 调用函数。首先要定义四个
方向键和一个退出键的扫描码;
(二)分别定义食物和小蛇的结构体;
(三)声明调用的函数;
(四)主函数(图形驱动、开始画面、玩游戏具体过程、图形结束;)
(五)图形驱动:初始化图形系统;
(六)开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙。设置颜色、设置线
型、用两个 for 循环分别画出上下、左右围墙;
(七)玩游戏具体过程:随机发生器控制食物出现位置,1 表示需要出现新食物,0 表示已经存在食物,在没
有按键的情况下,蛇自己移动身体,当遇见食物之后会吃掉食物起身增长,然后食物还要随机生成,每吃一
次食物分数就会长十,但分数为偶数的时候小蛇是一种颜色,否则为另外一种颜色,当分数是五十的整数倍
时会出现 good!!的提示,此时小蛇为绿色,当分数是五十的整数倍时食物为黄色,否则为另一种颜色。当
分数为 100 的倍数后小蛇的速度就会增长。当吃到食物之后小蛇会自动长一截,而在没吃到食物的时候,小
蛇向前走,最后一节会被磨掉,吃到食物就不摸了,当小蛇遇到自己或者墙都会死亡也就是结束游戏;
(八)图形结束,输出成绩。
3. 该项目用到的知识的总结(200 字)
调用函数,for 循环,while 循环,if else 语句,随机函数,控制坐标,输出图形,背景颜色,控制形状
颜色线性,等等
4. 关键步骤的流程图(三个流程图以上)
第 1 页 共 13 页
整
个
游
戏
大
体
制
作
过
程
开始
定义食物的结构体
struct Food
{int x;--食物的横坐标
int y;--食物的纵坐标
int yes;--判断是否要出现食物的变量
}food;--食物的结构体
定义小蛇的结构体
struct Snake
{int x[N];
int y[N];
int node;/*蛇的节数*/
int direction;/*蛇移动方向*/
int life;/* 蛇的生命,0 活着,1 死亡*/
}snake;
被调用函数
void Init(void);--图形驱动
void Close(void);--图形结束
void DrawK(void);--开始画面
void GameOver(void);--结束游戏
void GamePlay(void);--玩游戏具体过程
void PrScore(void);--输出成绩
void main(void)
{Init();/*图形驱动*/
DrawK();/*开始画面*/
GamePlay();/*玩游戏具体过程*/
Close();/*图形结束*/
}
结束
第 2 页 共 13 页
开始
setcolor(9);setlinestyle(SOLID_LIN
E,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);/*右边*/
}
}
结束
游
戏
围
墙
范
围
确
定
第 3 页 共 13 页
开始
randomize();随机数发生器
food.yes=1;--要出现新食物,0 表示已经存在
食物
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)/*可以重复玩游戏,压 ESC 键结束*/
{
while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/
{
food.yes==0
food.yes==1
if(food.yes)
if(score%50=0&&score!=0)setcolor(YELLOW)
;
else setcolor(CYAN);
rectangle(food.x,food.y,food.x+10,food.y-10);
i=snake. node-1;
i
>
0
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
i--
3
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;/*画面上有食物了*/
snake.y[0]-=10;break;
snake.direction
snake.x[0]+=10;break;
4
2
snake.y[0]+=10;break;
snake.x[0]-=10;break;
1
第 4 页 共 13 页
否
否
1
i=3
是
snake.x[i]==snake.x[0]&&snake
.y[i]==snake.y[0]
是
GameOver();/*显示失败*/
snake.life=1;
break;
是
GameOver();/*本次游戏结束*/
snake.life=1; /*蛇死*/
2
否
/* 吃 到
食 物 以
后*/
否
snake.x[0]==food.x&&s
nake.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();/*输出新得分
第 5 页 共 13 页
/* 蛇
是 否
撞 到
墙 壁
*/
snake.x
[0]<55|
|snake.
x[0]>5
95||sna
ke.y[0]
<55||
snake.y
[0]>45
5
否
snake.life==1
是
* 以 上 两 种
判断以后,如
果 蛇死 就跳
出 内循 环,
重新开始*/
b
r
e
a
k
2
if(score%20==0) setcolor(MAGENTA); /*画出蛇*/
else setcolor(LIGHTRED);
if(score%50==0&&score!=0)
{setcolor(GREEN);
settextstyle(0,0,3);
outtextxy(80,16,"good!!");}
for(i=0;i
开始
Key
Key
Key
否
否
是
是
是
key==ESC
break
;
key==UP&&snake.direction!=4
snake.direction=3;
key==RIGHT&&snake.direction!=2
Key
是
snake.direction=1;
key==LEFT&&snake.direction!=1
K
e
y
snake.direction=2;
key==LEFT&&snake.direction!=3
snake.direction=4;
endwhile(1)*接
3 的 while(1)
结束
/*游戏结束*/
第 7 页 共 13 页
5 项目完成过程中遇到的难点、问题及解决办法
出现围墙和小蛇并没有多大难度,因为以前做过了笑脸移动,我的难点在于控制边界,还有就是让小蛇吃完
食物之后会自动增长一节。边界的问题主要是不能让小蛇与正好能吃掉食物,而这个问题就在于自己的计算
上,首先要掌握自己设置的各个坐标点以便于后期的各种调试,而让小蛇自动增长在我突然醒悟之后也出来
了。
小蛇吃完食物之后自动增长:
for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
6. 项目特色(延伸功能、附加功能)
分数为偶数的时候小蛇是一种颜色,否则为另外一种颜色,当分数是五十的整数倍时会出现 good!!的提
示,此时小蛇为绿色,当分数是五十的整数倍时食物为黄色,否则为另一种颜色。当分数为 100 的倍数后小
蛇的速度就会增长。
7. 收获与心得体会
通过亲自动手动脑完成这个小游戏,不仅复习了一下自己学过的很多知道,而且也学会了细心,要想做好一
个程序员必须认真仔细对手下的所有键盘负责任,哪怕一个标点符号,一个空格都会导致程序无法正常运行。
在今后的日子里好要更加熟练那些最基本的操作,不能学点忘点,要学会积累学会变通应用
8.程序代码
第 8 页 共 13 页