貪吃蛇雙人小游戲,每局游戲兩分鐘,死亡則直接失敗,若時間結束,則分高者獲勝。
#include<stdio.h>#include<stdlib.h>#include<Windows.h>#include<time.h>#include<stdbool.h>#include<conio.h>#defineSNAKESIZE100#defineMAPWIDTH118#defineMAPHEIGHT29struct{//保存食物坐標intx;inty;}food;struct{intlen;intx[SNAKESIZE];inty[SNAKESIZE];}snake;struct{intlen;intx[SNAKESIZE];inty[SNAKESIZE];}snake1;charkey='8';//初始方向向上charkey1='w';intchangeFlag=0,changeFlag1=0;intspeed=150,sorce=0,sorce1=0,sec=0,min=2;voidgotoxy(intx,inty)//移動光標到指定位置{COORDcoord;coord.X=x;coord.Y=y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);}voidMAP()//打印邊框和兩條蛇的起始位置{for(inti=0;i<=MAPWIDTH;i+=2)//打印最上面和最下面兩橫邊框{gotoxy(i,0);printf("■");gotoxy(i,MAPHEIGHT);printf("■");}for(inti=1;i<MAPHEIGHT;i++)//打印最左面和最右面{gotoxy(0,i);printf("■");gotoxy(MAPWIDTH,i);printf("■");}while(1)//打印一個食物{srand((unsignedint)time(NULL));food.x=rand()%(MAPWIDTH-4)+2;food.y=rand()%(MAPHEIGHT-2)+1;if(food.x%2==0)break;}gotoxy(food.x,food.y);printf("★");snake.len=snake1.len=4;//給兩條蛇的長度賦初值snake.x[0]=MAPWIDTH/2+31;//然后分別打印兩條蛇身部分snake.y[0]=MAPHEIGHT/2;snake1.x[0]=MAPWIDTH/2-31;snake1.y[0]=MAPHEIGHT/2;gotoxy(snake.x[0],snake.y[0]);printf("■");gotoxy(snake1.x[0],snake1.y[0]);printf("●");for(inti=1;i<snake.len;i++){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1]+1;gotoxy(snake.x[i],snake.y[i]);printf("■");snake1.x[i]=snake1.x[i-1];snake1.y[i]=snake1.y[i-1]+1;gotoxy(snake1.x[i],snake1.y[i]);printf("●");}gotoxy(MAPWIDTH,0);//把光標移走return;}voidOPERATION()//操作函數{charpre_key=key,pre_key1=key1,s;//保存兩條蛇上一次的方向if(_kbhit()){s=getch();if(s=='w'||s=='s'||s=='a'||s=='d'||s=='W'||s=='S'||s=='A'||s=='D')key1=s;elseif(s=='8'||s=='5'||s=='4'||s=='6')key=s;}if(changeFlag==0)//沒吃到食物{gotoxy(snake.x[snake.len-1],snake.y[snake.len-1]);printf("");//在蛇尾處輸出空格即擦去蛇尾}if(changeFlag1==0){gotoxy(snake1.x[snake1.len-1],snake1.y[snake1.len-1]);printf("");//在蛇尾處輸出空格即擦去蛇尾}//將蛇的每一節依次向前移動一節(蛇頭除外)for(inti=snake.len-1;i>0;i--){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];}for(inti=snake1.len-1;i>0;i--){snake1.x[i]=snake1.x[i-1];snake1.y[i]=snake1.y[i-1];}//蛇當前移動的方向不能和前一次的方向相反,比如蛇往左走的時候不能直接按右鍵往右走//如果當前移動方向和前一次方向相反的話,把當前移動的方向改為前一次的方向if(pre_key=='8'&&key=='5')key='8';if(pre_key=='5'&&key=='8')key='5';if(pre_key=='4'&&key=='6')key='4';if(pre_key=='6'&&key=='4')key='6';if(pre_key1=='w'&&key1=='s')key1='w';if(pre_key1=='s'&&key1=='w')key1='s';if(pre_key1=='a'&&key1=='d')key1='a';if(pre_key1=='d'&&key1=='a')key1='d';//判斷蛇頭應該往哪個方向移動switch(key){case'4':snake.x[0]-=2;//往左break;case'6':snake.x[0]+=2;//往右break;case'8':snake.y[0]--;//往上break;case'5':snake.y[0]++;//往下break;}gotoxy(snake.x[0],snake.y[0]);printf("■");changeFlag=0;switch(key1){case'a':case'A':snake1.x[0]-=2;//往左break;case'd':case'D':snake1.x[0]+=2;//往右break;case'w':case'W':snake1.y[0]--;//往上break;case's':case'S':snake1.y[0]++;//往下break;}gotoxy(snake1.x[0],snake1.y[0]);printf("●");changeFlag1=0;gotoxy(MAPWIDTH,0);return;}voidcreateFood(){if(snake.x[0]==food.x&&snake.y[0]==food.y)//蛇頭碰到食物{//蛇頭碰到食物即為要吃掉這個食物了,因此需要再次生成一個食物while(1){inta=1,b=1;srand((unsignedint)time(NULL));food.x=rand()%(MAPWIDTH-4)+2;food.y=rand()%(MAPHEIGHT-2)+1;//隨機生成的食物不能在蛇的身體上for(inti=0;i<snake.len;i++){if(snake.x[i]==food.x&&snake.y[i]==food.y){a=0;break;}}for(inti=0;i<snake1.len;i++){if(snake1.x[i]==food.x&&snake1.y[i]==food.y){b=0;break;}}//隨機生成的食物不能橫坐標為奇數,也不能在蛇身,否則重新生成if(a==1&&b==1&&food.x%2==0)break;}//繪制食物gotoxy(food.x,food.y);printf("★");snake.len++;//吃到食物,蛇身長度加1sorce+=10;speed-=5;//隨著吃的食物越來越多,速度會越來越快changeFlag=1;//很重要,因為吃到了食物,就不用再擦除蛇尾的那一節,以此來造成蛇身體增長的效果}return;}voidcreateFood1(){if(snake1.x[0]==food.x&&snake1.y[0]==food.y)//蛇頭碰到食物{//蛇頭碰到食物即為要吃掉這個食物了,因此需要再次生成一個食物while(1){inta=1,b=1;srand((unsignedint)time(NULL));food.x=rand()%(MAPWIDTH-4)+2;food.y=rand()%(MAPHEIGHT-2)+1;//隨機生成的食物不能在蛇的身體上for(inti=0;i<snake.len;i++){if(snake.x[i]==food.x&&snake.y[i]==food.y){a=0;break;}}for(inti=0;i<snake1.len;i++){if(snake1.x[i]==food.x&&snake1.y[i]==food.y){b=0;break;}}//隨機生成的食物不能橫坐標為奇數,也不能在蛇身,否則重新生成if(a==1&&b==1&&food.x%2==0)break;}//繪制食物gotoxy(food.x,food.y);printf("★");snake1.len++;//吃到食物,蛇身長度加1sorce1+=10;speed-=5;//隨著吃的食物越來越多,速度會越來越快changeFlag1=1;//很重要,因為吃到了食物,就不用再擦除蛇尾的那一節,以此來造成蛇身體增長的效果}return;}boolcheck(){//蛇頭碰到上下邊界,游戲結束if(snake.y[0]==0||snake.y[0]==MAPHEIGHT)returntrue;//蛇頭碰到左右邊界,游戲結束if(snake.x[0]==0||snake.x[0]==MAPWIDTH)returntrue;//蛇頭碰到蛇身,游戲結束for(inti=1;i<snake.len;i++){if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])returntrue;}for(inti=0;i<snake1.len;i++){if(snake1.x[i]==snake.x[0]&&snake1.y[i]==snake.y[0])returntrue;}returnfalse;}boolcheck1(){//蛇頭碰到上下邊界,游戲結束if(snake1.y[0]==0||snake1.y[0]==MAPHEIGHT)returntrue;//蛇頭碰到左右邊界,游戲結束if(snake1.x[0]==0||snake1.x[0]==MAPWIDTH)returntrue;//蛇頭碰到蛇身,游戲結束for(inti=1;i<snake1.len;i++){if(snake1.x[i]==snake1.x[0]&&snake1.y[i]==snake1.y[0])returntrue;}for(inti=0;i<snake.len;i++){if(snake.x[i]==snake1.x[0]&&snake.y[i]==snake1.y[0])returntrue;}returnfalse;}voidMENU()//打印菜單界面{printf("\n\n\n\n\t\t\t\t╔═══════════════════════════════════════╗\n");printf("\t\t\t\t║║\n");printf("\t\t\t\t║歡迎來到貪吃蛇║\n");printf("\t\t\t\t║║\n");printf("\t\t\t\t║║\n");printf("\t\t\t\t║┏━━┓┏━━┓┏━━┓║\n");printf("\t\t\t\t║開始:┃1┃規則:┃2┃退出:┃3┃║\n");printf("\t\t\t\t║┗━━┛┗━━┛┗━━┛║\n");printf("\t\t\t\t║║\n");printf("\t\t\t\t║║\n");printf("\t\t\t\t╚═══════════════════════════════════════╝\n");switch(getch()){case'1':system("cls");START();break;case'2':system("cls");RULE();MENU();break;case'3':exit(0);break;default:system("cls");printf("error");MENU();}}voidRULE(){system("cls");//清屏printf("\t╔══════════════════════════════════════════════════════════════════════════════════════════════════╗\n");printf("\t║本游戲玩家一(左側)通過按鍵W、S、A、D(不區分大小寫)四個鍵分別控制snake1上移、下移、左移和右移。║\n");printf("\t║玩家二(右側)過按鍵8、5、4、6四個鍵分別控制snake2上移、下移、左移和右移。║\n");printf("\t║每局游戲兩分鐘,死亡則直接失敗,若時間結束,則分高者獲勝。║\n");printf("\t╚══════════════════════════════════════════════════════════════════════════════════════════════════╝\n");system("pause");//暫停system("cls");//清屏}voidSTART(){time_ttime_sec=0;time_told_sec=0;MAP();system("pause");time(&time_sec);//獲取時間old_sec=time_sec;//保存時間while(!check()&&!check1()){OPERATION();createFood();createFood1();Sleep(speed);time(&time_sec);//獲取秒數保存到time_t變量if(time_sec!=old_sec)//如果秒數改變(計時達到1秒){old_sec=time_sec;//更新舊的秒數if(sec>0)sec--;//計時秒數減1else{sec=59;//如果原秒數為0,則變為59min--;//計時分鐘減1}}if(min==0&&sec==0)break;if(sec>=8)printf("\a");gotoxy(4,1);printf("倒計時——%02d:%02d\r",min,sec);}system("cls");printf("\n\n\t\t\tGameOver!\n");system("pause");}voidOVER(){system("cls");printf("\n\n\n\n\t\t\t\t╔═══════════════════════════════════════════╗\n");printf("\t\t\t\t║║\n");printf("\t\t\t\t║游戲結束║\n");printf("\t\t\t\t║║\n");printf("\t\t\t\t║║\n");if(check()&&!check1())printf("\t\t\t\t║玩家一(左側)獲勝,玩家二(右側)失敗。║\n");elseif(!check()&&check1())printf("\t\t\t\t║玩家一(左側)失敗,玩家二(右側)獲勝。║\n");else{printf("\t\t\t\t║玩家一本次游戲得分為:%4d║\n",sorce1);printf("\t\t\t\t║玩家二本次游戲得分為:%4d║\n",sorce);if(sorce>sorce1)printf("\t\t\t\t║玩家一(左側)失敗,玩家二(右側)獲勝。║\n");elseif(sorce1>sorce)printf("\t\t\t\t║玩家一(左側)獲勝,玩家二(右側)失敗。║\n");elseprintf("\t\t\t\t║恭喜你們平局了!║\n");}printf("\t\t\t\t║║\n");printf("\t\t\t\t║║\n");printf("\t\t\t\t╚═══════════════════════════════════════════╝\n");}intmain(){system("title雙人貪吃蛇");system("colorF0");MENU();OVER();return0;}[點擊并拖拽以移動]
感謝各位的閱讀!關于“C語言如何實現雙人貪吃蛇游戲”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
visa卡辦理條件是什么?1、visa借記卡。申請人只要帶身份證就可以到銀行或銀行官網辦理visa借記卡。2、Visa信用卡。申請visa信用卡的條件如下:(1)申請人的年齡在18周歲以上,有完全民事行為能力。(2)申請人有穩定的工作和收入來源,有還款付息的能力。(3)申請人有良好的信用記錄,沒有不良的信用記錄。(4)申請人有有效的身份證明和財力證明。(5)申請人有工作單位出具的工作證明。依據《商...
開通花唄有風險嗎?開通花唄是沒有風險的,其本質是個人小額貸款服務,主要依托于各種消費場景。用戶在開通花唄時,假如頁面跳轉到了人臉識別,則需要用戶完成人臉識別后才可以開通花唄。開通花唄是好還是不好?有利的方面:與很多信貸產品相比較,花唄支持的場景幾乎是最全面的,不僅包括支付寶本身的購物商城,小到日常生活中比如買早餐等都是可以進行支付的,很多平臺的產品基本上都不能做到;其次花唄使用是沒有費用的,除了用...
什么是保理公司?保理公司是指賣方將貨物出售給買方,賣方可以將貿易過程中銷售或合同產生的應收賬款轉讓給保理公司,然后保理公司提前提供現金流給賣方用于采購和生產,以避免企業在恢復期的資金周轉問題。隨著市場的發展,賒銷在交易中越來越普遍,奠定了良好的市場基礎。例如:a公司與b公司簽訂了合同,所以a公司向b公司提供了商品或服務,理論上,b公司應該向a公司付款嗎?但是,當A公司完成了服務和產品,B公司沒有付...