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
原创粉丝点击