贪吃蛇c++

贪吃蛇

代码很容易理解,循环与函数。

#include<bits/stdc++.h>
#include<conio.h>
#include<windows.h>

用这些库。

int vb=3,endx,endy,foodx,n[250]={15,16,17},m[250]={34,34,34},foody,tim=170,h,v[30][100],j,i,x=3;
char d,df;
bool c;

x存储蛇身长度。endx和endy存蛇尾坐标。tim是每次刷新蛇身的毫秒数。v数组是地图 v中1代表蛇身,2代表食物。i,j 循环。n,m都是存蛇身坐标。

void go(int x,int y) 
{
    COORD pos={y,x};
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOut,pos);
}
void cv(unsigned int ForeColor=7,unsigned int BackGroundColor=0)
{
	HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(handle,ForeColor+BackGroundColor*0x10);
}

这两个函数是上网抄的,go是把光标移动到x,y这个位置。cv是更改输出的字体及背景颜色。

具体看gotoxy以及background

void prinf()
{
	if(tim<=140&&tim>=101) 
	{
		cv(6,5);
		go(4,103);
		cout<<"  ";
		go(4,103);
		cout<<"中";
	}
	if(tim<=100&&tim>=65) 
	{
		cv(6,5);
		go(4,103);
		cout<<"  ";
		go(4,103);
		cout<<"高";
	}
	if(tim<=64&&tim>=15) 
	{
		cv(6,5);
		go(4,103);
		cout<<"  ";
		go(4,103);
		cout<<"大";
		go(5,103);
		cout<<"   ";
		go(5,103);
		cout<<"师";
		go(6,103);
		cout<<"级"; 
	}
	if(tim<15)
	{
		system("cls");
		go(14,42);
		cout<<"恭 喜 !游 戏 成 功 !";
	}
	if(x%3==0&&x!=vb&&x!=3) tim-=12;
	//tim是移动一次的时间间隔,单位是ms,随着等级增大而减小
	cv(1,7);
	for(i=0;i<30;i++)
	{
		for(j=0;j<99;j++)
		{
			if(v[i][j]==1)
			{
				go(i,j);
				cout<<"█"; 
			}
		}
	} 
	go(29,102);
}
void wei()
{
	v[n[x-1]][m[x-1]]=0;//v里的蛇尾=0
	go(n[x-1],m[x-1]);
	cv(0,7);
	cout<<"  ";//清除蛇尾
}
void food()
{	
	srand(time(NULL));//设置时间种子
	while(1)
	{
		foodx=rand()%28+0;//产生随机的食物坐标x
		foody=rand()%95+0;//产生随机的食物坐标y
		c=false;//标记c
		for(int l=0;l<x;l++)
		{
			if(n[l]==foodx&&m[l]==foody) 
			{
				c=true;
				break;
			}
		}//判断食物是否出现在蛇身上
		if(c==false) break;
	}
	if(foody%2==0) foody++;//因为食物●占两列,所以foody必须是奇数
	v[foodx][foody-1]=2;
	go(foodx,foody-1);
	cv(4,7);
	cout<<"●";//输出食物
}
void qiang()
{
	system("cls");
	go(14,43);
	cout<<"撞 墙 !游 戏 结 束 !";
	go(16,49);
	cout<<"得 分 :"<<x;
	go(27,0);
} 

一些有关游戏功能的函数。

int main()
{
	system("color 71");
	cv(6,5);
	go(1,103);
	cout<<"级";
	go(2,103);
	cout<<"别";
	go(3,103);
	cout<<"  ";
	go(4,103);
	cout<<"初";
	go(5,103);
	cout<<"级";
	for(i=0;i<=100;i++) 
	{
		cv(1,2);
		go(28,i);
		cout<<" ";
	}
	for(i=0;i<=28;i++)
	{
		cv(1,2);
		go(i,100);
		cout<<"  ";
	}
	v[17][34]=1;
	v[16][34]=1;
	v[15][34]=1;
	for(i=0;i<29;i++)
	{
		for(j=0;j<95;j++)
		{
			if(v[i][j]==1) 
			{
				cv(3,7);
				go(i,j);
				cout<<"█";
			}
		}
	}
	go(15,34);
	food();
}

这段不难理解,v中1是蛇身,用food函数随机生出食物坐标。
先写一个无限循环,用来每次打印蛇身。

while(1)
{
	while(kbhit()==0)//监控键盘
	{
		//这里面打印蛇身并进行更新
	}
	d=getch();//读取键盘上的数(不回显)
	df=d;
	d=0;
}

具体写一下就是:

	while(1)
	{
		while(kbhit()==0)
		{
			vb=x;//蛇的长度
			switch(df)//用switch判断df也就是每次的方向
			{
			case 72: //72是“↑”的键盘扫描码
				if(v[n[0]-1][m[0]]!=2)//如果没吃到食物
				wei();//删除蛇尾
				endx=n[x-1];
				endy=m[x-1];
				for(int qwe=x-1;qwe>=1;qwe--) n[qwe]=n[qwe-1];
				for(int qwe=x-1;qwe>=1;qwe--) m[qwe]=m[qwe-1];
				//这两个for是刷新n和m数组,变成新的蛇身坐标,增加蛇头
				if(v[n[0]-1][m[0]]==2)//如果吃到食物
				{
					x++;//蛇身长度++
					n[x-1]=endx;
					m[x-1]=endy;//这两句是新加蛇尾
					food();//刷新食物
				}
				if(n[0]-1<0)//判断是否撞墙
				{
					qiang();//执行游戏结束
					if(kbhit!=0)//如果按下了任意键
					return 0;//结束程序
				}
				if(v[n[0]-1][m[0]]==1)//如果吃到了自己
				{
					ziji();//执行游戏结束
					return 0;//结束游戏
				 }
				v[--n[0]][m[0]]=1;//新的蛇头
				break;
			case 80: //80是“↓”的键盘扫描码
				if(v[n[0]+1][m[0]]!=2)
				wei();
				endx=n[x-1];
				endy=m[x-1];
				for(int qwe=x-1;qwe>=1;qwe--) n[qwe]=n[qwe-1];
				for(int qwe=x-1;qwe>=1;qwe--) m[qwe]=m[qwe-1];
				if(v[n[0]+1][m[0]]==2)
				{
					x++;
					n[x-1]=endx;
					m[x-1]=endy;
					food();
				}
				if(n[0]==27)
				{
					qiang();
					if(kbhit!=0)
					return 0;
				}
				if(v[n[0]+1][m[0]]==1)
				{
					ziji();
					if(kbhit!=0)
					return 0;
				 }
				v[++n[0]][m[0]]=1;
				break;
			case 75: //75是“←”的键盘扫描码
				if(v[n[0]][m[0]-2]!=2)
				wei();
				endx=n[x-1];
				endy=m[x-1];
				for(int qwe=x-1;qwe>=1;qwe--) n[qwe]=n[qwe-1];
				for(int qwe=x-1;qwe>=1;qwe--) m[qwe]=m[qwe-1];
				if(v[n[0]][m[0]-2]==2)
				{
					x++;
					n[x-1]=endx;
					m[x-1]=endy;
					food();
				}
				if(m[0]-1<0)
				{
					qiang();
					if(kbhit!=0)
					return 0;
				}
				if(v[n[0]][m[0]-2]==1)
				{
					ziji();
					if(kbhit!=0)
					return 0;
				 }
				m[0]-=2;
				v[n[0]][m[0]]=1;
				break;
			case 77: //77是“→”的键盘扫描码
				if(v[n[0]][m[0]+2]!=2)
				wei();
				endx=n[x-1];
				endy=m[x-1];
				for(int qwe=x-1;qwe>=1;qwe--) n[qwe]=n[qwe-1];
				for(int qwe=x-1;qwe>=1;qwe--) m[qwe]=m[qwe-1];
				if(v[n[0]][m[0]+2]==2)
				{
					x++;
					n[x-1]=endx;
					m[x-1]=endy;
					food();
				}
				if(m[0]+2==100)//因为蛇身██占两个位置,所以是加2
				{
					qiang();
					if(kbhit!=0)
					return 0;
				}
				if(v[n[0]][m[0]+2]==1)
				{
					ziji();
					if(kbhit!=0)
					return 0;
				 }
				m[0]+=2;
				v[n[0]][m[0]]=1;
				break;
			}
			//现在这里在switch外面
			prinf();//打印新蛇,并且判断现在的等级、速度
			Sleep(tim);//停歇tim毫秒
		}
		d=getch();
		df=d;
		d=0;
	}

接下来把各个代码块合起来。

#include<bits/stdc++.h>
#include<conio.h>
#include<windows.h>
using namespace std;
int vb=3,endx,endy,foodx,n[250]={15,16,17},m[250]={34,34,34},foody,tim=170,h,v[30][100],j,i,x=3;
char d,df;
bool c;
void go(int x,int y) 
{
    COORD pos={y,x};
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOut,pos);
}
void cv(unsigned int ForeColor=7,unsigned int BackGroundColor=0)
{
	HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(handle,ForeColor+BackGroundColor*0x10);
}
void ziji()
{
	system("cls");
	go(14,40);
	cout<<"吃 到 自 己 !游 戏 结 束 !";
	go(16,48);
	cout<<"得 分 :"<<x;
	go(27,0);
 } 
void prinf()
{
	if(tim<=140&&tim>=101) 
	{
		cv(6,5);
		go(4,103);
		cout<<"  ";
		go(4,103);
		cout<<"中";
	}
	if(tim<=100&&tim>=65) 
	{
		cv(6,5);
		go(4,103);
		cout<<"  ";
		go(4,103);
		cout<<"高";
	}
	if(tim<=64&&tim>=15) 
	{
		cv(6,5);
		go(4,103);
		cout<<"  ";
		go(4,103);
		cout<<"大";
		go(5,103);
		cout<<"   ";
		go(5,103);
		cout<<"师";
		go(6,103);
		cout<<"级"; 
	}
	if(tim<15)
	{
		system("cls");
		go(14,42);
		cout<<"恭 喜 !游 戏 成 功 !";
	}
	if(x%3==0&&x!=vb&&x!=3) tim-=12;
	cv(1,7);
	for(i=0;i<30;i++)
	{
		for(j=0;j<99;j++)
		{
			if(v[i][j]==1)
			{
				go(i,j);
				cout<<"█"; 
			}
		}
	} 
	go(29,102);
}
void wei()
{
	v[n[x-1]][m[x-1]]=0;
	go(n[x-1],m[x-1]);
	cv(0,7);
	cout<<"  ";
}
void food()
{	
	srand(time(NULL));
	for(int ll=0;;ll++)
	{
		foodx=rand()%28+0;
		foody=rand()%95+0;
		c=false;
		for(int l=0;l<x;l++)
		{
			if(n[l]==foodx&&m[l]==foody) 
			{
				c=true;
				break;
			}
		}
		if(c==false) break;
	}
	if(foody%2==0) foody++;
	v[foodx][foody-1]=2;
	go(foodx,foody-1);
	cv(4,7); 
	cout<<"●";
}
void qiang()
{
	system("cls");
	go(14,43);
	cout<<"撞 墙 !游 戏 结 束 !";
	go(16,49);
	cout<<"得 分 :"<<x;
	go(27,0);
} 
int main()
{
	system("color 71");
	cv(6,5);
	go(1,103);
	cout<<"级";
	go(2,103);
	cout<<"别";
	go(3,103);
	cout<<"  ";
	go(4,103);
	cout<<"初";
	go(5,103);
	cout<<"级";
	for(i=0;i<=100;i++) 
	{
		cv(1,2);
		go(28,i);
		cout<<" ";
	}
	for(i=0;i<=28;i++)
	{
		cv(1,2);
		go(i,100);
		cout<<"  ";
	}
	v[17][34]=1;
	v[16][34]=1;
	v[15][34]=1;
	for(i=0;i<29;i++)
	{
		for(j=0;j<95;j++)
		{
			if(v[i][j]==1) 
			{
				cv(3,7);
				go(i,j);
				cout<<"█";
			}
		}
	}
	go(15,34);
	food();
	while(1)
	{
		while(kbhit()==0)
		{
			vb=x;
			switch(df)
			{
			case 72:
				if(v[n[0]-1][m[0]]!=2)
				wei();
				endx=n[x-1];
				endy=m[x-1];
				for(int qwe=x-1;qwe>=1;qwe--) n[qwe]=n[qwe-1];
				for(int qwe=x-1;qwe>=1;qwe--) m[qwe]=m[qwe-1];
				if(v[n[0]-1][m[0]]==2)
				{
					x++;
					n[x-1]=endx;
					m[x-1]=endy;
					food();
				}
				if(n[0]-1<0) 
				{
					qiang();
					if(kbhit!=0)
					return 0;
				}
				if(v[n[0]-1][m[0]]==1)
				{
					ziji();
					return 0;
				 }
				v[--n[0]][m[0]]=1;
				break;
			case 80:
				if(v[n[0]+1][m[0]]!=2)
				wei();
				endx=n[x-1];
				endy=m[x-1];
				for(int qwe=x-1;qwe>=1;qwe--) n[qwe]=n[qwe-1];
				for(int qwe=x-1;qwe>=1;qwe--) m[qwe]=m[qwe-1];
				if(v[n[0]+1][m[0]]==2)
				{
					x++;
					n[x-1]=endx;
					m[x-1]=endy;
					food();
				}
				if(n[0]==27)
				{
					qiang();
					if(kbhit!=0)
					return 0;
				}
				if(v[n[0]+1][m[0]]==1)
				{
					ziji();
					if(kbhit!=0)
					return 0;
				 }
				v[++n[0]][m[0]]=1;
				break;
			case 75:
				if(v[n[0]][m[0]-2]!=2)
				wei();
				endx=n[x-1];
				endy=m[x-1];
				for(int qwe=x-1;qwe>=1;qwe--) n[qwe]=n[qwe-1];
				for(int qwe=x-1;qwe>=1;qwe--) m[qwe]=m[qwe-1];
				if(v[n[0]][m[0]-2]==2)
				{
					x++;
					n[x-1]=endx;
					m[x-1]=endy;
					food();
				}
				if(m[0]-1<0)
				{
					qiang();
					if(kbhit!=0)
					return 0;
				}
				if(v[n[0]][m[0]-2]==1)
				{
					ziji();
					if(kbhit!=0)
					return 0;
				 }
				m[0]-=2;
				v[n[0]][m[0]]=1;
				break;
			case 77:
				if(v[n[0]][m[0]+2]!=2)
				wei();
				endx=n[x-1];
				endy=m[x-1];
				for(int qwe=x-1;qwe>=1;qwe--) n[qwe]=n[qwe-1];
				for(int qwe=x-1;qwe>=1;qwe--) m[qwe]=m[qwe-1];
				if(v[n[0]][m[0]+2]==2)
				{
					x++;
					n[x-1]=endx;
					m[x-1]=endy;
					food();
				}
				if(m[0]+2==100)
				{
					qiang();
					if(kbhit!=0)
					return 0;
				}
				if(v[n[0]][m[0]+2]==1)
				{
					ziji();
					if(kbhit!=0)
					return 0;
				 }
				m[0]+=2;
				v[n[0]][m[0]]=1;
				break;
			}
			prinf();
			Sleep(tim);
		}
		d=getch();
		df=d;
		d=0;
	}
}

游戏截图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
蓦然回首,那蛇却在灯火阑珊处。
眉间盈盈,码量如蚁。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值