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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章