C 實現 貪吃蛇
阿新 • • 發佈:2019-01-28
還有一個 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();
}