承接上篇的扫雷,在分享一个贪吃蛇的代码,w,a,s,d控制方向。
其实在写贪吃蛇的时候,代价或许会不懂蛇的尾巴怎么画,这个告诉大家一个技巧,背景融入法,就是一条边画成黑色,相信大家都懂了,相信大家如果在写的时候,可能会有些许疑惑,蛇怎么实现转弯,那么大家可以换一种思维,蛇只有头前进,身体的其他部位都是跟着前一段身体走,这样或许大家就知道怎么写了(array[1]和array[2]),数组紧贴赋值,其实根本不用考虑转弯。
附上代码:
//////////////////////////
//程序名称:贪吃蛇娱乐版 //
//作者: ys //
//最后修改:2014.7.27 //
//编辑条件:VC6.0 //
//////////////////////////
#include <graphics.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#define SIZE_ALL_BODY 20
#define SIZE_UNIT_BODY 20
#define WIDTH 480
#define HEIGHT 360
int x0,y0;
int m_maxx,m_maxy;
typedef enum //蛇移动的四个方向
{
left, right, up, down
}DIR;
typedef struct //结构体化座标
{
int x; //x座标
int y; //y座标
}COOR;
struct FOOD //定义食物的信息
{
int flag; //食物的状态,1表示没吃,0表示吃了
COOR crd; //食物的座标
}food;
struct SNAKE //定义蛇的状态信息
{
int body_num; //蛇身多少节
COOR body[SIZE_ALL_BODY]; //蛇身每节的座标
DIR dir; //蛇头方向
}snake;
/******************************************************/
void init_system(); //初始化系统
void setfood(); //设置食物信息
void draw_food(); //画食物
void judge_hit(); //判断是否撞击
void eatfood(); //蛇吃食物
void snakemove(); //蛇的移动
void gameover(); //游戏结束
void showsnake(); //画蛇
void keyboard(); //键盘操作
/*****************************************************/
int main()
{
init_system();
while(1)
{
while(!kbhit())
{
if (!food.flag)
setfood(); //判断食物是否被吃
draw_food(); //画食物
showsnake(); //画蛇
snakemove(); //蛇的移动
judge_hit(); //蛇是否发生撞击
eatfood(); //吃食物
}
keyboard();
}
getch();
return 0;
}
//判断是否撞击身体或者边界
void judge_hit()
{
int i;
if (snake.body[0].x < x0 || snake.body[0].x > x0+WIDTH-SIZE_UNIT_BODY || //判断撞击边界
snake.body[0].y < y0 || snake.body[0].y > y0+HEIGHT-SIZE_UNIT_BODY)
{
gameover();
}
for (i=snake.body_num-1;i>0;i--) //判断撞击身体
{
if (snake.body[0].x==snake.body[i].x && snake.body[0].y==snake.body[i].y)
{
gameover();
}
}
}
//蛇的移动
void snakemove()
{
int i;
for (i=snake.body_num;i>0;i--)
{
snake.body[i].x=snake.body[i-1].x;
snake.body[i].y=snake.body[i-1].y;
}
switch(snake.dir)
{
case right:
snake.body[0].x+=SIZE_UNIT_BODY;break;
case left:
snake.body[0].x-=SIZE_UNIT_BODY;break;
case up:
snake.body[0].y-=SIZE_UNIT_BODY;break;
case down:
snake.body[0].y+=SIZE_UNIT_BODY;break;
}
Sleep(100);
}
//键盘控制
void keyboard()
{
switch(getch())
{
case 'w':
case 'W':
if (snake.dir!=down)
{
snake.dir=up;
break;
}
case 'a':
case 'A':
if (snake.dir!=right)
{
snake.dir=left;
break;
}
case 's':
case 'S':
if (snake.dir!=up)
{
snake.dir=down;
break;
}
case 'd':
case 'D':
if (snake.dir!=left)
{
snake.dir=right;
break;
}
}
}
//画蛇
void showsnake()
{
int i;
for (i=snake.body_num-1;i>=0;i--)
{
rectangle(snake.body[i].x,snake.body[i].y,snake.body[i].x+SIZE_UNIT_BODY,snake.body[i].y+SIZE_UNIT_BODY);
}
setlinecolor(BLACK);
rectangle(snake.body[snake.body_num].x,snake.body[snake.body_num].y,snake.body[snake.body_num].x+SIZE_UNIT_BODY,snake.body[snake.body_num].y+SIZE_UNIT_BODY);
}
//画食物
void draw_food()
{
int i=0;
i=rand()%4;
switch(i)
{
case 0: setlinecolor(RED);break;
case 1: setlinecolor(GREEN);break;
case 2: setlinecolor(WHITE);break;
case 3: setlinecolor(BLUE);break;
}
i++;
rectangle(food.crd.x,food.crd.y,food.crd.x+SIZE_UNIT_BODY,food.crd.y+SIZE_UNIT_BODY);
}
//设置食物信息
void setfood()
{
srand((unsigned)time(NULL));
food.crd.x=x0+rand()%(WIDTH/SIZE_UNIT_BODY)*SIZE_UNIT_BODY;
food.crd.y=y0+rand()%(HEIGHT/SIZE_UNIT_BODY)*SIZE_UNIT_BODY;
food.flag=1;
}
//蛇吃食物
void eatfood()
{
if (snake.body[0].x==food.crd.x && snake.body[0].y==food.crd.y)
{
snake.body_num++;
setlinecolor(RED);
rectangle(food.crd.x,food.crd.y,food.crd.x+SIZE_UNIT_BODY,food.crd.y+SIZE_UNIT_BODY);
food.flag=0;
}
}
//初始化系统
void init_system()
{
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode," "); //初始化图形界面模式
m_maxx=getmaxx();
m_maxy=getmaxy();
x0=(m_maxx-WIDTH)/2;
y0=(m_maxy-HEIGHT)/2;
snake.body_num=1; //初始化蛇的状态
srand((unsigned)time(NULL));
snake.body[0].x=x0+rand()%(WIDTH/SIZE_UNIT_BODY/2)*SIZE_UNIT_BODY;;
snake.body[0].y=y0+rand()%(HEIGHT/SIZE_UNIT_BODY/2)*SIZE_UNIT_BODY;
food.flag=0;
int dir;
dir=rand()%4;
switch(dir)
{
case 0:
snake.dir=right;break;
case 1:
snake.dir=left;break;
case 2:
snake.dir=up;break;
case 3:
snake.dir=down;break;
}
setlinecolor(WHITE);
rectangle(x0-1,y0-1,x0+WIDTH+1,y0+HEIGHT+1);//画游戏框
}
//游戏结束
void gameover()
{
int x,y;
settextstyle(40,40,_T("宋体"));
x=(m_maxx-textwidth("GAME OVER!"))/2;
y=10;
outtextxy(x,y,_T("GAME OVER!"));
getch();
closegraph();
}