C++ 双人贪吃蛇
来源:互联网 发布:n3450 ubuntu 编辑:程序博客网 时间:2024/04/30 13:51
这篇代码基于博主的“C++ 贪吃蛇基本算法”,加入第二只蛇让他移动并不难,但考虑到要让两只蛇的移动互不干扰那还真是破事真多。博主将“C++ 贪吃蛇基本算法”中的while(1)改成了goto,以用来将两条蛇的计数器分开,并加入了变量“move”来判断按键是操纵谁。在这篇代码中,switch()函数可能阅读起来非常困难,因为蛇2输入的按键与地图上的字符不匹配,所以这篇代码看起来并不是很明了。由于太麻烦,所以我设定成只要一条蛇GG游戏就GG。事实上改变蛇头的颜色并不是很难,但我实在懒。
#include <iostream>#include <windows.h>#include <cstring>#include <time.h>#include <conio.h>using namespace std;int error1(char x,char y){ if(x<y) if((y-x==3)||(y-x==4)) return 1; if(x>y) if((x-y==3)||(x-y==4)) return 1; if(x==y) return 1; return 0;}int error2(char x,char y){ if(x<y) if(y-x==2) return 1; if(x>y) if(x-y==2) return 1; if(x==y) return 1; return 0;}//纠正强行自噬 int Pos(long x,long y){ HANDLE direct=GetStdHandle(STD_OUTPUT_HANDLE); COORD pos={x,y}; SetConsoleCursorPosition(direct,pos);}//改变光标位置int Color(long clr){ HANDLE direct=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(direct,clr);}//改变输出颜色 int Show(long judge){ HANDLE direct=GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO cci; GetConsoleCursorInfo(direct,&cci); cci.bVisible=judge; SetConsoleCursorInfo(direct,&cci); } //是否显示光标 int main(){ char map[15][18]; char Key1,Keys1,Key2,Keys2,Key; long xh1,yh1,xt1,yt1,start1,timeover1; long xh2,yh2,xt2,yt2,start2,timeover2; long xm,ym,level,move; long X,Y; memset(map,' ',sizeof(map)); for(long i=0;i<=14;i++) { if((i==0)||(i==14)) for(long j=0;j<=17;j++) map[i][j]='b'; else map[i][0]=map[i][17]='b'; } //地图初始化 xh1=7,yh1=9; xt1=7,yt1=8; map[xt1][yt1]='d'; map[xh1][yh1]='h'; //蛇1初始化 xh2=4,yh2=9; xt2=4,yt2=8; map[xt2][yt2]='D'; map[xh2][yh2]='H'; //蛇2初始化 for(long i=1;i<=2;i++) { srand(time(0)); do{ xm=rand()%13+1; ym=rand()%16+1; }while(map[xm][ym]!=' '); map[xm][ym]='m'; } //出米 Pos(22,8); cout<<"please input the level(1-8): "; cin>>level; //输入等级 Show(0); X=20;Y=3; Pos(X,Y); for(long i=0;i<=14;i++) { for(long j=0;j<=17;j++) { switch(map[i][j]) { case 'b': Color(0x02); cout<<"■"; Color(0x0F); break; case 'w':case 'a':case 's':case 'd':case 'h': Color(0x01); cout<<"■"; Color(0x0F); break; case 'W':case 'A':case 'S':case 'D':case 'H': Color(0x04); cout<<"■"; Color(0x0F); break; case 'm': Color(0x03); cout<<"■"; Color(0x0F); break; case ' ': cout<<" "; break; } } Y++; Pos(X,Y); } //输出棋盘 Key1='d'; Key2='l'; timeover1=1;timeover2=1; start1=clock();start2=clock(); move=0; loop: while((timeover1=(clock()-start1<=(900-level*100)))&&(timeover2=(clock()-start2<=(900-level*100)))&&!kbhit()); if(timeover1&&timeover2) { Key=getch(); switch(Key) { case 'W':case 'w': case 'S':case 's': case 'A':case 'a': case 'D':case 'd': Keys1=Key1;Key1=Key;move=1;break; case 'I':case 'i': case 'K':case 'k': case 'J':case 'j': case 'L':case 'l': Keys2=Key2;Key2=Key;move=2;break; } if(move==1) if(error1(Key1,Keys1)) { Key1=Keys1; goto loop; } if(move==2) if(error2(Key2,Keys2)) { Key2=Keys2; goto loop; } } //判断按键归属 if(move==1||!timeover1) { switch(Key1) { case 'W':case 'w':map[xh1][yh1]='w';xh1--;break; case 'S':case 's':map[xh1][yh1]='s';xh1++;break; case 'A':case 'a':map[xh1][yh1]='a';yh1--;break; case 'D':case 'd':map[xh1][yh1]='d';yh1++;break; } } if(move==2||!timeover2) { switch(Key2) { case 'I':case 'i':map[xh2][yh2]='W';xh2--;break; case 'K':case 'k':map[xh2][yh2]='S';xh2++;break; case 'J':case 'j':map[xh2][yh2]='A';yh2--;break; case 'L':case 'l':map[xh2][yh2]='D';yh2++;break; } } //依照归属进行操纵 if(move==1||!timeover1) { if(map[xh1][yh1]!=' '&&map[xh1][yh1]!='m') { Pos(30,18); cout<<"GameOver1"; return 0; } } if(move==2||!timeover2) { if(map[xh2][yh2]!=' '&&map[xh2][yh2]!='m') { Pos(30,18); cout<<"GameOver2"; return 0; } } //游戏结束 if(move==1||!timeover1) { X=20+yh1*2;Y=3+xh1; Pos(X,Y); Color(0x01); cout<<"■"; Color(0x0F); if(map[xh1][yh1]=='m') { map[xh1][yh1]='h'; srand(time(0)); do{ xm=rand()%13+1; ym=rand()%16+1; }while(map[xm][ym]!=' '); map[xm][ym]='m'; X=20+ym*2;Y=3+xm; Pos(X,Y); Color(0x03); cout<<"■"; Color(0x0F); //出米 } else { map[xh1][yh1]='h'; X=20+yt1*2;Y=3+xt1; Pos(X,Y); cout<<" "; switch(map[xt1][yt1]) { case 'w':map[xt1][yt1]=' ';xt1--;break; case 's':map[xt1][yt1]=' ';xt1++;break; case 'a':map[xt1][yt1]=' ';yt1--;break; case 'd':map[xt1][yt1]=' ';yt1++;break; } } //移动蛇1头与尾 move=0; timeover1=1; start1=clock(); goto loop; //回到开始 } if(move==2||!timeover2) { X=20+yh2*2;Y=3+xh2; Pos(X,Y); Color(0x04); cout<<"■"; Color(0x0F); if(map[xh2][yh2]=='m') { map[xh2][yh2]='H'; srand(time(0)); do{ xm=rand()%13+1; ym=rand()%16+1; }while(map[xm][ym]!=' '); map[xm][ym]='m'; X=20+ym*2;Y=3+xm; Pos(X,Y); Color(0x03); cout<<"■"; Color(0x0F); //出米 } else { map[xh2][yh2]='H'; X=20+yt2*2;Y=3+xt2; Pos(X,Y); cout<<" "; switch(map[xt2][yt2]) { case 'W':map[xt2][yt2]=' ';xt2--;break; case 'S':map[xt2][yt2]=' ';xt2++;break; case 'A':map[xt2][yt2]=' ';yt2--;break; case 'D':map[xt2][yt2]=' ';yt2++;break; } } //移动蛇2头与尾 move=0; timeover2=1; start2=clock(); goto loop; //回到开始 }}
0 0
- c语言版本双人贪吃蛇
- WinAPI双人贪吃蛇
- C++ 双人贪吃蛇
- 双人版的贪吃蛇
- 双人贪吃蛇@botzone数据格式
- 双人贪吃蛇@botzone算法设计
- HTML5小试 双人贪吃蛇
- AVR 单片机小学期 12864液晶 双人贪吃蛇游戏
- 贪吃蛇大作战双人版完整代码
- 纯新手写的双人贪吃蛇,欢迎高手拍转
- 贪吃蛇C实现
- 贪吃蛇C代码
- C代码 贪吃蛇
- [C++] Console 贪吃蛇
- c 贪吃蛇
- C版贪吃蛇
- 贪吃蛇(C语言版)
- 贪吃蛇,c,c++
- java2ee Spring学习计划
- 数据库的4个基本概念
- JAVA学习代码——追加文件内容的三种方法
- Android学习历程22-Android修改状态栏颜色和标题栏颜色一致
- NTFS for mac官方版
- C++ 双人贪吃蛇
- JS 判断 浏览器 是否禁用Cookie
- WPF数据提供者ObjectDataProvider
- 深入servlet(一)
- 关于MFi认证你所必须要知道的事情
- 来自官方的Android数据绑定(Data Binding)框架② Read more: http://blog.chengyunfeng.com/?p=735#ixzz4HkFGb2dc
- 微信支付V3版本地签名统一下单android端详解
- 《数据结构与算法》学习笔记6 选择排序
- SlidingMenu导入AndroidStudio