c语言实现,图形化贪吃蛇

承接上篇的扫雷,在分享一个贪吃蛇的代码,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();
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章