贪吃蛇
来源:互联网 发布:口腔 医生 知乎 编辑:程序博客网 时间:2024/04/30 13:59
#include<cstdio>#include<cstdlib>#include<cstring>#include<windows.h>#include<conio.h>#include<iostream>#include<ctime>#define LEFT 1#define RIGHT 2#define UP 3#define DOWN 4#define FOODMAX -2#define FOOD -1#define F 100000#define MMM 707070 //乱打的标记数 怪物占位数#define AMMO 503853 //BOSS子弹占位数#define PYS 392002 //蛇子弹占位数#define KIND int#define IN_map(x,y) 1<=x && x<=m && 1<=y && y<=n using namespace std;int map[1000][1000],map_t[1000][1000];int flag=0,ma_flag=0;int n=50,m=30,foodn=0,e=0; struct pos{ int x,y;};struct SKILL{ char key; char file[100]; int num;}list[1000];pos maste;class Snake{ public:pos head,end; public:int boss; public:int len,fx,ex; public:void spawn(int x,int y) //生成蛇 { map[x][y]=F; ex=0; this->fx=RIGHT; this->len=0; this->head.x=x,this->head.y=y; this->end.x=x,this->end.y=y; return; } public:void move() //蛇的移动 { int gg=1; if(fx==UP) { if(map[this->head.x-1][this->head.y]!=0 && map[this->head.x-1][this->head.y]!=FOOD) flag=1; else if(map[this->head.x-1][this->head.y]==FOOD) {foodn--;gg=0;} map[this->head.x-1][this->head.y]=F; //F是指头 map[this->head.x][this->head.y]=UP; this->head.x-=1; } if(fx==DOWN) { if(map[this->head.x+1][this->head.y]!=0 && map[this->head.x+1][this->head.y]!=FOOD) flag=1; else if(map[this->head.x+1][this->head.y]==FOOD) {foodn--;gg=0;} map[this->head.x+1][this->head.y]=F; map[this->head.x][this->head.y]=DOWN; this->head.x+=1; } if(fx==LEFT) { if(map[this->head.x][this->head.y-1]!=0 && map[this->head.x][this->head.y-1]!=FOOD) flag=1; else if(map[this->head.x][this->head.y-1]==FOOD) {foodn--;gg=0;} map[this->head.x][this->head.y-1]=F; map[this->head.x][this->head.y]=LEFT; this->head.y-=1; } if(fx==RIGHT) { if(map[this->head.x][this->head.y+1]!=0 && map[this->head.x][this->head.y+1]!=FOOD) flag=1; else if(map[this->head.x][this->head.y+1]==FOOD) {foodn--;gg=0;} map[this->head.x][this->head.y+1]=F; map[this->head.x][this->head.y]=RIGHT; this->head.y+=1; } if(gg==1 && !this->ex) //这里是指如果吃到FOOD那么就不删除尾节点,与将头结点向前移一位结合,就形成了增长的效果 { int tx=this->end.x,ty=this->end.y; if(map[tx][ty]==UP) this->end.x-=1; if(map[tx][ty]==DOWN) this->end.x+=1; if(map[tx][ty]==LEFT) this->end.y-=1; if(map[tx][ty]==RIGHT) this->end.y+=1; map[tx][ty]=0; return; } this->len++; return; }};class Ammo //空格发射子弹{ public:pos state; public:KIND Cmd; public:int fx,step,alive; Ammo() { this->alive=0; } public:void create(int x,int y,KIND arg) { if(map[x][y]!=0) return; map[x][y]=Cmd; this->state.x=x; this->Cmd=arg; this->state.y=y; this->alive=1; return; } public:void shoot() { if(this->fx==UP) { if(map[this->state.x-1][this->state.y]==F) flag=1; if(map[this->state.x-1][this->state.y]!=0 && !(map[this->state.x-1][this->state.y]==AMMO)){/*map[this->state.x][this->state.y]=0*/;this->alive=0;return;} if(this->state.x-1<=1 || this->state.x-1>=m || this->state.y<=1 || this->state.y>=n){/*map[this->state.x][this->state.y]=0*/;this->alive=0;return;} map[this->state.x-1][this->state.y]=Cmd; map[this->state.x][this->state.y]=0; state.x-=1; } else if(this->fx==DOWN) { if(map[this->state.x+1][this->state.y]==F) flag=1; if(map[this->state.x+1][this->state.y]!=0 && !(map[this->state.x+1][this->state.y]==AMMO)){/*map[this->state.x][this->state.y]=0*/;this->alive=0;return;} if(this->state.x+1<=1 || this->state.x+1>=m || this->state.y<=1 || this->state.y>=n){/*map[this->state.x][this->state.y]=0*/;this->alive=0;return;} map[this->state.x+1][this->state.y]=Cmd; map[this->state.x][this->state.y]=0; state.x+=1; } else if(this->fx==LEFT) { if(map[this->state.x][this->state.y-1]==F) flag=1; if(map[this->state.x][this->state.y-1]!=0 && !(map[this->state.x][this->state.y-1]==AMMO)){/*map[this->state.x][this->state.y]=0;*/this->alive=0;return;} if(this->state.x<=1 || this->state.x>=m || this->state.y-2<=1 || this->state.y-2>=n){/*map[this->state.x][this->state.y]=0;*/this->alive=0;return;} map[this->state.x][this->state.y-1]=Cmd; map[this->state.x][this->state.y]=0; state.y-=1; } else if(this->fx==RIGHT) { if(map[this->state.x][this->state.y+1]==F) flag=1; if(map[this->state.x][this->state.y+1]!=0 && !(map[this->state.x][this->state.y+1]==AMMO)){/*map[this->state.x][this->state.y]=0*/;this->alive=0;return;} if(this->state.x<=1 || this->state.x>=m || this->state.y+2<=1 || this->state.y+2>=n){/*map[this->state.x][this->state.y]=0*/;this->alive=0;return;} map[this->state.x][this->state.y+1]=Cmd; map[this->state.x][this->state.y]=0; state.y+=1; } return; } };void hide(){ ShowCursor(false); HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO cci; GetConsoleCursorInfo(hOut,&cci); cci.bVisible=false; SetConsoleCursorInfo(hOut,&cci);}void init() //不必在意{ FILE *fp=fopen("install.info","r"); if(fp==NULL) return; char str[100],kk; int ns=0,conts=0; while(~fscanf(fp,"%d %c %s",&ns,&kk,&str) && conts<100) { conts++; list[++e].num=ns; list[e].key=kk; strcat(list[e].file,str); } for(int i=1;i<=e;i++,Sleep(100)) printf("Get Plugin:%d %c %s\n",list[i].num,list[i].key,list[i].file); system("cls");}void cls() //清屏{ ShowCursor(false); HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO cci; SetConsoleCursorPosition(hOut,(COORD){0,0});}void draw(int score,int x,int y) //显示图{ for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { if(i==1 || j==1 || i==m || j==n) printf("#"); else if(map[i][j]==0) printf(" "); else if(map[i][j]!=0) { if(map[i][j]==F) printf("@"); else if(1<=map[i][j] && map[i][j]<=4) printf("*"); else if(map[i][j]==FOOD) printf("X"); else if(map[i][j]==MMM) printf("O"); else if(map[i][j]==AMMO) printf("$"); else if(map[i][j]==PYS) printf("K"); } } puts(""); } printf(" score:%d\n",score); printf(" X:%d Y:%d\n",x,y); return ;}void spawn() //生成怪物{ if(ma_flag==1) return; int tx=rand()%m,ty=rand()%n; if(map[tx][ty]==0 && 3<tx && tx<m-3 && 3<ty && ty<n-3) { if(map[tx+1][ty-1]==0 && map[tx+1][ty]==0 && map[tx+1][ty+1]==0 && map[tx][ty-1]==0 && map[tx][ty]==0 && map[tx][ty+1]==0 && map[tx-1][ty-1]==0 && map[tx-1][ty]==0 && map[tx-1][ty+1]==0) { maste.x=tx; maste.y=ty; ma_flag=1; map[maste.x+1][maste.y-1]=map[maste.x+1][maste.y]=map[maste.x+1][maste.y+1]=MMM; map[maste.x][maste.y-1]=map[maste.x][maste.y]=map[maste.x][maste.y+1]=MMM; map[maste.x-1][maste.y-1]=map[maste.x-1][maste.y]=map[maste.x-1][maste.y+1]=MMM; } }}void boss(int num) //不必在意{ //cout<<list[num].num; int ans=list[num].num,s=1; while(s<=ans) { char sss[100]; memcpy(sss,list[num].file,sizeof(list[num].file)); char sg,ta[10]; sg=s+'0'; ta[0]=sg,ta[1]='\0'; strcat(sss,ta); Sleep(50); FILE *fp=fopen(sss,"r"); if(fp==NULL) return; for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) { char pos; fscanf(fp,"%c",&pos); if(pos=='\n'){j--;continue;} map_t[i][j]=(int)(pos-'0'); } for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { if(map_t[i][j]==1) printf("*"); else printf(" "); if(map[i][j]==MMM) { map[i][j]=0; ma_flag=0; } if(map[i][j]==AMMO) map[i][j]=0; if(map[i][j]==PYS) map[i][j]=0; } puts(""); } s++; fclose(fp); cls(); } }void ma_move(Snake *s) //怪物向S移动{ if(ma_flag) { int a=maste.x,b=maste.y; if(s->head.x-a>0) //向下 { maste.x+=1; map[a-1][b-1]=map[a-1][b]=map[a-1][b+1]=0; if(map[a+2][b-1]!=0 || map[a+2][b]!=0 || map[a+2][b+1]!=0) {ma_flag=0;goto s;} map[a+2][b-1]=map[a+2][b]=map[a+2][b+1]=MMM; } else if(s->head.y-b>0) //向右 -= { maste.y+=1; map[a-1][b-1]=map[a][b-1]=map[a+1][b-1]=0; if(map[a-1][b+2]!=0 || map[a][b+2]!=0 || map[a+1][b+2]!=0) {ma_flag=0;goto s;} map[a-1][b+2]=map[a][b+2]=map[a+1][b+2]=MMM; } else if(s->head.x-a<0) //向上 { maste.x-=1; map[a+1][b-1]=map[a+1][b]=map[a+1][b+1]=0; if(map[a-2][b-1]!=0 || map[a-2][b]!=0 || map[a-2][b+1]!=0) {ma_flag=0;goto s;} map[a-2][b-1]=map[a-2][b]=map[a-2][b+1]=MMM; } else if(s->head.y-b<0) //向左 --BUG { maste.y-=1; map[a-1][b+1]=map[a][b+1]=map[a+1][b+1]=0; if(map[a-1][b-2]!=0 || map[a][b-2]!=0 || map[a+1][b-2]!=0) {ma_flag=0;goto s;} map[a-1][b-2]=map[a][b-2]=map[a+1][b-2]=MMM; } s: if(ma_flag==0) //撞到东西怪物死亡 { for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) if(map[i][j]==MMM) map[i][j]=0; } }}int play_1() //主进程{ cls(); Snake player_1; player_1.spawn(m/2,n/2); //出生 int scor=0; player_1.move(); //移动 draw(scor,player_1.head.x,player_1.head.y); int zh=0; Ammo skill[20]; Ammo py[30]; int ammonum=0; int ff=0; while(flag==0 && (1<=player_1.head.x && player_1.head.x<=m && 1<=player_1.head.y && player_1.head.y<=n)) //如果没死且没撞墙 { Sleep(10);//调节速度,也可去掉 player_1.boss=0; //毫无意义的东西 int ggg=0,ggk=0; //标记是否还有子弹存在 for(int i=1;i<=5;i++) if(py[i].alive==1) { py[i].shoot(); //移动子弹 ggk=1; } for(int i=1;i<=12;i++) if(skill[i].alive==1) { skill[i].shoot(); ggg=1; } zh++; cls(); if(kbhit()) { char cmd=getch(); for(int i=1;i<=e;i++) if(cmd==list[i].key) boss(i); switch(cmd) //按键 { case 'W': case 'w': if(player_1.fx==UP || player_1.fx==DOWN) break; player_1.fx=UP; //更新方向 break; case 'A': case 'a': if(player_1.fx==RIGHT || player_1.fx==LEFT) break; player_1.fx=LEFT; break; case 'D': case 'd': if(player_1.fx==RIGHT || player_1.fx==LEFT) break; player_1.fx=RIGHT; break; case 'S': case 's': if(player_1.fx==UP || player_1.fx==DOWN) break; player_1.fx=DOWN; break; case ' ': //放子弹 player_1.boss=1; break; case 'g': //开挂 if(player_1.ex==0) player_1.ex=1; else player_1.ex=0; break; case 'n': if(!ff) ff=1; else ff=0; break; default: break; } } if(foodn<=0) //如果没有FOOD,则生成 while(1) { int x=rand()%m,y=rand()%n; if(map[x][y]==0 && 1<x && x<m && 1<y && y<n) { map[x][y]=FOOD; foodn++; scor++; break; } } if(player_1.boss && !ggk) //放子弹 { int bornx,borny; py[1].fx=player_1.fx; py[2].fx=player_1.fx; py[3].fx=player_1.fx; if(player_1.fx==LEFT) { bornx=player_1.head.x; borny=player_1.head.y-2; py[1].create(bornx-1,borny,PYS); py[2].create(bornx,borny,PYS); py[3].create(bornx+1,borny,PYS); } else if(player_1.fx==RIGHT) { bornx=player_1.head.x; borny=player_1.head.y+2; py[1].create(bornx-1,borny,PYS); py[2].create(bornx,borny,PYS); py[3].create(bornx+1,borny,PYS); } else if(player_1.fx==UP) { bornx=player_1.head.x-2; borny=player_1.head.y; py[1].create(bornx,borny-1,PYS); py[2].create(bornx,borny,PYS); py[3].create(bornx,borny+1,PYS); } else if(player_1.fx==DOWN) { bornx=player_1.head.x+2; borny=player_1.head.y; py[1].create(bornx,borny-1,PYS); py[2].create(bornx,borny,PYS); py[3].create(bornx,borny+1,PYS); } player_1.boss=0; } if(player_1.len>=10 && !ma_flag && !ff){ spawn();scor+=20;} //生成怪物 if(zh%5==0 && ma_flag) ma_move(&player_1); //移动BOSS int sk=rand()%10; if(sk<5 && !ggg && ma_flag && !ff) //怪物放子弹 { skill[1].create(maste.x+4,maste.y-1,AMMO); skill[1].fx=DOWN; skill[2].create(maste.x+4,maste.y,AMMO); skill[2].fx=DOWN; skill[3].create(maste.x+4,maste.y+1,AMMO); skill[3].fx=DOWN; skill[4].create(maste.x-4,maste.y-1,AMMO); skill[4].fx=UP; skill[5].create(maste.x-4,maste.y,AMMO); skill[5].fx=UP; skill[6].create(maste.x-4,maste.y+1,AMMO); skill[6].fx=UP; skill[7].create(maste.x-1,maste.y+4,AMMO); skill[7].fx=RIGHT; skill[8].create(maste.x,maste.y+4,AMMO); skill[8].fx=RIGHT; skill[9].create(maste.x+1,maste.y+4,AMMO); skill[9].fx=RIGHT; skill[10].create(maste.x-1,maste.y-4,AMMO); skill[10].fx=LEFT; skill[11].create(maste.x,maste.y-4,AMMO); skill[11].fx=LEFT; skill[12].create(maste.x+1,maste.y-4,AMMO); skill[12].fx=LEFT; } player_1.move(); draw(scor,player_1.head.x,player_1.head.y); //显示地图 zh%=100000007; } system("cls"); printf(" LOSE!!!!\n Again\n"); getchar(); system("cls"); player_1.len=0; ma_flag=0; return 0;}int play_2() //同上,只是多一个人{ cls(); Snake player_1,player_2; player_1.spawn(m/2,n/2); player_1.move(); player_2.spawn(10,10); player_2.move(); draw(0,player_1.head.x,player_1.head.y); int zh=0; while(flag==0 && (1<=player_1.head.x && player_1.head.x<=m && 1<=player_1.head.y && player_1.head.y<=n) && (1<=player_2.head.x && player_2.head.x<=m && 1<=player_2.head.y && player_2.head.y<=n)) { zh++; Sleep(10); cls(); if(kbhit()) { char cmd=getch(); switch(cmd) { case 'W': case 'w': if(player_1.fx==UP || player_1.fx==DOWN) break; player_1.fx=UP; break; case '5': if(player_2.fx==UP || player_2.fx==DOWN) break; player_2.fx=UP; break; case 'A': case 'a': if(player_1.fx==RIGHT || player_1.fx==LEFT) break; player_1.fx=LEFT; break; case '1': if(player_2.fx==RIGHT || player_2.fx==LEFT) break; player_2.fx=LEFT; break; case 'D': case 'd': if(player_1.fx==RIGHT || player_1.fx==LEFT) break; player_1.fx=RIGHT; break; case '3': if(player_2.fx==RIGHT || player_2.fx==LEFT) break; player_2.fx=RIGHT; break; case 'S': case 's': if(player_1.fx==UP || player_1.fx==DOWN) break; player_1.fx=DOWN; break; case '2': if(player_2.fx==UP || player_2.fx==DOWN) break; player_2.fx=DOWN; break; case 'g': if(player_1.ex==0) player_1.ex=1; else player_1.ex=0; break; case '9': if(player_2.ex==0) player_2.ex=1; else player_2.ex=0; break; default: break; } } if(foodn<=0) while(1) { int x=rand()%m,y=rand()%n; if(map[x][y]==0 && 1<x && x<m && 1<y && y<n) { map[x][y]=FOOD; foodn++; break; } } if(player_1.len>=20 || player_2.len>=20) spawn(); if(zh%177==0) ma_move(&player_1); if(zh%13==0) ma_move(&player_2); player_1.move(); player_2.move(); draw(0,player_1.head.x,player_1.head.y); zh%=100000007; } system("cls"); printf(" LOSE!!!!\n Again\n"); getchar(); system("cls"); player_1.len=0; player_2.len=0; ma_flag=0; return 0;}int menu(){ printf(" *****************************************\n"); printf(" * The Snack Game *\n"); printf(" * -To Commemorate LSZ Who Has Gone *\n"); printf(" * 1.Play now 1 player *\n"); printf(" * *\n"); printf(" * 2.Play now 2 player *\n"); printf(" * *\n"); printf(" * 3.Help *\n"); printf(" * *\n"); printf(" * 4.Change Color *\n"); printf(" * *\n"); printf(" *****************************************\n"); printf(" Please Input:");}int main(){ int i,j,k,m,n; hide(); srand(time(0)); while(1) { system("cls"); init(); menu(); char c; scanf("%c",&c); if(c=='1') while(1) { system("cls"); foodn=0; flag=0; play_1(); memset(map,0,sizeof(map)); } if(c=='2') while(1) { system("cls"); foodn=0; flag=0; play_2(); memset(map,0,sizeof(map)); } else if(c=='3') { system("cls"); printf(" There Is Noting For Help!!!!!\n"); printf(" You Don Not 贪吃蛇?????\n"); printf(" You Kidding me???? 'a' to LEFT 'd' to RIGHT 'w' to UP 's' to DOWN!\n"); printf(" *:The Snack\n"); printf(" @:The Head\n"); printf(" X:The Food\n"); printf(" #:The Wall\n"); getchar(); getchar(); } else if(c=='4') { char c='0',c2='0'; int arg=rand()%7; int arg2=rand()%7; c=c+arg;c2=c2+arg2; char ss[2]; ss[0]=c,ss[1]=c2; ss[2]='\0'; char sss[100]="color "; strcat(sss,ss); system(sss); } } return 0;}
0 0
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- Java NIO之 Java NIO Overview(译)
- Idea上使用Gradle构建Spark项目
- nodejs ejs前端模板学习
- powerDesiner16.5建立oracle数据库模型
- 屏幕适配
- 贪吃蛇
- Android官方开发文档Training系列课程中文版:如何避免ANR?
- 数据仓库学习
- ORACLE 之间的OGG配置
- CocosStudio(一)创建CocosStudio项目
- shell shift
- 输入三条边的长度,如果这三条边能构成三角形,则需要计算三角形面积,如果不能构成三角形则输出提示信息 "error input"。输出的面积按两位小数方式输出
- OpenCV中KeyPoint类
- C# .Net读写文件 IO流 C# .Net对文件&文件夹操作