c语言贪吃蛇(教程和代码)

1.教程
百度云链接:
链接:https://pan.baidu.com/s/1x6WkRs9L5yuXH8fsz1iMmA
提取码:tp4x

2.代码(亲测DVC++可运行)

#include "stdio.h"
#include "time.h"    
#include "windows.h" 
#include "stdlib.h"  
#include "conio.h"

#define U 1
#define D 2
#define L 3
#define R 4      //蛇的状态,U:上 ;D:下;L:左 R:右

void gotoxy(int x,int y);//设置光标位置
int color(int c);        //更改文字颜色
void printfsnake();       //输出字符蛇画
void welcometogame();    //开始界面
void createMap();        //绘制地图
void scoreandtips();     //游戏界面右侧的得分和小提示 
void initsnake();        //初始化蛇身,画蛇身
int createfood();		 //创造食物
int biteself();          //判断是否咬到了自己
void cantcrosswall();    //蛇是否撞墙
void speedup();          //加速
void speeddown();        //减速
void snakemove();        //控制蛇前进的方向
void keyboardControl(); //控制键盘按键
void Lostdraw();         //游戏结束界面
void endgame();          //游戏结束
void choose();           //游戏失败后的选择
void File_out();         //在文件中读取最高分
void File_in();          //储存最高分进文件
void explation();        //游戏说明 

typedef struct snake//结构体 
{
	int x,y;
	struct snake *next; 
}snake;

int score=0,add=10; 
int HighScore=0;
int status,sleeptime=200;//蛇的状态,运行时间间隔 
snake *head,*food,*q;
int endgamestatus=0;//结束时蛇的状态(1撞墙,2咬到自己,3按Ese) 
HANDLE h0ut; //控制台句柄 

//system("color xx") 
int color(int c)  //更改文字颜色
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);
} 

void gotoxy(int x,int y)  //设置光标位置
{
	COORD xy;
	xy.X=x;
	xy.Y=y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),xy);
}

void printfsnake()       //画蛇 
{
	gotoxy(35,1);
	color(6);
	printf("/^\\/^\\");      //蛇眼睛

	gotoxy(34,2);
	printf("|__|  O|");      //蛇眼睛

	gotoxy(33,2);
	color(2);
	printf("_");

	gotoxy(25,3);
	color(12);
	printf("\\/");      	//蛇信

	gotoxy(31,3);
	color(2);
	printf("/");

	gotoxy(37,3);
	color(6);
	printf(" \\_/");     	//蛇眼睛

	gotoxy(41,3);
	color(10);
	printf(" \\");

	gotoxy(26,4);
	color(12);
	printf("\\____");   	//舌头

	gotoxy(32,4);
	printf("_________/");

	gotoxy(31,4);
	color(2);
	printf("|");

	gotoxy(43,4);
	color(10);
	printf("\\");

	gotoxy(32,5);
	color(2);
	printf("\\_______");    //蛇嘴

	gotoxy(44,5);
	color(10);
	printf("\\");

	gotoxy(39,6);
	printf("|     |                  \\");  //下面都是画蛇身

	gotoxy(38,7);
	printf("/      /                   \\");

	gotoxy(37,8);
	printf("/      /                    \\ \\");

	gotoxy(35,9);
	printf("/      /                       \\ \\");

	gotoxy(34,10);
	printf("/     /                          \\  \\");

	gotoxy(33,11);
	printf("/     /             _----_         \\   \\");

	gotoxy(32,12);
	printf("/     /           _-~      ~-_         |  |");

	gotoxy(31,13);
	printf("(      (        _-~    _--_    ~-_     _/  |");

	gotoxy(32,14);
	printf("\\     ~-____-~    _-~    ~-_    ~-_-~    /");

	gotoxy(33,15);
	printf("~-_           _-~          ~-_       _-~");

	gotoxy(35,16);
	printf("~--______-~                ~-___-~");
}


void welcometogame()  //开始界面
{
	int n;
	int i,j = 1;
	gotoxy(43,18);
	color(11);
	printf("贪 吃 蛇 大 作 战");
	color(14);          			//黄色边框
	for (i = 20; i <= 26; i++)   	//输出上下边框┅
	{
		for (j = 27; j <= 74; j++)  //输出左右边框┇
		{
			gotoxy(j, i);
			if (i == 20 || i == 26)
			{
				printf("-");
            }
			else if (j == 27 || j == 74)
            {
				printf("|");
            }
		}
	}
	color(12);
	gotoxy(35, 22);
	printf("1.开始游戏");
	gotoxy(55, 22);
	printf("2.游戏说明");
	gotoxy(35, 24);
	printf("3.退出游戏");
	gotoxy(29,27);
	color(3);
	printf("请选择[1 2 3]:[ ]\b\b");        //\b为退格,使得光标处于[]中间
	color(14);
    scanf("%d", &n);    		//输入选项
	switch(n)
	{
		case(1):
		system("cls");//清屏
		createMap();
		initsnake();
		createfood();break; 
		
		case(2):explation();break;         //游戏说明
		
		case(3):exit(0);break;//退出游戏 
		
		default:
			color(12);
			gotoxy(40,28);
			printf("请输入1~3之间的数!");
			getch();			//输入任意键
			system("cls");
			printfsnake();
			welcometogame();
			keyboardControl();
			endgame();
			
	}
}

void createMap()  //绘制地图
{
	int i,j;
	for(i=0;i<=26;i++)
	{
		for(j=0;j<58;j+=2) 
		{
			if(j==0||i==0||j==56||i==26)
			{
				color(5);
				gotoxy(j,i);
				printf("□");
			}
			else
			{
				color(3);
				printf("■");
			}
		} 
		
	}
}
 
void scoreandtips()  //游戏界面右侧的得分和小提示
{                    //该函数在键盘控制函数中调用 
	File_out();
	color(11);
	gotoxy(64,4);
	printf("☆最高纪录☆:%d",HighScore);
	color(14);
	gotoxy(64,8);
	printf("得分:%d",score);
	color(13);
	gotoxy(73,11);
	printf("小 提 示");
	color(6);
	gotoxy(60,13);
	printf("卍-----------------------卍");
	gotoxy(60,25);
	printf("卍-----------------------卍");
	color(3);
	gotoxy(64,14);
	printf("每个食物得分:%d分",add);
	gotoxy(64,16);
	printf("不能穿墙,不能咬到自己");
	gotoxy(64,18);
	printf("用↑↓←→分别控制蛇的移动"); 
	gotoxy(64,20);
	printf("F1为加速,F2为减速");
	gotoxy(64,22);
	printf("space:暂停游戏");
	gotoxy(64,24);
	printf("Esc退出游戏") ;
} 


void File_out()        //在文件中读取最高分
{
	FILE *fp;
	fp=fopen("save.txt","a+");
	fscanf(fp,"%d",&HighScore);
	fclose(fp);
} 

void File_in()         //写入最高分 
{
	FILE *fp;
	fp=fopen("save.txt","w+");
	fprintf(fp,"%d",score);
 } 


void initsnake()  //初始化蛇身
{                 //该函数放入welcometogame()和choose()的case 1中 
	snake *tail;
	int i;
	tail=(snake*)malloc(sizeof(snake));
	tail->x=24;
	tail->y=5;
	tail->next=NULL;   
	
	for(i=1;i<=4;i++)
	{
		head=(snake*)malloc(sizeof(snake));
		head->next=tail;
		head->x=24+2*i;
		head->y=5;
		tail=head;
	}
	while(tail)
	{
		gotoxy(tail->x,tail->y);
		color(14);
		printf("★");
		tail=tail->next;
		}
		
	
} 
 
 
int createfood()//食物,不能出现在墙上和蛇身上,x坐标要为偶数 
{
	snake *food_1;
	food_1=(snake*)malloc(sizeof(snake));
	srand((unsigned)time(NULL));
	
	while((food_1->x= (rand()%53+2) )%2 != 0);  //选出2<=x<55中的偶数
	
	food_1->y= (rand()%25+1);
	q=head;
	while(q)
	{
		if(q->x==food_1->x && q->y==food_1->y)
		{
			free(food_1);
			createfood();
			return 0;
		}
		q=q->next;
	} 
	gotoxy(food_1->x,food_1->y);
	color(12); 
	printf("●");
	food=food_1;
		
}
 

int biteself()          //判断是否咬到了自己
{
	snake *self;
	self=head->next;
	while(self)
	{
		if(self->x==head->x && self->y==head->y)
		{
			endgamestatus=2;
			return 1;
		} 
			
		self=self->next;
	}
	return 0;
 } 


void cantcrosswall()    //蛇是否撞墙
{
	if(head->x==0||head->x==56||head->y==26||head->y==0)
		endgamestatus=1;
} 



void speedup()          //加速
{
	if(sleeptime>=50)
		{
			sleeptime=sleeptime-10;
			add=add+2;
		}		
} 



void speeddown()         //减速
{
	if(sleeptime<350)
	{
		sleeptime+=30;
		add-=2; 
		if(sleeptime==350)
		add=1;
	}
 } 



void snakemove()        //不按键时蛇前进的方向UDLR
{
	snake *nexthead;
	nexthead=(snake*)malloc(sizeof(snake)); 
	if(status==U)
	{
		nexthead->x=head->x;
		nexthead->y=(head->y)-1;
		nexthead->next=head;
		head=nexthead;
		q=head;
		if(nexthead->x==food->x && nexthead->y==food->y)
		{
			while(q)
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("★");
				q=q->next;
			}
			score+=add;
		 	speedup();
		 	createfood();
		}
		else
		{
			while(q->next->next)
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("★");
				q=q->next;
			}
			
			gotoxy(q->next->x,q->next->y);
			color(3);
			printf("■");
			free(q->next);
			q->next=NULL;
		}
	}
	
	if(status==D)
	{
		
		nexthead->x=head->x;
		nexthead->y=(head->y)+1;
		nexthead->next=head;
		head=nexthead;
		q=head;
		if(nexthead->x==food->x && nexthead->y==food->y)
		{
			while(q)
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("★");
				q=q->next;
			}
			score+=add;
		 	speedup();
		 	createfood();
		}
		else
		{ 
			while(q->next->next)   
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("★");
				q=q->next;
			}
			gotoxy(q->next->x,q->next->y);
			color(3);
			printf("■");
			free(q->next);
			q->next=NULL;
		}
	}
	
	
	if(status==L)
	{
		nexthead->x=(head->x)-2;
		nexthead->y=(head->y);
		nexthead->next=head;
		head=nexthead;
		q=head;
		if(nexthead->x==food->x && nexthead->y==food->y)
		{
			while(q)
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("★");
				q=q->next;
			}
			score+=add;
		 	speedup();
		 	createfood();
		}
		else
		{
			while(q->next->next)
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("★");
				q=q->next;
			}
			gotoxy(q->next->x,q->next->y);
			color(3);
			printf("■");
			free(q->next);
			q->next=NULL;
		}
	}

	if(status==R)
	{
		nexthead->x=(head->x)+2;
		nexthead->y=(head->y);
		nexthead->next=head;
		head=nexthead;
		q=head;
		if(nexthead->x==food->x && nexthead->y==food->y)
		{
			while(q)
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("★");
				q=q->next;
			}
			score+=add;
		 	speedup();
		 	createfood();
		}
		else
		{
			while(q->next->next)    //跳出循环时,q指在链表的倒数第二个位置
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("★");
				q=q->next;
			}
			
			gotoxy(q->next->x,q->next->y);
			color(3);
			printf("■");
			free(q->next);
			q->next=NULL;
			
			
		}
	}
	cantcrosswall();    //判断蛇是否撞墙
	
	biteself();   //是否咬到自己 
}


void keyboardControl()   //控制键盘按键
{
	status=R;
	while(1)
	{
		scoreandtips();
		if(GetAsyncKeyState(VK_UP) && status!=D)
			{
			status=U;	
			}
		else if(GetAsyncKeyState(VK_DOWN) && status!=U)
			{
				status=D;
			}
		else if(GetAsyncKeyState(VK_LEFT) && status!=R)
			{
				status=L;
			}
		else if(GetAsyncKeyState(VK_RIGHT) && status!=L)
			{
				status=R;
			}
		if(GetAsyncKeyState(VK_SPACE))   //空格暂停 
			{
				while(1)
				{
					Sleep(300);
				if(GetAsyncKeyState(VK_SPACE))
					break;
				}
			}
		else if(GetAsyncKeyState(VK_ESCAPE))
		{
			endgamestatus=3;
			break;   
		 } 
		else if(GetAsyncKeyState(VK_F1))
		 	speedup();
		else if(GetAsyncKeyState(VK_F2))
		 	speeddown();
		Sleep(sleeptime);
		snakemove();
		if(endgamestatus!=0)
        {
        	break;
		}
	}
} 

void explation()
{
	int i,j;
	system("cls");
	color(13);
    gotoxy(44,3);
    printf("游戏说明");
    color(2);
    for (i = 6; i <= 22; i++)   //输出上下边框===
	{
		for (j = 20; j <= 75; j++)  //输出左右边框||
		{
			gotoxy(j, i);
			if (i == 6 || i == 22) printf("=");
			else if (j == 20 || j == 75) printf("||");
		}
	}
    color(3);
    gotoxy(30,8);
    printf("tip1: 不能穿墙,不能咬到自己");
    color(10);
    gotoxy(30,11);
    printf("tip2: 用↑.↓.←.→分别控制蛇的移动");
    color(14);
    gotoxy(30,14);
    printf("tip3: F1 为加速,F2 为减速");
    color(11);
    gotoxy(30,17);
    printf("tip4: 按空格键暂停游戏,再按空格键继续");
    color(4);
    gotoxy(30,20);
    printf("tip5: ESC :退出游戏.space:暂停游戏");
    getch();              //按任意键返回主界面
    system("cls");
    printfsnake();
    welcometogame();
}


void endgame()        //游戏结束 要更新最高分 
{
    system("cls");
    if(endgamestatus==1)
    {
        
		Lostdraw();
		gotoxy(35,9);
    	color(12);
		printf("对不起,您撞到墙了。游戏结束!");
    }
    else if(endgamestatus==2)
    {
        
        Lostdraw();
        gotoxy(35,9);
    	color(12);
        printf("对不起,您咬到自己了。游戏结束!");
    }
    else if(endgamestatus==3)
    {
		Lostdraw();
		gotoxy(40,9);
    	color(12);
        printf("您已经结束了游戏。");
    }
    gotoxy(43,12);
    color(13);
    printf("您的得分是 %d",score);

	if(score >= HighScore)
	{
		color(10);
		gotoxy(33,16);
		printf("创纪录啦!最高分被你刷新啦,真棒!!!");
		File_in();              //把最高分写进文件
	}
	else
	{
		color(10);
		gotoxy(33,16);
		printf("继续努力吧~ 你离最高分还差:%d",HighScore-score);
	}
	choose();
}

void choose()
{
	int n;
	gotoxy(25,23);
	color(12);
	printf("我要重新玩一局-------1");
	gotoxy(52,23);
	printf("不玩了,退出吧-------2");
	gotoxy(46,25);
	color(11);
	printf("选择:");
	scanf("%d", &n);
	switch(n)
	{
		case 1:
		system("cls");         //数据重置 
		add=10;
		sleeptime=200;
		score=0;
		endgamestatus=0;
		
		createMap();
		initsnake();
		createfood();
		keyboardControl();
		endgame();
		break;
		
		case 2:
		exit(0);
		break;
		
		default:
		gotoxy(35,27);
		color(12);
		printf("※※您的输入有误,请重新输入※※");
		system("pause >nul");
		endgame();
		break;
		 
	}
	
}

void Lostdraw()
{
	system("cls");
	int i;
	gotoxy(45,2);
	color(6);
	printf("\\\\\\|///");
	gotoxy(43,3);
	printf("\\\\");
	gotoxy(47,3);
	color(15);
	printf(".-.-");
	gotoxy(54,3);
	color(6);
	printf("//");

	gotoxy(44,4);
	color(14);
	printf("(");

	gotoxy(47,4);
	color(15);
	printf(".@.@");

	gotoxy(54,4);
	color(14);
	printf(")");

	gotoxy(17,5);
	color(11);
	printf("+------------------------");

	gotoxy(35,5);
	color(14);
	printf("oOOo");

	gotoxy(39,5);
	color(11);
	printf("----------");

	gotoxy(48,5);
	color(14);
	printf("(_)");

	gotoxy(51,5);
	color(11);
	printf("----------");

	gotoxy(61,5);
	color(14);
	printf("oOOo");

	gotoxy(65,5);
	color(11);
	printf("-----------------+");
	
	for(i = 6;i<=19;i++)        //竖边框
	{
		gotoxy(17,i);
		printf("|");
		gotoxy(82,i);
		printf("|");
	}

	gotoxy(17,20);
	printf("+---------------------------------");

	gotoxy(52,20);
	color(14);
	printf("☆☆☆〃");

	gotoxy(60,20);
	color(11);
	printf("----------------------+");

}


int main()
{
	system("mode con cols=100 lines=30");
	printfsnake();
	welcometogame();
	keyboardControl();
	endgame();
	return 0;
}

你可能感兴趣的:(C语言项目)