贪吃蛇 C++ 代码

//////////博客终于能用了。。。。。奉献小游戏一枚  纪念一年代码生涯  

 

  控制台缓冲要设置的大一点,否则无法正常显示

贪吃蛇 C++ 代码_第1张图片

 

动态闭幕效果

 

动态开幕效果

贪吃蛇 C++ 代码_第2张图片

 

正常显示是这样的

 

缓冲设置

贪吃蛇 C++ 代码_第3张图片

 

 

#include<iostream>
#include <conio.h>
#include<windows.h>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include <cstdlib>
#include <time.h>
#include <conio.h>
#include <queue>
using namespace std;

void color(int col)   
{
    HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE)); 
    SetConsoleTextAttribute(hConsole,col) ;
} 
inline void shuchu(int y,int x,int p)
{
	HANDLE hOut;
	COORD pos= {0, 0};
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	pos.X=x+x;
   	pos.Y=y;  
	SetConsoleCursorPosition(hOut, pos);
	if(p=='□')
	 printf("  ");
	else if(p=='■')
       printf("■");
	else if(p==2)
	{			        
		color(8);
		printf("●");	
		color(7);
	}
	else if(p==3)
	{          
		color(4);
		printf("●");	
		color(7);
	}
}
void chushihua(int map[][39])
{
	int i;
	for(i=0;i<39;i++)
	{
		map[0][i]=map[i][0]=map[38][i]=map[i][38]=0x7fffffff;
	}
	int j;
	for(i=1;i<38;i++)
		for(j=i;j<38;j++)
			map[i][j]=map[j][i]=0;

}
void xinxi(int y,int x,char*p)
{
	HANDLE hOut;
	COORD pos= {0, 0};
	hOut = GetStdHandle(STD_OUTPUT_HANDLE); 	
	pos.X=x;
   	pos.Y=y; 
	SetConsoleCursorPosition(hOut, pos);
    printf("%s",p);
	pos.X=0;
   	pos.Y=0; 
}
void xinxi2(int y,int x,int p)
{
	HANDLE hOut;
	COORD pos= {0, 0};
	hOut = GetStdHandle(STD_OUTPUT_HANDLE); 	
	pos.X=x;
   	pos.Y=y; 
	SetConsoleCursorPosition(hOut, pos);
    printf("%d  ",p);
	pos.X=0;
   	pos.Y=0; 
}
void showkuangjia()
{
	int i;
	HANDLE hOut;
	COORD pos= {0, 0};
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	for( i=0;i<39;i++)
    	printf("★");
	
	for(int j=1;j<38;j++)
	{
		pos.X=0;
    	pos.Y=j;  
		SetConsoleCursorPosition(hOut, pos);
    	printf("★");
		pos.X=76;
    	pos.Y=j;  
		SetConsoleCursorPosition(hOut, pos);
    	printf("★");
	}
	pos.X=0;
    pos.Y=38;  
	SetConsoleCursorPosition(hOut, pos);
	for(i=0;i<39;i++)
    	printf("★");
    xinxi(5,83,"采蘑菇的白娘子");
	xinxi(7,86,"得分");
	xinxi(8,87,"0      ");
	xinxi(10,83,"BY 青春微凉");
}

void bimu()
{
	int i,j;
	HANDLE hOut;
    COORD pos= {0, 0};
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	pos.X=2;
	for(i=1;i<38;i++)
	{
        pos.Y=i;
	    SetConsoleCursorPosition(hOut, pos);
    	for(j=1;j<38;j++)
		{
			printf("■");
			Sleep(1);
		}
	}
}

typedef struct	
{
	int x,y;
}node;

void kaimu(int map[][39])
{
	queue<node>que;
	int i,j;
	int dirx[]={0,1,1,1,0,-1,-1,-1};
	int diry[]={-1,-1,0,1,1,1,0,-1};
	map[19][19]=1;
	node now,next;
	now.x=19;
	now.y=19;
    que.push(now);
	while(!que.empty())
	{
		now=que.front();
		que.pop();
		shuchu(now.y,now.x,'□');
		Sleep(1);
		map[now.y][now.x]=1;
		for(i=0;i<8;i++)
		{
			next.x=now.x+dirx[i];
			next.y=now.y+diry[i];
			if(map[next.y][next.x]==0)
			{
				map[next.y][next.x]=1;
				que.push(next);
			}
		}
	}
}
void snakelocal(int* y,int* x,int*D,int map[][39])
{
    srand(time(0));
	*y=rand()%25+5;
	*x=rand()%25+5;
    *D=rand()%4;
	map[*y][*x]=100;
	shuchu(*y,*x,'■');
	if(*D==2)
	{
		map[*y-1][*x]=101;
    	shuchu(*y-1,*x,'■');
	}
	else if(*D==3)
	{
		map[*y][*x+1]=101;
    	shuchu(*y,*x+1,'■');
	}
	else if(*D==0)
	{
		map[*y+1][*x]=101;
    	shuchu(*y+1,*x,'■');
	}
	else
	{
		map[*y][*x-1]=101;
    	shuchu(*y,*x-1,'■');
	}
}
inline void yidong(int y,int x)
{
    shuchu(y,x,'■');
}
void quwei(int map[][39],int y,int x)
{	
    shuchu(y,x,'□');
	map[y][x]=1;
}
void DFS(int map[][39],int y,int x,int num)
{
	int dirx[]={0,1,0,-1};
	int diry[]={-1,0,1,0};
	int i;
	for(i=0;i<4;i++)
	{
		if(map[y+diry[i]][x+dirx[i]]==num)
		{ 
			map[y][x]=num;
			y+=diry[i];
			x+=dirx[i];
			DFS(map,y,x,num+1);
			return;	
		}
	}
	quwei(map,y,x);

}
void mogu(int map[][39])
{
    srand(time(0));
	int x,y;
	while(1)
	{
		x=rand()%29+5;
		y=rand()%29+5;
		if(map[y][x]<100)
		{
			map[y][x]=2;
			shuchu(y,x,2);
			return;
		}
	}

}
void DFS_add(int map[][39],int y,int x,int num)
{
	int dirx[]={0,1,0,-1};
	int diry[]={-1,0,1,0};
	int i;
	for(i=0;i<4;i++)
	{

		if(map[y+diry[i]][x+dirx[i]]==num)
		{ 
			map[y][x]=num;
			y+=diry[i];
			x+=dirx[i];
			DFS_add(map,y,x,num+1);
			return;	
		}
	}
	map[y][x]=num;
	shuchu(y,x,'■');
}
void dumogu(int map[][39])
{
	int i,j;
	for(i=1;i<39;i++)
		for(j=1;j<39;j++)
			if(map[i][j]==3)
			{
				map[i][j]=1;
                shuchu(i,j,'□');
			}
    srand(time(0));
	int x,y,k=0,tem=rand()%6+1;
	while(k++<tem)
	{
		x=rand()%29+5;
		y=rand()%29+5;
		if(map[y][x]==1)
		{
			map[y][x]=3;
			shuchu(y,x,3);
		}
	}
}
void kaishi(int map[][39],int Y,int X,int Dir,int ms)
{
	int dirx[]={0,1,0,-1};
	int diry[]={-1,0,1,0};
	int defen=0;
	queue<int>anjian;
	anjian.push(Dir);
	int kk=ms-'0'+1;
	ms=-30*(ms-'0')+300;

	while(1)
	{
		mogu(map);
		while(map[Y+diry[Dir]][X+dirx[Dir]]==1)
		{		
			if(GetAsyncKeyState(VK_UP))
			  anjian.push(0);
		   if(GetAsyncKeyState(VK_DOWN))
			  anjian.push(2);
	    	if(GetAsyncKeyState(VK_LEFT))	
			  anjian.push(3);
	      	if(GetAsyncKeyState(VK_RIGHT))	
			  anjian.push(1);

            if(map[Y+diry[Dir]][X+dirx[Dir]]>100)
				break;
			yidong(Y+diry[Dir],X+dirx[Dir]);
			DFS(map,Y,X,101);
			map[Y][X]=101;
			Y+=diry[Dir];
			X+=dirx[Dir];
			map[Y][X]=100;
			Sleep(ms);
			
			if(!anjian.empty())
			{
		    	Dir=anjian.front();
		    	anjian.pop();
			}
		}
		if(map[Y+diry[Dir]][X+dirx[Dir]]==2)
		{
			map[Y+diry[Dir]][X+dirx[Dir]]=100;	
			shuchu(Y+diry[Dir],X+dirx[Dir],'■');
			DFS_add(map,Y,X,101); 
			map[Y][X]=101;
			Y+=diry[Dir];
			X+=dirx[Dir];
			dumogu(map);
			defen=defen+5*kk;
			xinxi2(8,87,defen);

		}
		else
		{
			HANDLE hOut;
        	COORD pos= {0, 0};
        	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
			pos.X=34;
   	        pos.Y=15;  
	        SetConsoleCursorPosition(hOut, pos);
			color(4);
			printf("Game Over");
			if(map[Y+diry[Dir]][X+dirx[Dir]]==3)
			{		
				pos.X=34;
   	            pos.Y=16;  
	            SetConsoleCursorPosition(hOut, pos);
				printf("中毒身亡!");
			}
			else if(map[Y+diry[Dir]][X+dirx[Dir]]==0x7fffffff)
			{		
				pos.X=34;
   	            pos.Y=16;  
	            SetConsoleCursorPosition(hOut, pos);
				printf("撞墙身亡!");
			}
			else if(map[Y+diry[Dir]][X+dirx[Dir]]==101)
			{		
				pos.X=34;
   	            pos.Y=16;  
	            SetConsoleCursorPosition(hOut, pos);
				printf("折颈身亡!");
			}
			else
			{		
				pos.X=34;
   	            pos.Y=16;  
	            SetConsoleCursorPosition(hOut, pos);
				printf("自杀身亡!");
			}

			color(15);
			Sleep(1000);
        	pos.X=0;
   	        pos.Y=0;  
	        SetConsoleCursorPosition(hOut, pos);
         	return;
		}
	}
}
int main()
{
	int map[39][39];
	int ms;
	while(1)
	{
		chushihua(map);
    	showkuangjia();
    	bimu();
        xinxi(5,20,"红蘑菇是有毒的,千万不要碰哦!");
		xinxi(7,25,"请输入难度级别(0~9):");
		while(putchar(ms=getch()),ms<'0'||ms>'9')
		{
			xinxi(8,25,"输入错误,请重新输入:");
		}
    	kaimu(map);
    	int X,Y,Dir;
	    snakelocal(&Y,&X,&Dir,map);	
        kaishi(map,Y,X,Dir,ms);
	}
	


 

你可能感兴趣的:(算法)