按道理来说,想对蛇的位置刷新要用清空屏幕,但那样会闪屏。
因此我用了一项新技术:队列储存法,具体作用请看程序。
小小蒟蒻,代码可能有点繁琐,请谅解
/*支持一下吧 作者: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*/