C语言小游戏:贪吃蛇

用指针数组来表示蛇,p[0]表示蛇头

控制方向:w,s,a,d-->上下左右

 j,k-->加速、减速

键盘控制需要用到线程

编译时需要在后面加     -lpthread

 

 

 C语言小游戏:贪吃蛇_第1张图片

 

 

#include 
#include 
#include 
#include 
#include 

#define X 20
#define Y 40

char head='@';//蛇头的形状
char body='O';//蛇身的形状

char a[X][Y]={'O','O','O','@'};
char *p[X*Y]={&a[0][3],&a[0][2],&a[0][1],&a[0][0]};//p[0]表示蛇头

int n=3;	//蛇身的长度(不带蛇头)
int i,j;
int f=1;	//标志位:1.右;2.上;3.左;4.下;-1.退出
int us=200000;//用于usleep,延时0.2秒

void right()
{
	*p[n]=0;
	for(i=n;i>0;i--)
	{
		p[i]=p[i-1];
	}
	*p[0]=body;
	p[0]=p[0]+1;//蛇头向右移
	*p[0]=head;
}
void left()
{
	*p[n]=0;
	for(i=n;i>0;i--)
	{
		p[i]=p[i-1];
	}
	*p[0]=body;
	p[0]=p[0]-1;
	*p[0]=head;
}
void down()
{
	*p[n]=0;
	for(i=n;i>0;i--)
	{
		p[i]=p[i-1];
	}
	*p[0]=body;
	p[0]=p[0]+Y;
	*p[0]=head;
}
void up()
{
	*p[n]=0;
	for(i=n;i>0;i--)
	{
		p[i]=p[i-1];
	}
	*p[0]=body;
	p[0]=p[0]-Y;
	*p[0]=head;
}


void show()
{
	system("clear");
	for(i=0;i上下左右;j,k->加减速;ESC退出\n");
}


int ran()//随机数生成*
{
	srand(time(NULL));
lb:
	i=rand()%X;
	j=rand()%Y;
	//随机位置的值为0,则产生*;否则继续找随机位置
	if(a[i][j]==0)
		a[i][j]='*';
	else
		goto lb;
}

void eat()
{
	if(f==1)//右
	{
		if(*(p[0]+1)=='*')
		{
			n++;//长度增加
			p[n]=p[n-1];
			ran();//随机数生成*
		}		
	}
	if(f==2)//上
	{
		if(*(p[0]-Y)=='*')
		{
			n++;//长度增加
			p[n]=p[n-1];
			ran();//随机数生成*
		}		
	}
	if(f==3)//左
	{
		if(*(p[0]-1)=='*')
		{
			n++;//长度增加
			p[n]=p[n-1];
			ran();//随机数生成*
		}		
	}
	if(f==4)//下
	{
		if(*(p[0]+Y)=='*')
		{
			n++;//长度增加
			p[n]=p[n-1];
			ran();//随机数生成*
		}		
	}
}

void fail()
{
	if(p[0]<&a[0][0]||p[0]>&a[X-1][Y-1])//蛇头不在矩阵内
	{
		printf("fail!\n");
		f=-1;
	}
	if(f==1)//右
	{
		for(i=n;i>0;i--)
		{
			if((p[0]+1)==p[i])//右边是自己的身体
			{
				printf("fail!\n");
				f=-1;
			}
		}	
	}
	if(f==2)//上
	{
		for(i=n;i>0;i--)
		{
			if((p[0]-Y)==p[i])//上边是自己的身体
			{
				printf("fail!\n");
				f=-1;
			}
		}	
	}
	if(f==3)//左
	{
		for(i=n;i>0;i--)
		{
			if((p[0]-1)==p[i])//左边是自己的身体
			{
				printf("fail!\n");
				f=-1;
			}
		}	
	}
	if(f==4)//下
	{
		for(i=n;i>0;i--)
		{
			if((p[0]+Y)==p[i])//下边是自己的身体
			{
				printf("fail!\n");
				f=-1;
			}
		}	
	}
}

void *key(void *arg)//控制方向:w,s,a,d-->上下左右
{
	char k;
	while(1)
	{
		k=getchar();
		if(k=='w')//上
			f=2;
		if(k=='s')//下
			f=4;
		if(k=='a')//左
			f=3;
		if(k=='d')//右
			f=1;
		if(k=='j')//加速
			us=us*4/5;
		if(k=='k')//减速
			us=us*5/4;
		if(k==27)//ESC
		{
			printf("退出!\n");
			f=-1;
		}
		usleep(100);
	}
}

int main()
{
	system("stty -icanon");//关闭缓冲区,输入字符无需回车直接接受
	pthread_t  pid;
    pthread_create(&pid , NULL , key , NULL);//创建线程,键盘控制
	ran();
	while(1)
	{
		show();		//显示
		usleep(us);
		fail();		//判断是否会咬到自己
		eat();		//判断是否能吃到*
		if(f==1)//右
			right();
		if(f==2)//上
			up();
		if(f==3)//左
			left();
		if(f==4)//下
			down();
		if(f==-1)//退出
		{
			pthread_cancel(pid);//关闭线程
			return -1;
		}
	}
	
	
	return 0;
}

 

你可能感兴趣的:(小游戏,c语言)