1. 程式人生 > >C 實現 貪吃蛇

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(); }