贪吃蛇 C++ 代码

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

 

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

 

 

 

缓冲设置

 

 

#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("GAME OVER!");
			}
			else if(map[Y+diry[Dir]][X+dirx[Dir]]==0x7fffffff)
			{		
				pos.X=34;
   	            pos.Y=16;  
	            SetConsoleCursorPosition(hOut, pos);
				printf("GAME OVER!");
			}
			else if(map[Y+diry[Dir]][X+dirx[Dir]]==101)
			{		
				pos.X=34;
   	            pos.Y=16;  
	            SetConsoleCursorPosition(hOut, pos);
				printf("GAME OVER!");
			}
			else
			{		
				pos.X=34;
   	            pos.Y=16;  
	            SetConsoleCursorPosition(hOut, pos);
				printf("GAME OVER!");
			}

			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);
	}
	


 

以下是一个简单的贪吃蛇 C++ 代码示例,使用了基本的控制台输入输出: ```c++ #include <iostream> #include <conio.h> #include <windows.h> using namespace std; bool GameOver; const int Width = 20; const int Height = 20; int x, y, fruitX, fruitY, score; int tailX[100], tailY[100]; int nTail; enum eDirection { STOP = 0, LEFT, RIGHT, UP, DOWN }; eDirection dir; void Setup() { GameOver = false; dir = STOP; x = Width / 2; y = Height / 2; fruitX = rand() % Width; fruitY = rand() % Height; score = 0; } void Draw() { system("cls"); for (int i = 0; i < Width + 2; i++) cout << "#"; cout << endl; for (int i = 0; i < Height; i++) { for (int j = 0; j < Width; j++) { if (j == 0) cout << "#"; if (i == y && j == x) cout << "O"; else if (i == fruitY && j == fruitX) cout << "F"; else { bool print = false; for (int k = 0; k < nTail; k++) { if (tailX[k] == j && tailY[k] == i) { cout << "o"; print = true; } } if (!print) cout << " "; } if (j == Width - 1) cout << "#"; } cout << endl; } for (int i = 0; i < Width + 2; i++) cout << "#"; cout << endl; cout << "Score: " << score << endl; } void Input() { if (_kbhit()) { switch (_getch()) { case 'a': dir = LEFT; break; case 'd': dir = RIGHT; break; case 'w': dir = UP; break; case 's': dir = DOWN; break; case 'x': GameOver = true; break; } } } void Logic() { int prevX = tailX[0]; int prevY = tailY[0]; int prev2X, prev2Y; tailX[0] = x; tailY[0] = y; for (int i = 1; i < nTail; i++) { prev2X = tailX[i]; prev2Y = tailY[i]; tailX[i] = prevX; tailY[i] = prevY; prevX = prev2X; prevY = prev2Y; } switch (dir) { case LEFT: x--; break; case RIGHT: x++; break; case UP: y--; break; case DOWN: y++; break; default: break; } if (x < 0 || x >= Width || y < 0 || y >= Height) GameOver = true; for (int i = 0; i < nTail; i++) if (tailX[i] == x && tailY[i] == y) GameOver = true; if (x == fruitX && y == fruitY) { score += 10; fruitX = rand() % Width; fruitY = rand() % Height; nTail++; } } int main() { Setup(); while (!GameOver) { Draw(); Input(); Logic(); Sleep(50); } return 0; } ``` 使用了 `_kbhit()` 和 `_getch()` 函数来检测键盘输入,利用了 Windows.h 库的 `Sleep()` 函数来控制游戏帧率。此外,还使用了两个数组来存储蛇的每一节身体的坐标,来实现蛇的移动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值