双人贪吃蛇(C语言如何实现双人贪吃蛇游戏)

发布时间:2025-12-11 01:27:19 浏览次数:2

贪吃蛇双人小游戏,每局游戏两分钟,死亡则直接失败,若时间结束,则分高者获胜。

上源代码:

#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语言如何实现双人贪吃蛇游戏”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

双人贪吃蛇
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477