还有一个 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