#include <windows.h> #include <stdlib.h> #include <conio.h> #include <time.h> #include <cstring> #include <cstdio> #include <iostream> #define N 22 using namespace std; int gameover; int x1, y1; // 隨機(jī)出米 int x,y; long start; //======================================= //類(lèi)的實(shí)現(xiàn)與應(yīng)用initialize //======================================= //下面定義貪吃蛇的坐標(biāo)類(lèi) class snake_position { public: int x,y; //x表示行,y表示列 snake_position(){}; void initialize(int &);//坐標(biāo)初始化 }; snake_position position[(N-2)*(N-2)+1]; //定義貪吃蛇坐標(biāo)類(lèi)數(shù)組,有(N-2)*(N-2)個(gè)坐標(biāo) void snake_position::initialize(int &j) { x = 1; y = j; } //下面定義貪吃蛇的棋盤(pán)圖 class snake_map { private: char s[N][N];//定義貪吃蛇棋盤(pán),包括墻壁。 int grade, length; int gamespeed; //前進(jìn)時(shí)間間隔 char direction; // 初始情況下,向右運(yùn)動(dòng) int head,tail; int score; bool gameauto; public: snake_map(int h=4,int t=1,int l=4,char d=77,int s=0):length(l),direction(d),head(h),tail(t),score(s){} void initialize(); //初始化函數(shù) void show_game(); int updata_game(); void setpoint(); void getgrade(); void display(); }; //定義初始化函數(shù),將貪吃蛇的棋盤(pán)圖進(jìn)行初始化 void snake_map::initialize() { int i,j; for(i=1;i<=3;i++) s[1][i] = '*'; s[1][4] = '#'; for(i=1;i<=N-2;i++) for(j=1;j<=N-2;j++) s[i][j]=' '; // 初始化貪吃蛇棋盤(pán)中間空白部分 for(i=0;i<=N-1;i++) s[0][i] = s[N-1][i] = '-'; //初始化貪吃蛇棋盤(pán)上下墻壁 for(i=1;i<=N-2;i++) s[i][0] = s[i][N-1] = '|'; //初始化貪吃蛇棋盤(pán)左右墻壁 } //============================================ //輸出貪吃蛇棋盤(pán)信息 void snake_map::show_game() { system("cls"); // 清屏 int i,j; cout << endl; for(i=0;i<N;i++) { cout << '\t'; for(j=0;j<N;j++) cout<<s[i][j]<<' '; // 輸出貪吃蛇棋盤(pán) if(i==2) cout << "\t等級(jí):" << grade; if(i==6) cout << "\t速度:" << gamespeed; if(i==10) cout << "\t得分:" << score << "分" ; if(i==14) cout << "\t暫停:按一下空格鍵" ; if(i==18) cout << "\t繼續(xù):按兩下空格鍵" ; cout<<endl; } } //輸入選擇等級(jí) void snake_map::getgrade() { cin>>grade; while( grade>7 || grade<1 ) { cout << "請(qǐng)輸入數(shù)字1-7選擇等級(jí),輸入其他數(shù)字無(wú)效" << endl; cin >> grade; } switch(grade) { case 1: gamespeed = 1000;gameauto = 0;break; case 2: gamespeed = 800;gameauto = 0;break; case 3: gamespeed = 600;gameauto = 0;break; case 4: gamespeed = 400;gameauto = 0;break; case 5: gamespeed = 200;gameauto = 0;break; case 6: gamespeed = 100;gameauto = 0;break; case 7: grade = 1;gamespeed = 1000;gameauto = 1;break; } } //輸出等級(jí),得分情況以及稱(chēng)號(hào) void snake_map::display() { cout << "\n\t\t\t\t等級(jí):" << grade; cout << "\n\n\n\t\t\t\t速度:" << gamespeed; cout << "\n\n\n\t\t\t\t得分:" << score << "分" ; } //隨機(jī)產(chǎn)生米 void snake_map::setpoint() { srand(time(0)); do { x1 = rand() % (N-2) + 1; y1 = rand() % (N-2) + 1; }while(s[x1][y1]!=' '); s[x1][y1]='*'; } char key; int snake_map::updata_game() { gameover = 1; key = direction; start = clock(); while((gameover=(clock()-start<=gamespeed))&&!kbhit()); //如果有鍵按下或時(shí)間超過(guò)自動(dòng)前進(jìn)時(shí)間間隔則終止循環(huán) if(gameover) { getch(); key = getch(); } if(key == ' ') { while(getch()!=' '){};//這里實(shí)現(xiàn)的是按空格鍵暫停,按空格鍵繼續(xù)的功能,但不知為何原因,需要按兩下空格才能繼續(xù)。這是個(gè)bug。 } else direction = key; switch(direction) { case 72: x= position[head].x-1; y= position[head].y;break; // 向上 case 80: x= position[head].x+1; y= position[head].y;break; // 向下 case 75: x= position[head].x; y= position[head].y-1;break; // 向左 case 77: x= position[head].x; y= position[head].y+1; // 向右 } if(!(direction==72||direction==80||direction==75 ||direction==77)) // 按鍵非方向鍵 gameover = 0; else if(x==0 || x==N-1 ||y==0 || y==N-1) // 碰到墻壁 gameover = 0; else if(s[x][y]!=' '&&!(x==x1&&y==y1)) // 蛇頭碰到蛇身 gameover = 0; else if(x==x1 && y==y1) { // 吃米,長(zhǎng)度加1 length ++; if(length>=8 && gameauto) { length -= 8; grade ++; if(gamespeed>=200) gamespeed -= 200; // 改變貪吃蛇前進(jìn)速度 else gamespeed = 100; } s[x][y]= '#'; //更新蛇頭 s[position[head].x][position[head].y] = '*'; //吃米后將原先蛇頭變?yōu)樯呱?/div> head = (head+1) % ( (N-2)*(N-2) ); //取蛇頭坐標(biāo) position[head].x = x; position[head].y = y; show_game(); gameover = 1; score += grade*20; //加分 setpoint(); //產(chǎn)生米 } else { // 不吃米 s[position[tail].x][position[tail].y]=' ';//將蛇尾置空 tail= (tail+1) % ( (N-2) * (N-2) );//更新蛇尾坐標(biāo) s[position[head].x][position[head].y]='*'; //將蛇頭更為蛇身 head= (head+1) % ( (N-2) * (N-2) ); position[head].x = x; position[head].y = y; s[position[head].x][position[head].y]='#'; //更新蛇頭 gameover = 1; } return gameover; } //==================================== //主函數(shù)部分 //==================================== int main() { char ctn = 'y'; int nodead; cout<<"\n\n\n\n\n\t\t\t 歡迎進(jìn)入貪吃蛇游戲!"<<endl;//歡迎界面; cout<<"\n\n\n\t\t\t 按任意鍵馬上開(kāi)始。。。"<<endl;//準(zhǔn)備開(kāi)始;; getch(); while( ctn=='y' ) { system("cls"); // 清屏 snake_map snake; snake.initialize(); cout << "\n\n請(qǐng)輸入數(shù)字選擇游戲等級(jí):" << endl; cout << "\n\n\n\t\t\t1.等級(jí)一:速度 1000 \n\n\t\t\t2.等級(jí)二:速度 800 \n\n\t\t\t3.等級(jí)三:速度 600 "; cout << "\n\n\t\t\t4.等級(jí)四:速度 400 \n\n\t\t\t5.等級(jí)五:速度 200 \n\n\t\t\t6.等級(jí)六:速度 100 \n\n\t\t\t7.自動(dòng)升級(jí)模式" << endl; snake.getgrade();//獲取等級(jí) for(int i=1;i<=4;i++) { position[i].initialize(i);//初始化坐標(biāo) } snake.setpoint(); // 產(chǎn)生第一個(gè)米 do { snake.show_game(); nodead = snake.updata_game(); }while(nodead); system("cls"); //清屏 cout << "\n\n\n\t\t\t\tGameover!\n\n"<<endl; snake.display();//輸出等級(jí)/得分情況 cout << "\n\n\n\t\t 是否選擇繼續(xù)游戲?輸入 y 繼續(xù),n 退出" << endl; cin >> ctn; } return 0; } |
|