日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言双人贪吃蛇

發布時間:2023/12/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言双人贪吃蛇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

其實我寫的博客,主要還是給自己看的吧,讓自己隨時隨地可以查閱。不都說,這篇是貪吃蛇的。希望能給看到的萌新小伙伴一點啟發吧,也歡迎大佬指點。
貪吃蛇主要有以下幾個問題:
1.地圖如何產生?
2.蛇如何畫?蛇尾巴如何在每次吃到食物的時候自增一格?蛇的移動如何實現?
3.如何判定蛇的狀態,即吃到食物還是撞到障礙物?

1.對于第一個問題,實際上比較容易解決,就是利用一個二維數組,通過不同的值來打印出不同的圖案。比如一個3*2的二維數組,1 1 1
1 0 1
1 1 1 然后再值是1 的地方打印#,在值是0的地方打印空格。這就可以實現地圖的繪制。利用不同的數字來代表不同的屬性。
2.
蛇如何畫?先來看一條蛇 @ 3,6
@ 3,7
@ 3,8
@ 從上到下,坐標分別是 3,9 我們發現,一個蛇也可以用數組來顯示,數組定義二維的,存儲橫縱坐標。 但是,千萬不要漏掉了蛇的長度。之后會講到。
如何畫蛇?通過上訴坐標,實際上只需要gotoxy(3,6);然后printf("@");其他的幾個蛇身也是這樣畫出來。那么這里遇到一個問題,利用一個for循環就可以,但是循環多少次呢?這里就要用到一個變量來存儲蛇的長度*****
會畫蛇了以后還要會讓蛇移動,這里舉個例子向右移動,還是上例蛇
@@ 3,6 4,6
@ 3,7
@ 3,8 可以看到,原來第一個坐標3,6變成第二個的坐標,原來第二個坐標3,7變成第三個坐標。 把坐標往后移位就可以實現新的蛇坐標。 蛇頭的坐標需要相應的改變,這個簡單不多說
做到這一步,蛇移動已經差不多了,但是會發現,蛇的尾巴畫出來的@還存在,為了消去這個蛇尾,可以在蛇的尾部打上空格來覆蓋掉這個蛇尾。 但是,聰明的小伙伴已經想到了,如果吃了東西,其實會邊長一格,那么這個變長的蛇格就是原來的蛇尾,那么這時候又要打印出蛇尾的@ 說了這么多,是不是已經知道需要把蛇尾坐標單獨存儲了呀

3.判定蛇的狀態,這個就是利用蛇頭坐標是不是在食物,比如蛇頭轉向以后坐標是4,6那么可以看看二維數組坐標對應的6行4列是不是金幣屬性還是障礙物屬性等等。根據不同的就可以進行不同的操作。

然后,到這里基本上就沒有什么問題了吧,下面附上源代碼。是雙人貪吃蛇,代碼很雜亂,不適合閱讀,而且因為是兩只蛇,有的地方可以更簡略一些我也懶得改了。還做了一點改變顏色的什么的,還有自己做了一點簡略的菜單加上,emmmmm瞎搞的玩意。目前模式1還沒有做,單人和雙人的操作都可以。代碼是真的很亂,自己都不怎么想去整改了,核心思想都寫上面了,希望可以幫助到有需之人吧。

#include<stdio.h> #include<windows.h> #include<time.h> #include<conio.h> #include<string.h> #include<math.h> #include<stdlib.h> #define H 20 #define L 80 //H high高度 L long長度 #define UP 0 #define DOWN 1 #define LEft 2 #define RIGHT 3 #define mmlong 3 //這是蛇長 //蛇1 int map[H][L] ={0}; //地圖,H行,L列 int snake[1000][2] = {0}; //蛇,0列代表x坐標,1列代表y坐標 int snake_long = mmlong; //蛇初始長度4個 int direction = UP; //蛇頭方向,初始向上 int tail[2]={0}; //寄存蛇尾 int speed = 300,game_in = 3; //控制蛇速度 int score = 0; //蛇1分數 //蛇2 int snake_2[1000][2] = {0}; //蛇,0列代表x坐標,1列代表y坐標 int snake_long_2 = mmlong; //蛇初始長度4個 int direction2 = UP; //蛇頭方向,初始向上 int tail_2[2]={0}; //寄存蛇尾 int speed_2 = 300; //控制蛇速度 int score_2 = 0; //蛇2分數 //通用 int target = 0,time_game = 0; //time_game 游戲對于模式 void gotoxy(int i,int j) //移動光標 {COORD position={i,j};SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),position); } void color(int x) //改變輸出顏色 {if( x>= 0 && x<= 15) //參數在0-15的范圍顏色{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x); //只有一個參數x,改變字體顏色}else//默認的顏色白色{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);} } void product_map() //地圖數據初始化 {int i,j,c = 0;snake_long = snake_long_2 = mmlong; //蛇初始4長度speed = speed_2 = 300; //蛇速度初始300score = score_2 = 0; //初始分數初始化0 emd:c++;srand(time(NULL)+c*100);direction = rand()%4; //給蛇1一個隨機方向,但不能向下 if(direction == 1)goto emd; hmd:c++;srand(time(NULL)+c*100);direction2 = rand()%4; //給蛇2一個隨機方向,但不能向下 if(direction2 == 1)goto hmd;for(i = 0;i<H;i++){for(j = 0;j<L;j++){map[i][j] = 0; //每次開始新游戲,需要重新給二維數組賦值0 }} for(i = 0;i<H;i++){map[i][0] = map[i][L-1] = 1;}for(i = 0;i<L;i++){map[0][i] = map[H-1][i] = 1;}snake[0][0] = L/4;snake[0][1] = H/4; //蛇頭初始坐標在中心snake_2[0][0] = L*3/4;snake_2[0][1] = H*3/4; //蛇頭初始坐標在中心for(i = 1;i<mmlong;i++){snake[i][0] = snake[0][0];snake[i][1] = snake[0][1] + i; //蛇1身坐標,豎直向下3個snake_2[i][0] = snake_2[0][0];snake_2[i][1] = snake_2[0][1] + i; //蛇2身坐標,豎直向下3個 }tail[0] = snake[3][0];tail[1] = snake[3][1];tail_2[0] = snake_2[3][0];tail_2[1] = snake_2[3][1]; }void money_product() //產生金錢{int i,j,k,x,y; //x,y是金幣的數組下標寄存器 for(i = 0,k = 1;;){cmd:k++;srand(time(NULL)+k*20+(j-2)*30);x = rand()%(L-2) + 1;y = rand()%(H-2) + 1;for(j = 0;j<snake_long;j++) //防止產生在蛇1身上 {if(x == snake[j][0] && y == snake[j][1])goto cmd; //重新產生 }for(j = 0;j<snake_long_2;j++) //防止產生在蛇2身上 {if(x == snake_2[j][0] && y == snake_2[j][1])goto cmd; //重新產生 }if(map[y][x] != 2) //已經是金錢不再累計 {map[y][x] = 2;i++;}if(i == 7)break; } } void draw_map() //畫地圖 {int i,j;gotoxy(0,0);for(i = 0;i<H;i++){for(j = 0;j<L;j++){if(map[i][j] == 1){color(12);printf("#");}else if(map[i][j] == 0){printf(" ");}else if(map[i][j] == 2){color(6);printf("*");}}printf("\n"); }}void draw_snake() //畫蛇 {int i;color(4);gotoxy(snake[0][0],snake[0][1]);printf("@");color(14);for(i = 1;i<snake_long;i++){gotoxy(snake[i][0],snake[i][1]);printf("@");} } void draw_snake2() //畫蛇2 {int i;color(1);gotoxy(snake_2[0][0],snake_2[0][1]);printf("@");color(9);for(i = 1;i<snake_long_2;i++){gotoxy(snake_2[i][0],snake_2[i][1]);printf("@");} } void move_snake() //蛇1身移動 {int i;tail[0] = snake[snake_long-1][0];tail[1] = snake[snake_long-1][1]; //寄存蛇尾 gotoxy(snake[snake_long-1][0],snake[snake_long-1][1]);printf(" "); //把蛇尾畫空格for(i = snake_long-1;i>0;i--) //后移賦值 把后一個等于前一個的坐標,實現移動 {snake[i][0] = snake[i-1][0];snake[i][1] = snake[i-1][1];} } void move_snake2() //蛇2身移動 {int i;tail_2[0] = snake_2[snake_long-1][0];tail_2[1] = snake_2[snake_long-1][1]; //寄存蛇尾 gotoxy(snake_2[snake_long_2-1][0],snake_2[snake_long_2-1][1]);printf(" "); //把蛇尾畫空格for(i = snake_long_2-1;i>0;i--) //后移賦值 把后一個等于前一個的坐標,實現移動 {snake_2[i][0] = snake_2[i-1][0];snake_2[i][1] = snake_2[i-1][1];} } void move_snake_head() //蛇1頭移動 {switch(direction){case 0:snake[0][1]--;break;//向上 case 1:snake[0][1]++;break;//向下 case 2:snake[0][0]--;break;//向左 case 3:snake[0][0]++;break;//向右 }}void move_snake_head2() //蛇2頭移動 {switch(direction2){case 0:snake_2[0][1]--;break;//向上 case 1:snake_2[0][1]++;break;//向下 case 2:snake_2[0][0]--;break;//向左 case 3:snake_2[0][0]++;break;//向右 }} void direction_snake() //蛇方向(蛇頭) {switch(getch()){case 0xE0:switch(getch()){case 72:if(direction2 != 1) //當前不是向下走就可以向上走 direction2 = 0;break;case 80:if(direction2 != 0) //當前不是向下走就可以向上走 direction2 = 1;break;case 75:if(direction2 != 3) //當前不是向下走就可以向上走 direction2 = 2;break;case 77:if(direction2 != 2) //當前不是向下走就可以向上走 direction2 = 3;break;}break; case 'w':case 'W':if(direction != 1) //當前不是向下走就可以向上走 direction = 0;break; case 's':case 'S':if(direction != 0) //當前不是向上走就可以向下走 direction = 1;break;case 'a':case 'A':if(direction != 3) //當前不是向右走就可以向左走 direction = 2;break;case 'd':case 'D':if(direction != 2) //當前不是向左走就可以向右走 direction = 3;break;default :break;} } void check_snake() //檢查蛇1狀態 {void message_snake(); //打印蛇1信息int i,j;color(8); if(map[snake[0][1]][snake[0][0]] == 2) //蛇頭的橫坐標是行標,縱坐標是列標,吃到食物,蛇邊長1格,吃到金錢后 { //立馬重新產生金錢 snake_long++;score += 100;snake[snake_long-1][0] = tail[0];snake[snake_long-1][1] = tail[1];speed -= 35;if(speed<100)speed = 100;for(i = 0;i<H;i++){for(j = 0;j<L;j++){if(map[i][j] == 2)map[i][j] = 0; //原來的金錢全部消失 }}money_product(); //重新產生金錢draw_snake();draw_map(); //畫地圖draw_snake();}message_snake(); //打印蛇1信息if(score >= target){Sleep(1500);system("cls");gotoxy(L/2,H/2);printf("蛇1率先達到目標分數,獲得勝利\n");Sleep(1500);gotoxy(L/2-4,H/2+1);printf("再來一次?(Y/y) 退出(N/n) 按0返回功能菜單");shuru2:switch(getch()){case '0':game_in = 2;goto eee;break;case 'y':case 'Y':game_in = 1;goto eee;break;case 'n':case 'N':game_in = 0;goto eee;break;default:goto shuru2; }}if(map[snake[0][1]][snake[0][0]] == 1) //撞到邊界或者障礙物,輸了 {Sleep(1500);system("cls");gotoxy(L/2,H/2);printf("蛇1撞到障礙物,蛇2獲勝\n");Sleep(1500);gotoxy(L/2-4,H/2+1);printf("再來一次?(Y/y) 退出(N/n) 按0返回功能菜單");shuru:switch(getch()){case '0':game_in = 2;break;case 'y':case 'Y':game_in = 1;break;case 'n':case 'N':game_in = 0;break;default:goto shuru; }}eee:; } void check_snake2() //檢查蛇2狀態 {int i,j;void message_snake2(); //打印蛇2信息color(8);if(map[snake_2[0][1]][snake_2[0][0]] == 2) //蛇頭的橫坐標是行標,縱坐標是列標,吃到食物,蛇邊長1格,吃到金錢后 { //立馬重新產生金錢 snake_long_2++;score_2 += 100;snake_2[snake_long_2-1][0] = tail_2[0];snake_2[snake_long_2-1][1] = tail_2[1];speed_2 -= 35;if(speed_2<100)speed_2 = 100;for(i = 0;i<H;i++){for(j = 0;j<L;j++){if(map[i][j] == 2)map[i][j] = 0; //原來的金錢全部消失 }}money_product(); //重新產生金錢draw_snake2();draw_map(); //畫地圖draw_snake2(); }message_snake2(); //打印蛇2信息if(score_2 >= target){Sleep(1500);system("cls");gotoxy(L/2,H/2);printf("蛇2率先達到目標分數,獲得勝利\n");Sleep(1500);gotoxy(L/2-4,H/2+1);printf("再來一次?(Y/y) 退出(N/n) 按0返回功能菜單");shuru:switch(getch()){case '0':game_in = 2;goto eee;break;case 'y':case 'Y':game_in = 1;goto eee;break;case 'n':case 'N':game_in = 0;goto eee;break;default:goto shuru; }}if(map[snake_2[0][1]][snake_2[0][0]] == 1) //撞到邊界或者障礙物,輸了 {Sleep(1500);system("cls");gotoxy(L/2,H/2);printf("蛇2撞到障礙物,蛇1獲勝\n");Sleep(1500);gotoxy(L/2-4,H/2+1);printf("再來一次?(Y/y) 退出(N/n) 按0返回功能菜單");shuru2:switch(getch()){case '0':game_in = 2;break;case 'y':case 'Y':game_in = 1;break;case 'n':case 'N':game_in = 0;break;default:goto shuru2; }}eee:; } int menu() //功能菜單 {CONSOLE_CURSOR_INFO cursor_info = {1, 0};SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); //隱藏關標int i,m,c = 0;if(time_game == 2)goto moshi2;else if(time_game == 3)goto moshi3;else if(time_game == 4)goto kaishi;color(12); gotoxy(36,2);printf("小小貪吃蛇");gotoxy(6,5);color(8);printf("1.闖關模式");gotoxy(26,5);printf("2.單人游戲");gotoxy(46,5);printf("3.雙人游戲");gotoxy(66,5);printf("4.結束游戲");gotoxy(1,13);printf(" Loading......\n");do{for(i = 10,m = 1;i<60;i++,m+=2){color(8);gotoxy(75,13);printf(" ");gotoxy(75,13);printf("%-2d%%",m);gotoxy(75,13);printf(" ");gotoxy(75,13);printf("%-2d%%",m+1);gotoxy(i+5,14);color(3);printf("》"); Sleep(i+m);c++;if(c == 50)goto end;}gotoxy(1,14);for(i = 0;i<79;i++){printf(" "); }}while(1);end:kaishi:;color(12); gotoxy(36,2);printf("小小貪吃蛇");gotoxy(6,5);color(8);printf("1.闖關模式");gotoxy(26,5);printf("2.單人游戲");gotoxy(46,5);printf("3.雙人游戲");gotoxy(66,5);printf("4.結束游戲");color(3); gotoxy(1,14);for(i = 0;i<79;i++){printf(" "); }gotoxy(1,13);printf(" ");gotoxy(34,7);printf("請按相應序號進行選擇");switch(getch()){case '1':system("cls");break; //闖關 case '2':moshi2:;system("cls");gotoxy(36,7);printf("游戲說明");gotoxy(32,8);printf("單人模式,設定一個目標分,達到即可勝利");gotoxy(32,9);printf("每吃到一個金幣,分數增加100分");gotoxy(32,10);printf("撞到邊界或障礙物,游戲失敗");gotoxy(32,11);printf("請輸入目標分數:");color(8);fflush(stdin);scanf("%d",&target);return 2; case '3':moshi3:;system("cls");gotoxy(36,7);printf("游戲說明");gotoxy(32,8);printf("雙人對戰,率先達到目標分數的一方獲得勝利");gotoxy(32,9);printf("每吃到一個金幣,分數增加100分");gotoxy(32,10);printf("撞到邊界或障礙物,對方獲勝");gotoxy(32,11);printf("請輸入目標分數:");color(8);fflush(stdin);scanf("%d",&target);return 3; case '4':return 4;default :break; } }void message_snake() //打印蛇1信息 {gotoxy(5,H+1);color(11); printf("玩家1--蛇1");gotoxy(5,H+2);printf("得分:%d",score);gotoxy(5,H+3);printf("上 下 左 右");gotoxy(5,H+4);printf("W/w S/s A/a D/d");gotoxy(27,H+1);printf("目標分數:%d",target); }void message_snake2() //打印蛇2信息 {gotoxy(50,H+1);color(11); printf("玩家2--蛇2");gotoxy(50,H+2);printf("得分:%d",score_2);gotoxy(50,H+3);printf("上 下 左 右");gotoxy(50,H+4);printf(" ↑ ↓ ← →"); } int main() {CONSOLE_CURSOR_INFO cursor_info = {1, 0};SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); //隱藏關標int i;menu1:system("cls");i = menu(); //功能菜單if(i == 3)goto play3;else if(i == 2)goto play2;else if(i == 4)goto over_game; play3: game_in = 3;product_map(); //地圖產生money_product();//產生金錢 draw_map(); //畫地圖draw_snake(); //畫蛇1draw_snake2();message_snake(); //打印蛇1信息message_snake2(); //打印蛇2信息color(8);gotoxy(L/2-10,H/2);system("pause");gotoxy(L/2-10,H/2);printf(" "); do //雙人貪吃蛇 {CONSOLE_CURSOR_INFO cursor_info = {1, 0};SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); //隱藏關標move_snake(); //蛇1身移動move_snake_head(); //蛇1頭移動check_snake(); //檢查蛇1狀態move_snake2(); //蛇2身移動move_snake_head2(); //蛇2頭移動check_snake2(); //檢查蛇2狀態draw_snake();draw_snake2();if(game_in == 0) // game_in0 結束游戲,1這個模式重開,2返回功能菜單 goto over_game;else if(game_in == 1){time_game = 3;goto menu1;}else if(game_in == 2){time_game = 4;goto menu1;}draw_snake();draw_snake2();Sleep(speed<speed_2?speed:speed_2); //速度最快 if(kbhit() != 0) //用kbhit函數來判斷是否有按鍵 {direction_snake(); //移動蛇 }}while(1);//單人貪吃蛇 play2:game_in = 3;product_map(); //地圖產生money_product();//產生金錢 draw_map(); //畫地圖draw_snake(); //畫蛇1message_snake(); //打印蛇1信息color(8); gotoxy(L/2-10,H/2);system("pause");gotoxy(L/2-10,H/2);printf(" "); do //單人人貪吃蛇 {CONSOLE_CURSOR_INFO cursor_info = {1, 0};SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); //隱藏關標move_snake(); //蛇1身移動move_snake_head(); //蛇1頭移動check_snake(); //檢查蛇1狀態if(game_in == 0)goto over_game;else if(game_in == 1){time_game = 2;goto menu1;}else if(game_in == 2){time_game = 4;goto menu1;}draw_snake();Sleep(speed-50); //速度加快 if(kbhit() != 0) //用kbhit函數來判斷是否有按鍵 {direction_snake(); //移動蛇 }}while(1); over_game:;}

總結

以上是生活随笔為你收集整理的C语言双人贪吃蛇的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。