贪吃蛇

开通博客有些日子了,突然想贴上自己大一上做的小项目了,纯c语言写的,用的数组。

用devc直接运行的话呢,会有些闪屏,但是用vs稍微处理下就好了。

直接贴代码啦。

#include<stdio.h>    
#include<conio.h>    //方向键输入的读取函数头文件 
#include<stdlib.h>   //随机函数的头文件 
#include<time.h>  
#include<string.h>
const int m=20;  //行数, 欲阻止一个变量被改变,可以使用const关键字
const int n=60;   //列,定义长宽 
const char head='@';
const char body='#';
const char food='$';
char map[m][n];  
struct snack
{
	int x,y;
	int now;
}snack[m*n];
int key;
int dx[]={0,0,-1,1};
int dy[]={-1,1,0,0};
int sum=1,over=0;
void button();
void appear();
void fappear();
void move();
void show();
void eat(int x,int y);
int main()
{
    appear();
    show();
    return 0;
}
void button()   //游戏过程输入方向的判断 
{
	if(kbhit()!=0)//在执行时,检测是否有按键按下,有按下返回非0值,一般是1,没有按下返回0;是非阻塞函数
	{
		while(kbhit()!=0)
	    key=getch();//取出所有的按键 
	     switch(key)
	    {
		case 75: snack[0].now=0; break;  //left  //75,77,72,80 is ascll值 
		case 77: snack[0].now=1; break;//right
		case 72: snack[0].now=2; break;//up
		case 80: snack[0].now=3; break;//down
	    }
	}
}  
void appear()
{
	int sx,sy,i,j;
	sx=3;
	sy=5;
	snack[0].x=sx;       //***  must initialize
	snack[0].y=sy;
	snack[0].now=1 ;
	system("title  贪吃蛇"); 
	memset(map, ' ', sizeof(map));  //以‘ ’清零 
	system("cls");  //qing屏 
	printf("                   c语言  贪吃蛇\n");
	map[sx][sy]=head;
	fappear();
	for(i=0;i<m;i++)   //地图 
	{
		for(j=0;j<n;j++)
        {
        	if(i==0||j==0||i==m-1||j==n-1)map[i][j]='*';
        	printf("%c",map[i][j]);//头和食物已经包含进去了 
        }
        printf("\n");
	}
//	getch();// 在执行时,检测按下什么键,如果不按键该函数不返回;是阻塞函数
	button();
}
void fappear()
{
	int fx,fy;
	while(1)
	{	srand(time(0));  //种子 
		fx=rand()%(m-2)+1;
        fy=rand()%(n-2)+1;
	    if(map[fx][fy]==' ')
	    {
		   map[fx][fy]=food;
		   break;
	    }
	}
}
void show()
{
	int i,j;
	while(1) 
	{	
		_sleep(100);
	    button();
		move();
		if(over)
		{
			printf("                   gameover >_<");
			getchar();
			break;
		} 
		system("cls");
		printf("                   c语言  贪吃蛇\n");
		for(i=0;i<m;i++)   //刷新后地图 
	  {
		for(j=0;j<n;j++)
        {
        	if(i==0||j==0||i==m-1||j==n-1)map[i][j]='*';
        	printf("%c",map[i][j]);
        }
        printf("\n");
	  }
	}
	//getch();
	button();
}
void move()    
{
	int x,y,i;
	x=snack[0].x;   y=snack[0].y;//保存蛇头dang前位置 ,后来变成脖子的位置 
	map[x][y]=' ';
	snack[0].x=snack[0].x+dx[snack[0].now];
	snack[0].y=snack[0].y+dy[snack[0].now];//蛇头先移动 
	if(map[snack[0].x][snack[0].y]=='$')
	     eat(x,y);//吃到食物,及处理
	if(map[snack[0].x][snack[0].y]=='*'||map[snack[0].x][snack[0].y]=='#')
	     over=1;
	if(map[snack[0].x][snack[0].y]==' ')
	   {
	   	map[snack[0].x][snack[0].y]='@';
		for(i=1;i<sum;i++)
	      {
	      	if(i==1)  //i=1是尾巴,让尾巴为‘ ’ 
	      	{
	      		map[snack[i].x][snack[i].y]=' ';
	      	}
	      	if(i==sum-1)  //蛇头紧跟着的那一节,即脖子 
	      	{
	      	snack[i].x=x;
     	    snack[i].y=y;
     	    snack[i].now=snack[0].now;
     	    }
	      	else
	      	{
            snack[i].x=snack[i+1].x;
            snack[i].y=snack[i+1].y;
		    snack[i].now=snack[i+1].now;
		   	}
		  map[snack[i].x][snack[i].y]=body;
	     }
	   }  
}
void eat(int x,int y)
{
	sum++;
	map[snack[0].x][snack[0].y]='@';
	snack[sum-1].x= x;
	snack[sum-1].y= y;
	snack[sum-1].now=snack[0].now;
	map[snack[sum-1].x][snack[sum-1].y]='#';
	fappear();
}

  

posted @ 2015-12-05 23:09  tt香薷  阅读(253)  评论(0编辑  收藏  举报