《贪吃蛇游戏课程设计》报告Word格式.doc
《《贪吃蛇游戏课程设计》报告Word格式.doc》由会员分享,可在线阅读,更多相关《《贪吃蛇游戏课程设计》报告Word格式.doc(15页珍藏版)》请在冰豆网上搜索。
蛇死亡?
继续?
退出界面
N
Y
游戏者按键选择
四、设计的具体实现
(1)函数定义
函数定义是对各个基础函数的定义,并且设置需要运用的信息,便于调用
15
#defineN200
#defineM200
#include"
graphics.h"
#include<
stdlib.h>
stdio.h>
string.h>
iostream.h>
dos.h>
conio.h>
#include<
windows.h>
#defineLEFT97//A
#defineRIGHT100//D
#defineDOWN115//S
#defineUP119//W
#defineEsc0x011b
inti,key;
intscore=0;
intgamespeed=250;
//游戏速度可根据实际情况自行调整
structFood
{
intx;
//食物的横坐标
inty;
//食物的纵坐标
intyes;
//判断是否要出现食物的变量
}food;
//食物的结构体
structSnake
intx[M];
inty[M];
intnode;
//蛇的节数
intdirection;
//蛇的移动方向
intlife;
//蛇的生命,0表示活着,1表示死亡
}snake;
voidInit();
//图形驱动
voidClose();
//图形结束
voidDrawK();
//开始画面
voidGamePlay();
//玩游戏的具体过程
voidGameOver();
//游戏结束
voidPrScore();
//输出成绩
(2)主函数main()
主函数是程序的主流程,首先定义使用到的常数、全局变量及函数原型说明,然后初始化图形系统,调用函数DrawK()画出开始画面,调用函数GamePlay(),即玩游戏的具体过程,游戏结束后调用Close()关闭图形系统,结束程序
voidmain()//主函数
{
Init();
DrawK();
GamePlay();
Close();
}
voidInit()//图形驱动
intgd=DETECT,gm;
initgraph(&
gd,&
gm,"
"
);
/*此处为turboc的路径,读者可以根据自己的电脑而改*/
cleardevice();
(3)画界面函数DrawK()
主界面是一个封闭的围墙,用两个循环语句分别在水平和垂直方向输出连续的宽度和高度均的矩形方块,表示围墙,为了醒目,设置为白色。
voidDrawK()//开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙
setbkcolor(GREEN);
setcolor(LIGHTRED);
setlinestyle(0,0,5);
//设置线型
for(i=50;
i<
=600;
i+=10)//画围墙
{
rectangle(i,40,i+10,49);
//上边
rectangle(i,451,i+10,460);
//下边
}
for(i=40;
=450;
i+=10)
rectangle(50,i,59,i+10);
//左边
rectangle(601,i,610,i+10);
//右边
(4)游戏具体过程函数GamePlay()
这是游戏的主要组成部分,他采用将前一节的坐标赋给后一节,用背景颜色将最后节去除,当蛇头的坐标与食物的坐标相等时,表示食物被吃掉了。
voidGamePlay()//玩游戏的具体过程
rand();
//随机数发生器
food.yes=1;
//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())//在没有按键的情况下,蛇自己移动身体
{
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)//1,2,3,4表示上下左右四个方向,通过这个判断来移动蛇头
case1:
snake.x[0]+=10;
break;
case2:
snake.x[0]-=10;
case3:
snake.y[0]-=10;
case4:
snake.y[0]+=10;
for(i=3;
snake.node;
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);
//把画面上的食物去掉
snake.x[snake.node]=-20;
snake.y[snake.node]=-20;
//新的一节先放在看不见得位置,下次循环就取前一节的位置
snake.node++;
//蛇的身体长一节
food.yes=1;
score+=10;
PrScore();
//输出新的得分
setcolor(WHITE);
//画出蛇
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.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=getchar();
//接受案件
if(key==Esc)//按ESC键退出
elseif(key==UP&
snake.direction!
=4)
snake.direction=3;
elseif(key==RIGHT&
=2)
snake.direction=1;
elseif(key==LEFT&
=1)
snake.direction=2;
elseif(key==DOWN&
=3)
snake.direction=4;
}//endwhile
(1)
(5)游戏结束函数GameOver()
游戏结束,清除屏幕,输出分数,显示游戏结束信息。
voidGameOver()//游戏结束
cleardevice();
setcolor(RED);
outtextxy(100,100,"
我会回来的!
!
"
)