C语言如何实现双人贪吃蛇游戏
发表于:2025-01-17 作者:千家信息网编辑
千家信息网最后更新 2025年01月17日,这篇文章给大家分享的是有关C语言如何实现双人贪吃蛇游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。贪吃蛇双人小游戏,每局游戏两分钟,死亡则直接失败,若时间结束,则分高者获
千家信息网最后更新 2025年01月17日C语言如何实现双人贪吃蛇游戏
这篇文章给大家分享的是有关C语言如何实现双人贪吃蛇游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
贪吃蛇双人小游戏,每局游戏两分钟,死亡则直接失败,若时间结束,则分高者获胜。
上源代码:
#include#include #include #include #include #include #define SNAKESIZE 100#define MAPWIDTH 118#define MAPHEIGHT 29 struct { //保存食物坐标 int x; int y;}food; struct { int len; int x[SNAKESIZE]; int y[SNAKESIZE]; }snake;struct { int len; int x[SNAKESIZE]; int y[SNAKESIZE]; }snake1;char key = '8';//初始方向向上char key1 = 'w'; int changeFlag = 0 , changeFlag1 = 0;int speed=150 , sorce = 0 , sorce1 = 0 , sec=0 , min=2; void gotoxy(int x, int y)//移动光标到指定位置{ COORD coord; coord.X = x; coord.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);}void MAP()//打印边框和两条蛇的起始位置{ for (int i = 0; i <= MAPWIDTH; i += 2)//打印最上面和最下面两横边框 { gotoxy(i, 0); printf("■"); gotoxy(i, MAPHEIGHT); printf("■"); } for (int i = 1; i < MAPHEIGHT; i++)//打印最左面和最右面 { gotoxy(0, i); printf("■"); gotoxy(MAPWIDTH, i); printf("■"); } while (1)//打印一个食物 { srand((unsigned int)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 (int i = 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;}void OPERATION()//操作函数{ char pre_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; else if(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 (int i = snake.len - 1; i > 0; i--) { snake.x[i] = snake.x[i - 1]; snake.y[i] = snake.y[i - 1]; } for (int i = 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;}void createFood(){ if (snake.x[0] == food.x && snake.y[0] == food.y)//蛇头碰到食物 { //蛇头碰到食物即为要吃掉这个食物了,因此需要再次生成一个食物 while (1) { int a = 1 , b=1; srand((unsigned int)time(NULL)); food.x = rand() % (MAPWIDTH - 4) + 2; food.y = rand() % (MAPHEIGHT - 2) + 1; //随机生成的食物不能在蛇的身体上 for (int i = 0; i < snake.len; i++) { if (snake.x[i] == food.x && snake.y[i] == food.y) { a = 0; break; } } for (int i = 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++;//吃到食物,蛇身长度加1 sorce += 10; speed -= 5;//随着吃的食物越来越多,速度会越来越快 changeFlag = 1;//很重要,因为吃到了食物,就不用再擦除蛇尾的那一节,以此来造成蛇身体增长的效果 } return;}void createFood1(){ if (snake1.x[0] == food.x && snake1.y[0] == food.y)//蛇头碰到食物 { //蛇头碰到食物即为要吃掉这个食物了,因此需要再次生成一个食物 while (1) { int a = 1 , b=1; srand((unsigned int)time(NULL)); food.x = rand() % (MAPWIDTH - 4) + 2; food.y = rand() % (MAPHEIGHT - 2) + 1; //随机生成的食物不能在蛇的身体上 for (int i = 0; i < snake.len; i++) { if (snake.x[i] == food.x && snake.y[i] == food.y) { a = 0; break; } } for (int i = 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++;//吃到食物,蛇身长度加1 sorce1 += 10; speed -= 5;//随着吃的食物越来越多,速度会越来越快 changeFlag1 = 1;//很重要,因为吃到了食物,就不用再擦除蛇尾的那一节,以此来造成蛇身体增长的效果 } return;}bool check(){ //蛇头碰到上下边界,游戏结束 if (snake.y[0] == 0 || snake.y[0] == MAPHEIGHT) return true; //蛇头碰到左右边界,游戏结束 if (snake.x[0] == 0 || snake.x[0] == MAPWIDTH) return true; //蛇头碰到蛇身,游戏结束 for (int i = 1; i < snake.len; i++) { if (snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0]) return true; } for (int i = 0; i < snake1.len; i++) { if(snake1.x[i] == snake.x[0]&&snake1.y[i] == snake.y[0]) return true; } return false;}bool check1(){ //蛇头碰到上下边界,游戏结束 if (snake1.y[0] == 0 || snake1.y[0] == MAPHEIGHT) return true; //蛇头碰到左右边界,游戏结束 if (snake1.x[0] == 0 || snake1.x[0] == MAPWIDTH) return true; //蛇头碰到蛇身,游戏结束 for (int i = 1; i < snake1.len; i++) { if (snake1.x[i] == snake1.x[0] && snake1.y[i] == snake1.y[0]) return true; } for (int i = 0; i < snake.len; i++) { if (snake.x[i] == snake1.x[0] && snake.y[i] == snake1.y[0]) return true; } return false;}void MENU ()//打印菜单界面{ 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(); }}void RULE (){ 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");//清屏}void START(){ time_t time_sec = 0; time_t old_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--; //计时秒数减1 else { sec = 59; //如果原秒数为0,则变为59 min--; //计时分钟减1 } } if(min==0&&sec==0) break; if(sec>=8) printf("\a"); gotoxy(4,1); printf("倒计时--d:d\r",min, sec); } system("cls"); printf("\n\n\t\t\tGame Over!\n"); system("pause");} void OVER (){ 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"); else if(!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"); else if(sorce1>sorce) printf("\t\t\t\t║ 玩家一(左侧)获胜,玩家二(右侧)失败。 ║\n"); else printf("\t\t\t\t║ 恭喜你们平局了! ║\n"); } printf("\t\t\t\t║ ║\n"); printf("\t\t\t\t║ ║\n"); printf("\t\t\t\t╚═══════════════════════════════════════════╝\n"); }int main (){ system("title 双人贪吃蛇"); system("color F0"); MENU(); OVER(); return 0;} [点击并拖拽以移动]
感谢各位的阅读!关于"C语言如何实现双人贪吃蛇游戏"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
食物
蛇头
玩家
方向
生成
移动
右侧
越来越
身体
边界
越来
长度
语言
重要
上下
不用
位置
内容
再次
奇数
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
欧卡模拟2哪个服务器好玩
软件产品软件开发平台
网盘服务器核心数和内存大小
网络安全教育班会课主题
服务器 更新
嘉兴天实网络技术有限公司
青年婚恋数据库的通知
泊头职业学院计算机网络技术
欢网服务器
广西中乃长网络技术有限公司
深圳美魅网络技术有限公司
sql创建空白数据库
嵌入式软件开发都有哪些工作
tp5数据库表插入数据
软件开发要申请专利吗
sql数据库的还原与备份
中国it最大软件开发商
网络安全事项大全
db2导出完整数据库
unix服务器和linux
数据库中的码和键
魔兽怀旧服服务器锁定了怎么办
什么是数据库新技术
筑牢全区网络安全防线
固原软件开发公司在哪里
数据库没有卸载完
小程序会话管理服务器
幼儿园网络安全宣传教案大班
梁溪区机电软件开发技术参数
tcp 服务器高可用架构方案