C++高质量双模式贪吃蛇

按道理来说,想对蛇的位置刷新要用清空屏幕,但那样会闪屏。

因此我用了一项新技术:队列储存法,具体作用请看程序。

小小蒟蒻,代码可能有点繁琐,请谅解

/*支持一下吧 作者:Computer_Devon*/ 
#include<bits/stdc++.h>
#include<windows.h>
#define VK_z 0x25	//左键数值 
#define VK_x 0x28	//下键数值 
#define VK_y 0x27	//右键数值 
#define VK_u 0x26	//上键数值 
#define VK_sh 0x20	//空格键数值 (加速) 
#define VK_en 0x0D	//回车键数值 
#define VK_c 67		//C键数值(减速) 
using namespace std;
int fx=0,mx,my,jx,jy,len=-1,ttt=100;
bool sm,aajj,st,sss,_map_[100][100];
vector<long long> sx,sy;	//队列定义 
/*支持一下吧 Computer_Devon*/ 
void winSize(int lines_height,int cols_width){		//控制屏幕 
    char cmd[100];
    sprintf(cmd,"mode con cols=%d lines=%d",lines_height,cols_width);
    system(cmd);
}
void aj(){		//键位判断 
    if(GetAsyncKeyState(VK_u)&&fx!=2&&aajj==0) fx=1,aajj=1;
    if(GetAsyncKeyState(VK_x)&&fx!=1&&aajj==0) fx=2,aajj=1;
    if(GetAsyncKeyState(VK_z)&&fx!=4&&aajj==0) fx=3,aajj=1;
    if(GetAsyncKeyState(VK_y)&&fx!=3&&aajj==0) fx=4,aajj=1;
    if(GetAsyncKeyState(VK_sh)&&GetAsyncKeyState(VK_c)) ttt=100;
    else if(GetAsyncKeyState(VK_c)) ttt=200;
    else if(GetAsyncKeyState(VK_sh)) ttt=50;
    else ttt=100;
}
/*支持一下吧 作者:Computer_Devon*/ 
void go(int x,int y){		//控制光标位置 
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    COORD c={x,y};
    SetConsoleCursorPosition(hOut,c);
}
void no(){		//隐藏光标 
    CONSOLE_CURSOR_INFO cursor_info={1,0}; 
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
/*支持一下吧 作者:Computer_Devon*/ 
void COLOR(string c){		//控制颜色 
    if(c=="GREEN") SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN);
    if(c=="RED") SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);
    if(c=="BLUE") SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE);
    if(c=="YELLOW") SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
}
void _map(int x,int y){		//生成地图 
    for(int i=2;i<=x*2+4;i=i+2){
        go(i,2);
        cout<<"■";
        go(i,y+3);
        cout<<"■";
        Sleep(5); 
    }
    for(int i=2;i<=y+3;i++){
        go(2,i);
        cout<<"■";
        go(x*2+4,i);
        cout<<"■"; 
        Sleep(20);
    }
}
/*支持一下吧 作者:Computer_Devon*/ 
void csh(int X,int Y){		//初始化蛇头位置 
    COLOR("YELLOW");
    int x=1,y=1;
    while(x%2==1){
        x=rand()%(X*2);
    }
    y=rand()%Y;
    go(x+4,y+3);
    cout<<"□"; 
    sx.push_back(x+4);
    sy.push_back(y+3);
}
/*支持一下吧 作者:Computer_Devon*/ 
void fs(){		//控制积分位置 
    COLOR("GREEN");
    int l=40*2;
    jx=1;
    while(jx%2==1){
        jx=rand()%l;
    }
    jy=rand()%40;
    jy+=3;
    jx+=4;
    go(jx,jy);
    cout<<"◎";
}
/*支持一下吧 作者:Computer_Devon*/ 
void yd(){		//移动() 
    if(fx==1){
        COLOR("YELLOW");
        if(_map_[sx.back()][sy.back()-1]==1){
            sm=1;
            return;
        }
        if(sy.back()-1==2){
            if(sss==0){		//模式转换 
                sm=1;
            }
            else{
                go(sx.back()+1,sy.back());		 //增加蛇头 
                cout<<"\b "<<" ";
                go(sx.back(),sy.back());		
                cout<<"■";
                _map_[sx.back()][my+2]=1;
                sx.push_back(sx.back());
                sy.push_back(my+2);
                go(sx.back(),sy.back());
                cout<<"□";
                if(st!=0){
                    go(sx.front()+1,sy.front());		//删除蛇尾
                    cout<<"\b "<<" ";
                    _map_[sx.front()][sy.front()]=0;		
                    sx.erase(sx.begin()+0);		//删除蛇尾坐标 
                    sy.erase(sy.begin()+0);
                }
                Sleep(ttt);
            }
            return;
        }
        go(sx.back()+1,sy.back());
        cout<<"\b "<<" ";
        go(sx.back(),sy.back());
        cout<<"■";
        _map_[sx.back()][sy.back()-1]=1; 
        sx.push_back(sx.back());
        sy.push_back(sy.back()-1);
        go(sx.back(),sy.back());
        cout<<"□";
        if(st!=0){
            go(sx.front()+1,sy.front());
            cout<<"\b "<<" ";
            _map_[sx.front()][sy.front()]=0;
            sx.erase(sx.begin()+0);
            sy.erase(sy.begin()+0);
        }
        Sleep(ttt);
    }
    if(fx==2){
        COLOR("YELLOW");
        if(_map_[sx.back()][sy.back()+1]==1){
            sm=1;
            return;
        }
        if(sy.back()+1==my+3){
            if(sss==0){
                sm=1;
            }
            else{
                go(sx.back()+1,sy.back());
                cout<<"\b "<<" ";
                go(sx.back(),sy.back());
                cout<<"■"; 
                _map_[sx.back()][sy.back()]=1;
                sx.push_back(sx.back());
                sy.push_back(3);
                go(sx.back(),sy.back());
                cout<<"□";
                if(st!=0){
                    go(sx.front()+1,sy.front());
                    cout<<"\b "<<" ";
                    _map_[sx.front()][sy.front()]=0;
                    sx.erase(sx.begin()+0);
                    sy.erase(sy.begin()+0);
                }
                Sleep(ttt);
            }
            return;
        }
        go(sx.back()+1,sy.back());
        cout<<"\b "<<" ";
        go(sx.back(),sy.back());
        cout<<"■"; 
        _map_[sx.back()][sy.back()]=1;
        sx.push_back(sx.back());
        sy.push_back(sy.back()+1);
        go(sx.back(),sy.back());
        cout<<"□";
        if(st!=0){
            go(sx.front()+1,sy.front());
            cout<<"\b "<<" ";
            _map_[sx.front()][sy.front()]=0;
            sx.erase(sx.begin()+0);
            sy.erase(sy.begin()+0);
        }
        Sleep(ttt);
    }
    if(fx==3){
        COLOR("YELLOW");
        if(_map_[sx.back()-2][sy.back()]==1){
            sm=1;
            return;
        }
        if(sx.back()-2==2){
            if(sss==0){
                sm=1;
            }
            else{
                go(sx.back()+1,sy.back());
                cout<<"\b "<<" ";
                go(sx.back(),sy.back());
                cout<<"■"; 
                _map_[sx.back()][sy.back()]=1;
                sx.push_back(mx*2+2);
                sy.push_back(sy.back());
                go(sx.back(),sy.back());
                cout<<"□";
                if(st!=0){
                    go(sx.front()+1,sy.front());
                    cout<<"\b "<<" ";
                    _map_[sx.front()][sy.front()]=0;
                    sx.erase(sx.begin()+0);
                    sy.erase(sy.begin()+0);
                }
                Sleep(ttt);
            }
            return;
        }
        go(sx.back()+1,sy.back());
        cout<<"\b "<<" ";
        go(sx.back(),sy.back());
        cout<<"■"; 
        _map_[sx.back()][sy.back()]=1;
        sx.push_back(sx.back()-2);
        sy.push_back(sy.back());
        go(sx.back(),sy.back());
        cout<<"□";
        if(st!=0){
            go(sx.front()+1,sy.front());
            cout<<"\b "<<" ";
            _map_[sx.front()][sy.front()]=0;
            sx.erase(sx.begin()+0);
            sy.erase(sy.begin()+0);
        }
        Sleep(ttt);
    }
    if(fx==4){
        COLOR("YELLOW");
        if(_map_[sx.back()+2][sy.back()]==1){
            sm=1;
            return;
        }
        if(sx.back()+2==mx*2+4){
            if(sss==0){
                sm=1;
            }
            else{
                go(sx.back()+1,sy.back());
                cout<<"\b "<<" ";
                go(sx.back(),sy.back());
                cout<<"■"; 
                _map_[sx.back()][sy.back()]=1;
                sx.push_back(4);
                sy.push_back(sy.back());
                go(sx.back(),sy.back());
                cout<<"□";
                if(st!=0){
                    go(sx.front()+1,sy.front());
                    cout<<"\b "<<" ";
                    _map_[sx.front()][sy.front()]=0;
                    sx.erase(sx.begin()+0);
                    sy.erase(sy.begin()+0);
                }
                Sleep(ttt);
            }
            return;
        }
        go(sx.back()+1,sy.back());
        cout<<"\b "<<" ";
        go(sx.back(),sy.back());
        cout<<"■"; 
        _map_[sx.back()][sy.back()]=1;
        sx.push_back(sx.back()+2);
        sy.push_back(sy.back());
        go(sx.back(),sy.back());
        cout<<"□";
        if(st!=0){
            go(sx.front()+1,sy.front());
            cout<<"\b "<<" ";
            _map_[sx.front()][sy.front()]=0;
            sx.erase(sx.begin()+0);
            sy.erase(sy.begin()+0);
        }
        Sleep(ttt);
    }
    aajj=0;
}
/*支持一下吧 作者:Computer_Devon*/ 
int main(){
    winSize(40,10);		//初始界面 
    srand(time(NULL));
    go(12,1);
    COLOR("GREEN");
    cout<<"贪吃蛇";
    go(11,3);
    COLOR("RED");
    cout<<"经典模式"; 
    COLOR("BLUE");
    go(11,4);
    cout<<"无限模式";
    go(6,6);
    COLOR("YELLOW");
    cout<<"--按下Enter后开始--";
    sss=0;
    go(9,4);
    cout<<"\b ";
    go(10,4);
    cout<<"\b ";
    go(8,3);
    cout<<"=>";
    while(!GetAsyncKeyState(VK_en)){		//判断模式 
        no();
        if(GetAsyncKeyState(VK_x)&&sss!=1){
            sss=1;
            go(9,3);
            cout<<"\b ";
            go(10,3);
            cout<<"\b ";
            go(8,4);
            cout<<"=>";
            Sleep(ttt);
        } 
        if(GetAsyncKeyState(VK_u)&&sss!=0){
            sss=0;
            go(9,4);
            cout<<"\b ";
            go(10,4);
            cout<<"\b ";
            go(8,3);
            cout<<"=>";
            Sleep(100);
        } 
    }
    my=40,mx=40; 		//初始化地图 
    Sleep(1000);
    system("cls");
    winSize(mx*3-10,my*2-35);
    if(sss==0){
        COLOR("RED");
    }
    else{
        COLOR("BLUE");
    } 
    _map(mx,my);
    csh(mx,my);
    go(35,1);
    cout<<"分数:";
    while(1){		//运行主程序 
        no();
        aj();
        if(st==0){
            fs();
            st=1;
            len++;
            COLOR("YELLOW");
            go(41,1);
            cout<<len;
        }
        COLOR("GREEN");
        go(jx,jy);
        cout<<"◎";
        if(sx.back()==jx&&sy.back()==jy){
            st=0;
        }
        yd();
        if(sm==1){
            break;
        }
    }
    Sleep(1000);		//结束程序 
    system("cls");
    go(32,45);
    cout<<"最终分数:"<<len; 
    return 0;
}
/*支持一下吧 作者:Computer_Devon*/ 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值