C++ 双人贪吃蛇
這篇代碼基于博主的“C++ 貪吃蛇基本算法”,加入第二只蛇讓他移動并不難,但考慮到要讓兩只蛇的移動互不干擾那還真是破事真多。博主將“C++ 貪吃蛇基本算法”中的while(1)改成了goto,以用來將兩條蛇的計數(shù)器分開,并加入了變量“move”來判斷按鍵是操縱誰。在這篇代碼中,switch()函數(shù)可能閱讀起來非常困難,因為蛇2輸入的按鍵與地圖上的字符不匹配,所以這篇代碼看起來并不是很明了。由于太麻煩,所以我設定成只要一條蛇GG游戲就GG。事實上改變蛇頭的顏色并不是很難,但我實在懶。
#include <iostream> #include <windows.h> #include <cstring> #include <time.h> #include <conio.h> using namespace std;int error1(char x,char y) {if(x<y)if((y-x==3)||(y-x==4))return 1;if(x>y)if((x-y==3)||(x-y==4))return 1;if(x==y)return 1;return 0; } int error2(char x,char y) {if(x<y)if(y-x==2)return 1;if(x>y)if(x-y==2)return 1;if(x==y)return 1;return 0; } //糾正強行自噬 int Pos(long x,long y) {HANDLE direct=GetStdHandle(STD_OUTPUT_HANDLE);COORD pos={x,y};SetConsoleCursorPosition(direct,pos); } //改變光標位置int Color(long clr) {HANDLE direct=GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(direct,clr); } //改變輸出顏色 int Show(long judge) {HANDLE direct=GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO cci;GetConsoleCursorInfo(direct,&cci);cci.bVisible=judge;SetConsoleCursorInfo(direct,&cci); } //是否顯示光標 int main() {char map[15][18];char Key1,Keys1,Key2,Keys2,Key;long xh1,yh1,xt1,yt1,start1,timeover1;long xh2,yh2,xt2,yt2,start2,timeover2;long xm,ym,level,move;long X,Y;memset(map,' ',sizeof(map));for(long i=0;i<=14;i++){if((i==0)||(i==14))for(long j=0;j<=17;j++) map[i][j]='b'; elsemap[i][0]=map[i][17]='b';}//地圖初始化 xh1=7,yh1=9;xt1=7,yt1=8;map[xt1][yt1]='d';map[xh1][yh1]='h';//蛇1初始化 xh2=4,yh2=9;xt2=4,yt2=8;map[xt2][yt2]='D';map[xh2][yh2]='H';//蛇2初始化 for(long i=1;i<=2;i++){srand(time(0));do{xm=rand()%13+1;ym=rand()%16+1;}while(map[xm][ym]!=' ');map[xm][ym]='m'; }//出米 Pos(22,8);cout<<"please input the level(1-8): ";cin>>level; //輸入等級Show(0);X=20;Y=3;Pos(X,Y);for(long i=0;i<=14;i++){for(long j=0;j<=17;j++){switch(map[i][j]){case 'b':Color(0x02);cout<<"■";Color(0x0F); break;case 'w':case 'a':case 's':case 'd':case 'h':Color(0x01);cout<<"■";Color(0x0F);break;case 'W':case 'A':case 'S':case 'D':case 'H':Color(0x04);cout<<"■";Color(0x0F);break;case 'm':Color(0x03);cout<<"■";Color(0x0F); break;case ' ':cout<<" ";break;}}Y++;Pos(X,Y);}//輸出棋盤 Key1='d';Key2='l';timeover1=1;timeover2=1;start1=clock();start2=clock();move=0;loop:while((timeover1=(clock()-start1<=(900-level*100)))&&(timeover2=(clock()-start2<=(900-level*100)))&&!kbhit());if(timeover1&&timeover2){Key=getch();switch(Key){case 'W':case 'w':case 'S':case 's':case 'A':case 'a':case 'D':case 'd':Keys1=Key1;Key1=Key;move=1;break;case 'I':case 'i':case 'K':case 'k':case 'J':case 'j':case 'L':case 'l':Keys2=Key2;Key2=Key;move=2;break;}if(move==1)if(error1(Key1,Keys1)){Key1=Keys1;goto loop;}if(move==2)if(error2(Key2,Keys2)){Key2=Keys2;goto loop;} }//判斷按鍵歸屬 if(move==1||!timeover1){switch(Key1){case 'W':case 'w':map[xh1][yh1]='w';xh1--;break;case 'S':case 's':map[xh1][yh1]='s';xh1++;break;case 'A':case 'a':map[xh1][yh1]='a';yh1--;break;case 'D':case 'd':map[xh1][yh1]='d';yh1++;break;}}if(move==2||!timeover2){switch(Key2){case 'I':case 'i':map[xh2][yh2]='W';xh2--;break;case 'K':case 'k':map[xh2][yh2]='S';xh2++;break;case 'J':case 'j':map[xh2][yh2]='A';yh2--;break;case 'L':case 'l':map[xh2][yh2]='D';yh2++;break;}}//依照歸屬進行操縱 if(move==1||!timeover1){if(map[xh1][yh1]!=' '&&map[xh1][yh1]!='m'){Pos(30,18);cout<<"GameOver1";return 0;} }if(move==2||!timeover2){if(map[xh2][yh2]!=' '&&map[xh2][yh2]!='m'){Pos(30,18);cout<<"GameOver2";return 0;} } //游戲結(jié)束 if(move==1||!timeover1){X=20+yh1*2;Y=3+xh1;Pos(X,Y);Color(0x01); cout<<"■"; Color(0x0F);if(map[xh1][yh1]=='m'){map[xh1][yh1]='h';srand(time(0));do{xm=rand()%13+1;ym=rand()%16+1;}while(map[xm][ym]!=' ');map[xm][ym]='m';X=20+ym*2;Y=3+xm;Pos(X,Y);Color(0x03);cout<<"■";Color(0x0F);//出米 } else{map[xh1][yh1]='h';X=20+yt1*2;Y=3+xt1;Pos(X,Y); cout<<" ";switch(map[xt1][yt1]){case 'w':map[xt1][yt1]=' ';xt1--;break;case 's':map[xt1][yt1]=' ';xt1++;break;case 'a':map[xt1][yt1]=' ';yt1--;break;case 'd':map[xt1][yt1]=' ';yt1++;break;}} //移動蛇1頭與尾 move=0;timeover1=1;start1=clock();goto loop;//回到開始 }if(move==2||!timeover2){X=20+yh2*2;Y=3+xh2;Pos(X,Y); Color(0x04); cout<<"■"; Color(0x0F);if(map[xh2][yh2]=='m'){map[xh2][yh2]='H';srand(time(0));do{xm=rand()%13+1;ym=rand()%16+1;}while(map[xm][ym]!=' ');map[xm][ym]='m';X=20+ym*2;Y=3+xm;Pos(X,Y);Color(0x03);cout<<"■";Color(0x0F);//出米 } else{map[xh2][yh2]='H';X=20+yt2*2;Y=3+xt2;Pos(X,Y); cout<<" ";switch(map[xt2][yt2]){case 'W':map[xt2][yt2]=' ';xt2--;break;case 'S':map[xt2][yt2]=' ';xt2++;break;case 'A':map[xt2][yt2]=' ';yt2--;break;case 'D':map[xt2][yt2]=' ';yt2++;break;}} //移動蛇2頭與尾 move=0;timeover2=1;start2=clock();goto loop; //回到開始 }}總結(jié)
- 上一篇: minecraft服务器搭建教程_Min
- 下一篇: 极客时间学习笔记