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();
}


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