用c语言编写贪吃蛇源码

版权声明:若想转载,请在下面评论留言 https://blog.csdn.net/qq_40935723/article/details/86553671

若想进一步了解请看这份博客

用c语言编写贪吃蛇讲解     https://mp.csdn.net/postedit/86553391

编译环境: Dev c++ 

(不同的编译环境可能导致有些东西无法运行,但编写贪吃蛇的思想是一样的)

源码如下:
 

创建   SnakeMap.h   的头文件

#include<stdlib.h> 

#ifndef SNAKEMAP_H 
#define SNAKEMAP_H

#define LengthWall 50    //墙的长度 
#define WidthWall 25 	//墙的宽度 

int Map[LengthWall+1][WidthWall+1];	//创建初始地图 


typedef struct snake{
	int x,y;
	struct snake *SnakeNext;
}SNAKE,*Snake;


//用于移动光标
void gotoxy(int x,int y){		
COORD pos;       
pos.X = x-1;    
pos.Y = y-1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}


void FirstMap(Snake &snake){
	for(int i=1;i<=LengthWall;i++){
		for(int j=1;j<=WidthWall;j++){
			if(j==1||j==WidthWall)
			Map[i][j]=1;
			else if((j>=2&&j<=WidthWall-1)&&(i==1||i==LengthWall))
			Map[i][j]=1;
		}
	}
	
	for(int i=1;i<=LengthWall;i++){
		for(int j=1;j<=WidthWall;j++){
			if((j==1||j==WidthWall)&&Map[i][j]==1)
			{
				gotoxy(i,j);
				printf("=");  
			}
			else if((j>=2&&j<=WidthWall-1)&&(i==1||i==LengthWall)&&Map[i][j]==1)
			{
				gotoxy(i,j);
				printf("|");  
			}
		}
	}	
	snake =(Snake)malloc(sizeof(Snake));
	Snake p=snake,s;
	for(int i=LengthWall-4;i<=LengthWall-2;i++)
	{
		
		s=(Snake)malloc(sizeof(SNAKE));
		s->x=i;s->y=12;
		p->SnakeNext=s;
		p=s;
	}
	p->SnakeNext=NULL;		
	p=snake->SnakeNext;
	gotoxy(p->x,p->y);
	printf("O");
	p=snake;
	while(p->SnakeNext)
	{
		gotoxy(p->SnakeNext->x,p->SnakeNext->y);
		printf("+");
		p=p->SnakeNext;
	}
}

void SecondMap(Snake &snake){
	for(int i=1;i<=LengthWall;i++){
		for(int j=1;j<=WidthWall;j++){
			if(j==1||j==WidthWall)
			Map[i][j]=1;
			else if((j>=2&&j<=WidthWall-1)&&(i==1||i==LengthWall))
			Map[i][j]=1;
		}
	}
	for(int i=6;i<=18;i++)
	Map[25][i]=1;
	for(int i=1;i<=LengthWall;i++){
		for(int j=1;j<=WidthWall;j++){
			if((j==1||j==WidthWall)&&Map[i][j]==1)
			{
				gotoxy(i,j);
				printf("=");  
			}
			else if((j>=2&&j<=WidthWall-1)&&(i==1||i==LengthWall)&&Map[i][j]==1)
			{
				gotoxy(i,j);
				printf("|");  
			}
			else if(Map[i][j]==1)
			{
				gotoxy(i,j);
				printf("#");  
			}
		}
	}		
	snake =(Snake)malloc(sizeof(Snake));
	Snake p=snake,s;
	for(int i=LengthWall-4;i<=LengthWall-2;i++)
	{
		
		s=(Snake)malloc(sizeof(SNAKE));
		s->x=i;s->y=12;
		p->SnakeNext=s;
		p=s;
	}
	p->SnakeNext=NULL;		
	p=snake->SnakeNext;
	gotoxy(p->x,p->y);
	printf("O");
	p=snake;
	while(p->SnakeNext)
	{
		gotoxy(p->SnakeNext->x,p->SnakeNext->y);
		printf("+");
		p=p->SnakeNext;
	}
}

void ThirdMap(Snake &snake){
	for(int i=1;i<=LengthWall;i++){
		for(int j=1;j<=WidthWall;j++){
			if(j==1||j==WidthWall)
			Map[i][j]=1;
			else if((j>=2&&j<=WidthWall-1)&&(i==1||i==LengthWall))
			Map[i][j]=1;
		}
	}
		
	for(int i=12;i<=35;i++)
	Map[i][12]=1;
	for(int i=6;i<=18;i++)
	Map[25][i]=1;
	for(int i=1;i<=LengthWall;i++){
		for(int j=1;j<=WidthWall;j++){
			if((j==1||j==WidthWall)&&Map[i][j]==1)
			{
				gotoxy(i,j);
				printf("=");  
			}
			else if((j>=2&&j<=WidthWall-1)&&(i==1||i==LengthWall)&&Map[i][j]==1)
			{
				gotoxy(i,j);
				printf("|");  
			}
			else if(Map[i][j]==1)
			{
				gotoxy(i,j);
				printf("#");  
			}
		}
	}		
	snake =(Snake)malloc(sizeof(Snake));
	Snake p=snake,s;
	for(int i=LengthWall-4;i<=LengthWall-2;i++)
	{
		
		s=(Snake)malloc(sizeof(SNAKE));
		s->x=i;s->y=12;
		p->SnakeNext=s;
		p=s;
	}
	p->SnakeNext=NULL;		
	p=snake->SnakeNext;
	gotoxy(p->x,p->y);
	printf("O");
	p=snake;
	while(p->SnakeNext)
	{
		gotoxy(p->SnakeNext->x,p->SnakeNext->y);
		printf("+");
		p=p->SnakeNext;
	}
}

#endif

创建   SnakeOperate.h   的头文件

#include<windows.h>
#include"SnakeMap.h"
#ifndef SNAKEOPERATE_H 
#define SNAKEOPERATE_H

int GameScore=0;	//用于统计游戏得分 
int DifficultyLevel; //难度等级 


struct Food{
	int foodX,foodY;
};

Food food; 			//全局变量 


//打印蛇的身体
void SnakeBody(Snake &snake){	
	Snake p=snake->SnakeNext;
	gotoxy(p->x,p->y);
	printf("O");
	while(p->SnakeNext)
	{
		gotoxy(p->SnakeNext->x,p->SnakeNext->y);
		printf("+");
		p=p->SnakeNext;
	}
}


//食物产生 
void SnakeFood(Snake &snake,Food &food){
	Snake p=snake;
	int x,y;
	bool result=true;
	while(result)
	{
		food.foodX=rand()%(LengthWall-2)+2;
		food.foodY=rand()%(WidthWall-2)+2;
		if(Map[food.foodX][food.foodY]==1)
		continue;
		while(p->SnakeNext)
		{
			if(food.foodX==p->SnakeNext->x&&food.foodY==p->SnakeNext->y)break;
			p=p->SnakeNext;
		}		
		if(p->SnakeNext==NULL)result=false;
	}
	gotoxy(food.foodX,food.foodY);
	printf("*");
}


//判断蛇是否吃到东西 
bool SnakeEat(Snake &snake){
	Snake p=snake->SnakeNext;
	if(p->x==food.foodX&&p->y==food.foodY)
	{
		GameScore++;
		SnakeFood(snake,food);
		return true;
	}
	else
	return false;
}


//游戏结果 
void GameResult(){
	system("cls");
	gotoxy(40,5);
	printf("Game Over\n");
	gotoxy(40,7);
	printf("游戏分数:%d\n",GameScore);
	gotoxy(40,9);
	printf("不要灰心,再接再厉\n");
	system("PAUSE");
	exit(0);

}

//判断蛇是否死亡 
void SnakeDead(Snake &snake) 
{

	Snake p=snake->SnakeNext;
	if(Map[p->x][p->y]==1)
	GameResult();
	p=snake->SnakeNext->SnakeNext;
	while(p->SnakeNext)
	{
		if(snake->SnakeNext->x==p->x&&snake->SnakeNext->y==p->y)
		GameResult();		
		p=p->SnakeNext;
	}
}

//蛇的向上向下向左向右移动 
void SnakeUp(Snake &snake)
{
	Snake p=snake;
	int x1,y1,x2,y2;
	if(!SnakeEat(snake))
	{
		while(p->SnakeNext)p=p->SnakeNext;
		gotoxy(p->x,p->y);
		printf(" ");
		p=snake;
		x1=snake->SnakeNext->x;
		y1=snake->SnakeNext->y;
		y1--;
		while(p->SnakeNext)
		{
			x2=p->SnakeNext->x;y2=p->SnakeNext->y;
			p->SnakeNext->x=x1;p->SnakeNext->y=y1;
			x1=x2;y1=y2;
			p=p->SnakeNext;
		}
	}
	else{
		Snake val,temp;
		val=(Snake)malloc(sizeof(SNAKE));	
		val->x=snake->SnakeNext->x;
		val->y=snake->SnakeNext->y-1;
		temp=snake->SnakeNext;
		snake->SnakeNext=val;
		val->SnakeNext=temp;					
	}
	SnakeDead(snake);
	SnakeBody(snake);
}
void SnakeDown(Snake &snake)
{	
	int x1,y1,x2,y2;
	Snake p=snake;
	if(!SnakeEat(snake))
	{
		while(p->SnakeNext)p=p->SnakeNext;
		gotoxy(p->x,p->y);
		printf(" ");
		p=snake;
		x1=snake->SnakeNext->x;
		y1=snake->SnakeNext->y;
		y1++;
		while(p->SnakeNext)
		{
			x2=p->SnakeNext->x;y2=p->SnakeNext->y;
			p->SnakeNext->x=x1;p->SnakeNext->y=y1;
			x1=x2;y1=y2;
			p=p->SnakeNext;
		}
	}
	else{
		Snake val,temp;
		val=(Snake)malloc(sizeof(SNAKE));
		val->x=snake->SnakeNext->x;
		val->y=snake->SnakeNext->y+1;
		temp=snake->SnakeNext;
		snake->SnakeNext=val;
		val->SnakeNext=temp;	
	}
	SnakeDead(snake);
	SnakeBody(snake);
}
void SnakeLeft(Snake &snake)
{	
	Snake p=snake;
	int x1,y1,x2,y2;
	if(!SnakeEat(snake))
	{
		while(p->SnakeNext)p=p->SnakeNext;
		gotoxy(p->x,p->y);
		printf(" ");
		p=snake;
		x1=snake->SnakeNext->x;
		y1=snake->SnakeNext->y;
		x1--;
		while(p->SnakeNext)
		{
			x2=p->SnakeNext->x;y2=p->SnakeNext->y;
			p->SnakeNext->x=x1;p->SnakeNext->y=y1;
			x1=x2;y1=y2;
			p=p->SnakeNext;
		}
	}
	else{
		Snake val,temp;
		val=(Snake)malloc(sizeof(SNAKE));
		val->x=snake->SnakeNext->x-1;
		val->y=snake->SnakeNext->y;
		temp=snake->SnakeNext;
		snake->SnakeNext=val;
		val->SnakeNext=temp;
	}
	SnakeDead(snake);
	SnakeBody(snake);
}
void SnakeRight(Snake &snake)
{
	Snake p=snake;
	int x1,y1,x2,y2;
	if(!SnakeEat(snake))
	{
		while(p->SnakeNext)p=p->SnakeNext;
		gotoxy(p->x,p->y);
		printf(" ");
		p=snake;
		x1=snake->SnakeNext->x;
		y1=snake->SnakeNext->y;
		x1++;
		while(p->SnakeNext)
		{
			x2=p->SnakeNext->x;y2=p->SnakeNext->y;
			p->SnakeNext->x=x1;p->SnakeNext->y=y1;
			x1=x2;y1=y2;
			p=p->SnakeNext;
		}
	}
	else{
		Snake val,temp;
		val=(Snake)malloc(sizeof(SNAKE));
		val->x=snake->SnakeNext->x+1;
		val->y=snake->SnakeNext->y;
		temp=snake->SnakeNext;
		snake->SnakeNext=val;
		val->SnakeNext=temp;	
	}
	SnakeDead(snake);
	SnakeBody(snake);
}


//控制方向wasd 
void SnakeMove1(Snake &snake,bool model){
		char direction1='A';
		char direction2='D';//表示与蛇前进的反方向 
		bool a,b;		
	while(1){
		if(model){
			gotoxy(70,8);
			if(GameScore>=0&&GameScore<=15)
			{
				a=true;
				printf("第一关\n");
			}
			else if(GameScore>15&&GameScore<=30)
			{
				b=true;
				printf("第二关\n");		
			}
			else
			printf("第三关\n");
			
			gotoxy(70,10);
			printf("GameScore:%d",GameScore);
			
			if(GameScore>15&&GameScore<=30&&a){
				a=false;
				system("cls");
				gotoxy(40,5);
				printf("恭喜你第一关闯关成功\n"); 
				gotoxy(40,6);
				printf("即将进入第二关\n");
				Sleep(1000);
				break;
			}		
			else if(GameScore>30&&b){
				b=false;
				system("cls");
				gotoxy(40,5);
				printf("恭喜你第二关闯关成功\n"); 
				gotoxy(40,6);
				printf("即将进入第三关\n");
				Sleep(1000);
				break;
			}	
		}
		else{
				gotoxy(70,10);
				printf("GameScore:%d",GameScore);
			}
		Sleep(DifficultyLevel);
		if(kbhit())
		direction1=getch();
		if(direction1!=direction2)
		{
			switch(direction1){
				case 'W':direction2='S';SnakeUp(snake);break;
				case 'A':direction2='D';SnakeLeft(snake);break;
				case 'S':direction2='W';SnakeDown(snake);break;
				case 'D':direction2='A';SnakeRight(snake);break;	
			}
		}
		else
		{
			switch(direction1){
				case 'S':SnakeUp(snake);break;
				case 'D':SnakeLeft(snake);break;
				case 'W':SnakeDown(snake);break;
				case 'A':SnakeRight(snake);break;		
			}
		}
	}	
}

//控制方向的另一种方式 
void SnakeMove2(Snake &snake,bool model){				//上: 72 下:80  左:75  右:77 
	char direction1=75;
	char direction2=77;//表示与蛇前进的反方向 
	bool a,b;
	while(1){
		if(model){
			gotoxy(70,8);
			if(GameScore>=0&&GameScore<=15)
			{
				a=true;
				printf("第一关\n");
			}
			else if(GameScore>15&&GameScore<=30)
			{
				b=true;
				printf("第二关\n");		
			}
			else
			printf("第三关\n");
			
			gotoxy(70,10);
			printf("GameScore:%d",GameScore);
			
			if(GameScore>15&&GameScore<=30&&a){
				a=false;
				system("cls");
				gotoxy(40,5);
				printf("恭喜你第一关闯关成功\n"); 
				gotoxy(40,6);
				printf("即将进入第二关\n");
				Sleep(1000);
				break;
			}		
			else if(GameScore>30&&b){
				b=false;
				system("cls");
				gotoxy(40,5);
				printf("恭喜你第二关闯关成功\n"); 
				gotoxy(40,6);
				printf("即将进入第三关\n");
				Sleep(1000);
				break;
			}	
		}
		else{
				gotoxy(70,10);
				printf("GameScore:%d",GameScore);
			}
		Sleep(DifficultyLevel);
		if(kbhit())
		direction1=getch();
		if(direction1!=direction2)
		{
			switch(direction1){
				case 72:direction2=80;SnakeUp(snake);break;
				case 75:direction2=77;SnakeLeft(snake);break;
				case 80:direction2=72;SnakeDown(snake);break;
				case 77:direction2=75;SnakeRight(snake);break;	
			}
		}
		else
		{
			switch(direction1){
				case 80:SnakeUp(snake);break;
				case 77:SnakeLeft(snake);break;
				case 72:SnakeDown(snake);break;
				case 75:SnakeRight(snake);break;		
			}
		}
	}	
} 

#endif

最后:
 

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<windows.h>

#include"SnakeMap.h"
#include"SnakeOperate.h" 

#define LengthWall 50    //墙的长度 
#define WidthWall 25 	//墙的宽度 


//隐藏控制台的光标
void HiddenConsoleCursor(){
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO CursorInfo;
	GetConsoleCursorInfo(handle, &CursorInfo);	 //获取控制台光标信息
	CursorInfo.bVisible = false;				 //隐藏控制台光标
	SetConsoleCursorInfo(handle, &CursorInfo);   //设置控制台光标状态
}
int main(){	

	int n=0,nn=0,m=0,mm=0,t=0,tt=0;
	HiddenConsoleCursor();
	system("color F0");
	Snake snake=NULL;
	gotoxy(40,5);
	printf("贪吃蛇\n"); 
	gotoxy(40,7);
	printf("1:W A S D控制方向(此控制需要在大写形式下使用)\n");
	gotoxy(40,9);
	printf("2:←↑→↓控制方向\n");
	gotoxy(40,11);
	printf("请选择:\n");	
	gotoxy(40,12);
	scanf("%d",&n);
	switch(n){
		case 1:nn=1;break;
		case 2:nn=2;break;
	}
	srand((unsigned)time(NULL));
	
	system("cls");
	gotoxy(40,5);
	printf("贪吃蛇\n"); 
	gotoxy(40,7);
	printf("1:闯关模式\n");
	gotoxy(40,9);
	printf("2:休闲模式\n");
	gotoxy(40,11);
	printf("请选择:\n");
	gotoxy(40,12);
	scanf("%d",&m);
	switch(m){
		case 1:mm=1;DifficultyLevel=100;break;
		case 2:mm=2;break;
	}
	if(mm==1)
	{
		
		system("cls");
		FirstMap(snake);	
		SnakeFood(snake,food);	
		if(nn==1)
		SnakeMove1(snake,true);
		else if(nn==2)
		SnakeMove2(snake,true);
		
		system("cls");
		SecondMap(snake);	
		SnakeFood(snake,food);	
		if(nn==1)
		SnakeMove1(snake,true);
		else if(nn==2)
		SnakeMove2(snake,true);
		
		system("cls");
		ThirdMap(snake);	
		SnakeFood(snake,food);	
		if(nn==1)
		SnakeMove1(snake,true);
		else if(nn==2)
		SnakeMove2(snake,true);
		
	}
	if(mm==2)
	{
		system("cls");
		gotoxy(40,5);
		printf("贪吃蛇\n"); 
		gotoxy(40,6);
		printf("请选择地图:\n");
		gotoxy(40,8);
		printf("1:图一\n");
		gotoxy(40,10);
		printf("2:图二\n");
		gotoxy(40,12);
		printf("3:图三\n");
		gotoxy(40,14);
		printf("请选择:\n");
		gotoxy(40,15);
		scanf("%d",&t);
		switch(t){
			case 1:tt=1;break;
			case 2:tt=2;break;
			case 3:tt=3;break;
		}
		system("cls");
		gotoxy(40,5);
		printf("贪吃蛇\n"); 
		gotoxy(40,6);
		printf("请选择难度:\n");
		gotoxy(40,7);
		printf("1:手残党\n");
		gotoxy(40,8);
		printf("2:普通人类\n");
		gotoxy(40,9);
		printf("3:手指灵活\n");
		gotoxy(40,10);
		printf("4:非人类\n");
		gotoxy(40,11);
		printf("请选择:\n");
		gotoxy(40,12);
		scanf("%d",&n);
		switch(n){
			case 1:DifficultyLevel=200;break;
			case 2:DifficultyLevel=100;break;
			case 3:DifficultyLevel=50;break;
			case 4:DifficultyLevel=20;break;
		}
		system("cls");
		if(tt==1)
		FirstMap(snake);	
		else if(tt==2)
		SecondMap(snake);
		else if(tt==3)
		ThirdMap(snake);
		SnakeFood(snake,food);	
		if(nn==1)
		SnakeMove1(snake,false);
		else if(nn==2)
		SnakeMove2(snake,false);
	}	
	return 0;
}

以下是我游戏的运行图:

闯关模式

扫描二维码关注公众号,回复: 4999179 查看本文章

休闲模式

选着地图

选着难度

图一

图二

图三

猜你喜欢

转载自blog.csdn.net/qq_40935723/article/details/86553671
今日推荐