以下是代码

#include <iostream>
#include <ctime>
#include <conio.h>
#include <unistd.h>
#include <stdlib.h>
#define bodyform1 '<'
#define bodyform2 '*'
#define wallform '#'
#define MAXI 20
#define MAXJ 80
#define MAXINPUT 101
#define MAXLENGTH 1000
#define MAXFOOD 100
using namespace std;char foodform[10] = {' ','1','2','3','4','5','6','7','8','9'};//最高分9分
//V2.2版本更新信息 主题:双人玩家更新
//支持自定义地图大小,实现窗口自我调节
//输出死亡信息,让对手死的明白!
//优化形参列表mode
//更好的苹果生成
//更好的彩蛋游戏//3.0待更新  主题:道具更新
//更好的地雷放置
//增加游戏模式框架
//消除对方一半的炸弹
//增加buff框架
//优化主菜单,游戏难度分级更合理
//新增传送门
//新增解除边界限制
//新增加速buff
//玩家名字自定义
//更好的皮肤系统
//更方便的操作布局
//想边放炸弹边转弯?满足你! int level,sleepme;//记录难度
int move[4][2] = {{-1,0}, {1,0}, {0,-1}, {0,1}};
//                  上0    下1     左2    右3 struct snack{int title; int head;int tail;int length;int coordinate[MAXLENGTH][2];//50格最大长度、0x 1y   //循环队列必须下表从零开始 ,注意此时依旧为50格长度,需要%50 int spgrow;//BUFFint boom[2001][2];
}; struct foodinfo{int num;int locate[MAXFOOD][2];int mark[MAXFOOD];
}; void color(void)
{int colorspawn1 = rand()%9 + 1;char color1[2];color1[0] = '4';color1[1] = '\0';int colorspawn2 = rand()%9 + 1;char color2[2];
//  color2[0] = colorspawn2 + '1'- 1;color2[0] = '7';color2[1] = '\0';char basic[20] = {'c','o','l','o','r',' ','\0'};strcat(basic,color1);strcat(basic,color2);system(basic);return;
} void window(int h, int w)
{int i;char temp[5], a[5], b[5];int tail = 0;int t = w+3;while(t != 0){temp[tail++] = t%10 + '0';t /= 10;}for(i = tail-1; i >= 0; i--){a[tail-1-i] = temp[i];}a[tail] = '\0';tail = 0;t = h+3;while(t != 0){temp[tail++] = t%10 + '0';t /= 10;}for(i = tail-1; i >= 0; i--){b[tail-1-i] = temp[i];}b[tail] = '\0';char basic1[30] = "mode con cols=";char basic2[30] = " lines=";strcat(basic1,a);strcat(basic1,basic2);strcat(basic1,b);system(basic1);return;
}void showmenu(void)
{color();//调用color函数 cout<<"      ============正在运行:贪吃蛇V2.0============"<<endl<<endl<<endl;cout<<"         请输入难度等级(难度越高随机分数越高哦~):"<<endl<<endl; cout<<"           0.智障:"<<endl; //100000000cout<<"           1.简单"<<endl; //25000000cout<<"           2.中等"<<endl; //15000000cout<<"           3.稍难"<<endl; //10000000cout<<"           4.困难"<<endl; //5000000cout<<"           5.极难"<<endl; //1000000cout<<"           6.炼狱(一进就死hhh)"<<endl;   //100000cout<<"\n\n      ================================================"<<endl;cout<<"\n请输入你的选择并回车:";return;
}void showsta(struct snack Ubody)
{cout<<"title = "<<Ubody.title<<endl;cout<<"身体长度 = "<<" "<<Ubody.length<<endl;cout<<"炸弹放置个数 = "<<" "<<Ubody.boom[0][0]<<endl;cout<<"坐标[H]"<<" X = "<<Ubody.coordinate[Ubody.head][0]<<" Y = "<<Ubody.coordinate[Ubody.head][1]<<endl;cout<<"坐标[T]"<<" X = "<<Ubody.coordinate[Ubody.tail][0]<<" Y = "<<Ubody.coordinate[Ubody.tail][1]<<endl;return;
}void showmap(struct snack body1, struct snack body2, struct foodinfo foods)
{static char mapme[MAXI+1][MAXJ+1];mapme[MAXI][0] = '\0';//决定了字符串输出的末尾(实现了跨界输出!) for(int inimap = 1; inimap <= MAXI-1; inimap++){mapme[inimap][0] = ' ';    //至关重要的初始化!决定了字符串输出方式是否能够使用!!!! } //载入场景地图   空格覆盖 for(int ppri = 1; ppri <= MAXI-1; ppri++){for(int pprj = 1; pprj <= MAXJ-1; pprj++){if(ppri == 1 || pprj == 1 || ppri == MAXI-1 || pprj == MAXJ-1)//载入地图边界 mapme[ppri][pprj] = wallform;elsemapme[ppri][pprj] = ' ';}    mapme[ppri][MAXJ] = '\n';    //尾部添加换行!! 换行可以这样干 !!! }//载入苹果 for(int foosch = 0; foosch <= MAXFOOD-1; foosch++){if(foods.mark[foosch] != 0){int foox = foods.locate[foosch][0];int fooy = foods.locate[foosch][1];mapme[foox][fooy] = foodform[foods.mark[foosch]];} }//再载入蛇的身体 for(int tailpr = body1.tail; tailpr != (body1.head+1)%MAXLENGTH; tailpr = (tailpr+1)%MAXLENGTH) //从尾部遍历 将贪吃蛇1载入到地图中 {mapme[body1.coordinate[tailpr][0]][body1.coordinate[tailpr][1]] = bodyform1;}for(int tailpr = body2.tail; tailpr != (body2.head+1)%MAXLENGTH; tailpr = (tailpr+1)%MAXLENGTH) //从尾部遍历 将贪吃蛇2载入到地图中 {mapme[body2.coordinate[tailpr][0]][body2.coordinate[tailpr][1]] = bodyform2;}//再载入炸弹 for(int i = body1.boom[0][0]; i >= 1; i--){mapme[body1.boom[i][0]][body1.boom[i][1]] = 'A';}for(int j = body2.boom[0][0]; j >= 1; j--){mapme[body2.boom[j][0]][body2.boom[j][1]] = 'B';}system("cls");//清除上一次的界面 //输出游戏场景cout<<mapme[1]; return;
}void spawnfood(struct snack body1, struct snack body2, struct foodinfo &foods, int spmark, int n)//获取这些信息是为了使食物刷新正确
{for(int i = 1; i <= n; i++)//生成n个苹果 while(1){int x = rand() % (MAXI-3) + 2;int y = rand() % (MAXJ-3) + 2;//判断是否和身体重合 for(int sear1 = body1.tail; sear1 != (body1.head+1)%MAXLENGTH; sear1 = (sear1+1)%MAXLENGTH){if(x == body1.coordinate[sear1][0] && y == body1.coordinate[sear1][1]) continue;}for(int sear2 = body2.tail; sear2 != (body2.head+1)%MAXLENGTH; sear2 = (sear2+1)%MAXLENGTH){if(x == body2.coordinate[sear2][0] && y == body2.coordinate[sear2][1]) continue;}//判断是否和已生成的食物重合 for(int foosch = 0; foosch <= MAXFOOD-1; foosch++){if(foods.mark[foosch] != 0 && (foods.locate[foosch][0] == x && foods.locate[foosch][1] == y))   continue;}//符合条件,升成for(int foosp = 0; foosp <= MAXFOOD-1; foosp++){if(foods.mark[foosp] == 0)//注意这里为0才能生成! {foods.mark[foosp] = spmark;//标记+生成 foods.locate[foosp][0] = x;foods.locate[foosp][1] = y;foods.num++;//食物个数增加 break;}}break;}return;
}int grow(struct snack &Ubody, struct snack &enemy, struct foodinfo &foods, int x, int y)
{int ifdie = 0;for(int foosch = 0; foosch <= MAXFOOD-1; foosch++){if(foods.mark[foosch] != 0 && (foods.locate[foosch][0] == x && foods.locate[foosch][1] == y))//如果下一个正好是吃的 {      //以下全是瞬间的变化,对蛇的生长造成的长久变化在下面 Ubody.spgrow += foods.mark[foosch];//载入生长区 foods.mark[foosch] = 0;//食物去除标记foods.num--;//食物减少spawnfood(Ubody, enemy, foods, rand()%9+1 , 1);//生成1个 随机分数 的食物 } }
/*//判断是否吃到自己 for(int self = Ubody.tail; self != (Ubody.head+1)%MAXLENGTH; self = (self+1)%MAXLENGTH)  ///一定不要忘记队列化!!!格式self = (self+1)%50!!!!!!!!error!!!! {if(x == Ubody.coordinate[self][0] && y == Ubody.coordinate[self][1]){ifdie = 1;break;}}*///判断是否吃到了别人 for(int self = enemy.tail; self != (enemy.head+1)%MAXLENGTH; self = (self+1)%MAXLENGTH) {if(x == enemy.coordinate[self][0] && y == enemy.coordinate[self][1]){ifdie = 2;break;}         } //判断是吃到到了地雷for(int i = 1; i <= enemy.boom[0][0]; i++){if(x == enemy.boom[i][0] && y == enemy.boom[i][1]){ifdie = 3;break;}} if(ifdie == 0)//如果还没有死{Ubody.head = (Ubody.head+1)%MAXLENGTH;Ubody.coordinate[Ubody.head][0] = x;Ubody.coordinate[Ubody.head][1] = y;//新的身体入队   if(Ubody.spgrow != 0)//有生长空间 {Ubody.spgrow--;Ubody.length++; }else{Ubody.tail = (Ubody.tail+1)%MAXLENGTH;//尾巴出队 }} else//如果死了退出游戏 {//输出游戏状态 window(MAXI+25, MAXJ);showmap(enemy, Ubody, foods);//输出特殊死亡信息 if(ifdie == 1){cout<<Ubody.title<<"蛇 吃掉了自己!"<<endl<<endl;cout<<"详情信息:"<<endl; } else if(ifdie == 2){cout<<Ubody.title<<"蛇 撞到了 "<<enemy.title<<"蛇 的身体上~"<<endl<<endl;cout<<"详情信息:"<<endl;cout<<enemy.title<<"被撞蛇的头部坐标 X = "<<enemy.coordinate[enemy.head][0]<<" Y = "<<enemy.coordinate[enemy.head][1]<<endl;}else if(ifdie == 3){cout<<Ubody.title<<"蛇 撞到了对方的雷上~"<<endl<<endl;cout<<"详情信息:"<<endl;}//输出死亡信息 cout<<Ubody.title<<"蛇 的死亡头部坐标 X = "<<x<<" Y = "<<y<<endl<<endl;cout<<"=============上一个状态==========="<<endl;showsta(Ubody);cout<<endl;showsta(enemy);cout<<"=================================="<<endl;return 1;//返回死亡数值 } return 0;}void setboom(struct snack &Ubody)
{if(Ubody.length <= 6) return;//身体超过6格长就可以放炸弹 //生成地雷    xy保存的是头部坐标int n = ++Ubody.boom[0][0];    //[0]保存的是炸弹个数 int x = Ubody.coordinate[Ubody.head][0];int y = Ubody.coordinate[Ubody.head][1];Ubody.boom[n][0] = x;Ubody.boom[n][1] = y;    Ubody.tail++;//身体长度减一 Ubody.length--;return;
}//                             方向移动数组          保存上一次的动作    用户输入数组     尾部
void mover(struct snack &Ubody, int *next, int sleepme, char &act, char *actinput, int actt)
{for(int t = 0; t <=   sleepme; t++);//sleep用在用户决策前面 char W, A, S, D, E, R;//E放置炸弹  R暂停游戏 if(Ubody.title == 2)//控制转换! {W = 'I'; A = 'J'; S = 'K'; D = 'L'; E = 'O';R = 'R';}else {W = 'W'; A = 'A'; S = 'S'; D = 'D'; E = 'E';R = 'P';} char actsave = act;// actsave用于支持暂停功能 和 防止自吃 for(int i = 0; i <= actt-1; i++)//遍历动作队列 获取移动方向 {if(actinput[i] == W || actinput[i] == A || actinput[i] == S || actinput[i] == D){act = actinput[i];  break;  }}for(int j = 0; j <= actt-1; j++)//遍历动作队列  获取道具 {if(actinput[j] == E){act = actinput[j];break;   }}for(int j = 0; j <= actt-1; j++)//遍历动作队列  获取游戏状态控制字符 {if(actinput[j] == R){act = actinput[j];break; }}next[0] = Ubody.coordinate[Ubody.head][0];next[1] = Ubody.coordinate[Ubody.head][1]; //先赋上当前头部坐标的值     error!!!!!!!!        while(1){//      cout<<act<<mode<<endl; //显示有效的输入状态 //移动 if(act == W){if(actsave != S)//防止自吃 {next[0] += move[0][0];next[1] += move[0][1];}else//纠正方向 {act = actsave;continue;}}else if(act == S){if(actsave != W)//防止自吃 {next[0] += move[1][0];next[1] += move[1][1];} else//纠正方向 重新开始选择,要不头部坐标没有变,next中的坐标是原来的头的坐标,相当与撞上了头 {act = actsave;continue;}}else if(act == A){if(actsave != D)//防止自吃 {next[0] += move[2][0];next[1] += move[2][1];} else//纠正方向 {act = actsave;continue;}}else if(act == D){if(actsave != A)//防止自吃 {next[0] += move[3][0];next[1] += move[3][1];} else//纠正方向 {act = actsave;continue;}}//越界循环处理 //maxj-2 2 //maxi-2 1if(next[0] == 1) next[0] = MAXI-2;else if(next[0] == MAXI-1) next[0] = 2;if(next[1] == 1) next[1] = MAXJ-2;else if(next[1] == MAXJ-1) next[1] = 2;道具 if(act == R){cout<<"已暂停!\n";system("pause");act = actsave;continue;}if(act == E){setboom(Ubody);act = actsave;//注意这个!!!!否则会撞头 continue;} break;//这个while只能靠continue实现其循环功能 }/// return;
}void diegames(void)
{cout<<"Game Over!!!"<<endl<<endl;int hhh = 0; while(1){       system("pause>nul");for(int hhi = ++hhh; hhi >= 0; hhi--) cout<<"哈";cout<<endl;   }return;
} int main(void)
{   srand((unsigned)time(0));//更新苹果生成种子window(MAXI+7, MAXJ);char act1,act2,actinput[MAXINPUT];//actinput记录用户输入的所有动作 int                    actt;//数尾部 int next[2] = {0};//两条蛇共用一个next,next用来储存下一个方块的坐标,并用来判断该坐标时候否合法 struct snack body1;body1.title = 1;body1.length = 1;body1.head = 0;body1.tail = 0;//头尾相等body1.spgrow = 0;body1.boom[0][0] = 0;//要初始化! body1.coordinate[0][0] = MAXI/2-1;body1.coordinate[0][1] = MAXJ/2-1;act1 =  'D';   //要初始化action 要不然会一直撞头!!!!!   struct snack body2;body2.title = 2;body2.length = 1;body2.head = 0;body2.tail = 0;//头尾相等body2.spgrow = 0;body2.boom[0][0] = 0;//要初始化! body2.coordinate[0][0] = MAXI/2+1;body2.coordinate[0][1] = MAXJ/2+1;act2 =  'J';   //要初始化action 要不然会一直撞头!!!!!    struct foodinfo foods;foods.num = 0;for(int inifoods = 0; inifoods <= MAXFOOD-1; inifoods++) foods.mark[inifoods] = 0;//对mark进行初始化 spawnfood(body1, body2, foods, 1, 30);//提前生成5个苹果 showmenu();//输出菜单 cin>>level;switch(level){case 0: sleepme = 600000000;break;case 1: sleepme = 100000000;break;case 2: sleepme = 50000000;break;case 3: sleepme = 10000000;break;case 4: sleepme = 2500000;break;case 5: sleepme = 100000;break;default: sleepme = 10000000;break;}system("cls"); while(1){ actt = 0;while(kbhit())//无阻断的获取键盘信息{actinput[actt++] = getch();}mover(body1, next, sleepme, act1, actinput, actt); //mover产生新的坐标 ,以及各种道具 if(grow(body1, body2, foods, next[0], next[1]) == 1)//grow负责判断合法性以及实现身体的变化 break;mover(body2, next, sleepme, act2, actinput, actt);//此时next被覆盖 if(grow(body2, body1, foods, next[0], next[1]) == 1)break;  showmap(body1, body2, foods);showsta(body1);showsta(body2);}//死亡后小游戏diegames();return 0;
}

诶,在b站上看到dalao仅仅用18行就写出了一个贪吃蛇的雏形,我裂开。。。。
以后再来优化它的算法吧
万一将来成为了dalao 这也是一个好玩的回忆哇
(/ω\)

闲来无聊编的贪吃蛇最终版本相关推荐

  1. 用c语言编一个贪吃蛇,刚学C语言,想写一个贪吃蛇的代码

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include #include typedef struct snake { int a; int b; stru ...

  2. 结对-贪吃蛇-最终程序

    项目地址:https://gitee.com/ningshuyoumeng/JieDuiBianCheng-TanChiShe-DaiMa 结对成员: 学号:2015035107140(张晓亮) 学号 ...

  3. 结对-结对编项目贪吃蛇-设计文档

    1.引言 1.1编写目的 1.2背景 1.3开发工具 语言 1.4术语说明 1.5参考资料 2.数据结构设计 2.1蛇 食物表示 2.2蛇移动 2.3蛇移动的方向 2.4蛇身移动方向 2.5吃到食物判 ...

  4. c语言链表贪吃蛇教程,编《贪吃蛇》最简单的算法,链表法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include #include #include #define ESC 0x011b #define UP 0x ...

  5. Python自制游戏:还原经典款贪吃蛇,表弟玩着玩着都哭了(附源码)

    文章目录 一.写在前面 二.准备工作 1.用到的软件 2.用到的模块 三.来吧 展示 四.效果 五.打包成exe可执行文件 一.写在前面 贪吃蛇这个游戏,在游戏机横行的年代,基本上闲下来就会玩玩贪吃蛇 ...

  6. 厉害了!巾帼不让须眉,女程序员逆战贪吃蛇大作战,众人惊呆了

    这篇文章主要为大家细致介绍了下C语言结构数组实现贪吃蛇小游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,欢迎大家共同学习和研究,源码内已做了详细的注释.需要的小伙伴可以私信滴滴小编. 贪吃蛇大 ...

  7. 怎么用python编贪吃蛇_少儿编程分享:手把手教你用PYTHON编写贪吃蛇(二)

    原标题:少儿编程分享:手把手教你用PYTHON编写贪吃蛇(二) 检测和判断 无论我们制作的简单或者复杂的游戏 这都是最关键的两个部分 事件处理循环 61. while True: # 游戏主循环 62 ...

  8. 闲着没事,自己做贪吃蛇耍耍?

    前言 相信大家都玩过贪吃蛇这个游戏, 那你们想不想自己也做一做呢?可能会有人说很难把,不,其实不难,因为博主也是JS的入门小白,但是博主今天把贪吃蛇做出来了,做这个项目的时候,有一个小门槛给我卡住了, ...

  9. C++之自编控制台程序——贪吃蛇(原创)

    初学C++,利用C的基础完成了控制台程序贪吃蛇.代码如下 #include <ctime> #include <conio.h> #include <iostream&g ...

最新文章

  1. 【错误记录】GitHub 提交代码失败、获取代码失败、连接超时、权限错误、ping 请求连接超时 ( 查找域名对应 IP | 设置 host 文件 )
  2. QT5生成可执行文件总结
  3. 【渝粤教育】广东开放大学 云计算技术与应用 形成性考核
  4. 天津工业大学c语言题库,天津工业大学it1创新2届c语言期末复习.ppt
  5. Linux—编写shell脚本操作数据库执行sql
  6. 盲目自信、能力不足、年少轻狂,这是我创业失败后总结的3条血泪事实
  7. UVA - 10066The Twin Towers(LIS)
  8. Android简易实战教程--第三十八话《自定义通知NotifiCation》
  9. 刚刚,10位青年学者获得阿里达摩院青橙奖,钟南山寄语,每人100万,最小获奖者28岁
  10. 产品经理交互设计师必备的已分类的《产品Axure原型库》
  11. mac常用基本操作笔记
  12. 成人世界的人际交往中有哪些潜规则?
  13. linux 解锁用户被锁
  14. 对HBase整个框架的理解
  15. springboot 获取访问接口的请求的IP地址
  16. 香港大学的计算机专业,面试香港大学的计算机专业该怎么表现?
  17. 女式瑜伽服-市场现状及未来发展趋势
  18. ubuntu 终端中连接有线网络的命令
  19. English-英语学习杂志及资料
  20. Angular 4官方文档(二)【数据的展现】

热门文章

  1. html自动播放音乐(无播放器)
  2. 英雄联盟服务器维护2020.3.17,lol英雄联盟3月17日停机维护几点结束 2020年3.17lol英雄联盟更新维护什么内容?...
  3. OP320A 文本显器生产方案 另有源码原理图 兼容OP320A MD204L
  4. 计算机社团活动策划书模板,2021大学生计算机社团创建活动策划书
  5. 解决时代光华挂课程序出现验证码的问题(时代光华挂课程序篇二)
  6. PyTorch学习笔记:针对一个网络的权重初始化方法
  7. python 图像处理 角点检测算法 Harris和Shi-tomasi
  8. 人人必背申论范文:致敬冬奥健儿
  9. oracle解决00302,oracle exp出现ORA-00302:必须说明SET_NO_OUTLINES 组件 解决方法
  10. 美团项目 --- 注册、登录、退出4