C 实现 贪吃蛇

还有一个 MaxGrade.txt 文件记录最高分 创建一个即可

#include<iostream>
#include<windows.h>
#include<conio.h>
#include<cstdlib>
#include<ctime>
#include<fstream>
#include<cstring> 
#define High 20
#define Width 50 
using namespace std; 
/* -2为食物 & ; -1为边框 # ; 0为 空格 ; 1为蛇头 @; >1为蛇身 * ; */ 

/*全局声明变量*/ 
int Frames[High][Width]={0}; //界面大小
int MoveDirection;//移动方向 1,2,3,4  上下左右 
int Food_x,Food_y;//食物位置 
int MaxGrade;//最高分 
int Grade;//当前分数 
 
/*改善画面函数*/ 
void gotoxy(int x,int y);//光标移动到(x,y)位置 
void HideCursor();	//隐藏光标 

/*功能函数*/ 
void Are_you_ready();//准备界面 
void Initialize();//数据初始化 
void Show(); //显示画面  
void Move();//移动方向 
void KeyPlay();//键盘操作
void SaveMaxGrade();//保存最高分 

/*******主函数*******/
int main()
{
	HideCursor();//隐藏光标
	Initialize();//数据初始化 
	Are_you_ready();//准备界面 
	while(1)
	{
		Show();
		KeyPlay();//键盘操作
		Move();//移动操作
	} 
	SaveMaxGrade();//保存最高分
	return 0;
}
/*******************/ 

/*移动光标*/
void gotoxy(int x,int y)//光标移动到(x,y)位置  取代清屏 
{
	HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X=x;
	pos.Y=y;
	SetConsoleCursorPosition(handle,pos);
}
/*隐藏光标*/
void HideCursor()	 
{
 	CONSOLE_CURSOR_INFO cursor_info = {1, 0}; 
 	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
/*准备界面*/
void Are_you_ready()
{
	
	for(int i=4;i>=1;i--)
		{
			system("cls"); 
			cout<<"\n\n\n\t\t请使用方向键玩蛇!"; 
			if(i==1)
			{
				cout<<"\n\n\n\t\t\tGo!";
				Sleep(200);	
				return ;
			}
			cout<<"\n\n\n\t\t\t"<<i-1;
			Sleep(1000);
		}
} 
/*数据初始化*/
void Initialize()
{ 
	//分数初始化
	ifstream fin("MaxGrade.txt");
	if(!fin)
	{
		cout<<"MaxGrade.txt 文件打开失败!\n";
		exit(2);
	} 
	fin>>MaxGrade;
	fin.close();
	Grade=0; 
	//边框初始化 # 
	int i,j;
	for(i=0;i<High;i++)
	{
		Frames[i][0]=-1;
		Frames[i][Width-1]=-1;
	}
	for(j=0;j<Width;j++)
	{
		Frames[0][j]=-1;
		Frames[High-1][j]=-1;
	} 
	//蛇初始化 
	for(i=1;i<=5;i++)
	{
		Frames[High/2][Width/2-i]=i; 
	} 
	//移动方向初始化向右 
	MoveDirection = 4;
	//食物位置初始化 
	srand((int)time(NULL));
	do
	{
		Food_x=rand()%(High-5)+4;
		Food_y=rand()%(Width-5)+3;
		//判断食物与蛇是否重合 
		if(Frames[Food_x][Food_y]==0)
		{
			Frames[Food_x][Food_y]=-2;
			break;
		}
	}while(1);
}
/*显示画面*/
void Show() 
{ 
	gotoxy(0,0);//移动光标至初始0,0位置 
	for(int i=0;i<High;i++)
	{
		for(int j=0;j<Width;j++)
		{
			if(Frames[i][j]==-1)
			{
				cout<<"#";//-1为边框 # 
				//SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY);
			}
			else if(Frames[i][j]==0)
			{
				cout<<" ";//0为 空格 
			}
			else if(Frames[i][j]==1)
			{
				cout<<"@";//1为蛇头 @ 
			}
			else if(Frames[i][j]>1)
			{
				cout<<"*";//大于1的正整数为蛇身 * 
				//SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);//红色 
			}
			else if(Frames[i][j]==-2)
			{
				cout<<"&";//-2为食物 &  
			} 
		}
		cout<<endl;
	}
	if(Grade>MaxGrade)
	{
		cout<<"\n\n\n★当前得分: "<<Grade<<"\t★最高分:"<<Grade<<endl;
	}
	else
	{
		cout<<"\n\n\n★当前得分: "<<Grade<<"\t★最高分:"<<MaxGrade<<endl;
	}
	cout<<"\n\n\n★按空格暂停\t★按Esc键退出游戏\n";
	if(Grade >= 100&&Grade < 200)
	{
		Sleep(40);
	} 
	else if(Grade >=200 && Grade <300)
	{
		Sleep(25);
	}
	else if(Grade >=300)
	{
		Sleep(10);
	}
	else
	{
		Sleep(50);//刷新速度 
	}
	
} 
/*移动*/
void Move() 
{
	int i,j,max=0;
	int OldTail_i,OldTail_j;//记录旧蛇尾 
	int OldHead_i,OldHead_j;//记录旧蛇头 
	for(i=1;i<High-1;i++)
	{
		for(j=1;j<Width-1;j++)
		{
			if(Frames[i][j]>0)
			{
				//对所有大于0的元素+1 
				Frames[i][j]++;
				//记录旧蛇尾位置 
				if(Frames[i][j]>max)
				{
					max=Frames[i][j];
					OldTail_i=i;
					OldTail_j=j;
				} 
				//记录旧蛇头位置 
				if(Frames[i][j]==2)
				{
					OldHead_i=i;
					OldHead_j=j;	
				} 
			}
		}
	} 
	
	int NewHead_i,NewHead_j; //新蛇头 
	if(MoveDirection==1)//向上 
	{
		NewHead_i=OldHead_i-1;
		NewHead_j=OldHead_j; 
	} 
	if(MoveDirection==2)//向下 
	{
		NewHead_i=OldHead_i+1;
		NewHead_j=OldHead_j;
	} 
	if(MoveDirection==3)//向左 
	{
		NewHead_i=OldHead_i;
		NewHead_j=OldHead_j-1; 
	} 
	if(MoveDirection==4)//向右 
	{
		NewHead_i=OldHead_i;
		NewHead_j=OldHead_j+1;
	} 
	//判断蛇头是否吃到食物
	if(Frames[NewHead_i][NewHead_j]==-2)
	{
		Frames[Food_x][Food_y]=0;//食物变为空格 
		Grade+=10; //分数加10 
		do
		{
		Food_x = rand()%(High-5)+4;
		Food_y = rand()%(Width-5)+3;
		//判断食物与蛇是否重合 
		if(Frames[Food_x][Food_y]==0)
		{
			Frames[Food_x][Food_y] = -2;//产生食物
			break;
		}
		}while(1); 
	}
	else//未吃到长度不变 
	{
		Frames[OldTail_i][OldTail_j] = 0;//最大元素变为0==空格
	}
	//判断蛇头撞到自身或墙壁,游戏失败
	if(Frames[NewHead_i][NewHead_j]>0||Frames[NewHead_i][NewHead_j]==-1)
	{
		system("cls"); 
		cout<<"\n\n\n\t\t\tGame Over!\n\n\n\n\n\n\n";
		Sleep(2000);
		system("cls");
		cout<<"\n\n\n\t\t\t您的分数:"<<Grade<<endl;
		if(Grade>MaxGrade) 
		{
			cout<<"\t\t\t!新纪录!\n";
			SaveMaxGrade();//保存最高分
		}
		Sleep(500);
		system("pause");
		exit(0);
	} 
	else//正常操作 
	{
		Frames[NewHead_i][NewHead_j]=1;
	}
	
} 
/*键盘操作*/
void KeyPlay()
{
	if(kbhit())//判断是否有输入
	{
		switch(getch())
		{
		case 224:
			switch(getch())
			{
				case 72:
					if(MoveDirection==1||MoveDirection==2)//下同,判断方向,是否为正在行进方向 
						break;
					MoveDirection = 1;break;//上 
				case 80:
					if(MoveDirection==1||MoveDirection==2)
						break;
					MoveDirection = 2;break;//下 
				case 75:
					if(MoveDirection==3||MoveDirection==4)
						break;
					MoveDirection = 3;break;//左 
				case 77:
					if(MoveDirection==3||MoveDirection==4)
						break;
					MoveDirection = 4;break;//右 
			}
			break;
		case 27://退出(Esc) 
			system("cls");//清屏
			cout<<"\n\n\n\n\t\t\t☆★退出游戏★☆\n\n\n\n";
			exit(0);
		case 32://空格(Space)
			system("cls");//清屏
			cout<<"\n\n\n\n\t\t\t☆★暂停★☆\n\n\n\n";
			cout<<"\n\n\t\t\t";
			system("pause"); 
			system("cls");
			break; 
		}	
	}  
}
/*保存最高分*/
void SaveMaxGrade()
{
	ofstream fout("MaxGrade.txt");
	if(!fout)
	{
		cout<<"MaxGrade.txt 文件打开失败\n";
		exit(2);
	}
	MaxGrade=Grade;
	fout<<MaxGrade;
	fout.close();
}

参考网站
https://study.163.com/course/introduction.htm?courseId=1004489035

猜你喜欢

转载自blog.csdn.net/qq_39906884/article/details/83548828