我尝试复刻贪吃蛇,但...... 有比较完美代码的,可以告诉我一下吗?
我的超级烂Code:
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
#define getkey(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000)?1:0)
int ti(float a) {return ((int)(a*10+5))/10;}
void Setpos(float x,float y){COORD pos;pos.X=ti(y*4)/2;pos.Y=ti(x);SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);}
void Color(int a){if(a==0) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);if(a==1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);if(a==2) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);if(a==3) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE);if(a==4) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);if(a==5) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);if(a==6) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);if(a==7) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);if(a==8) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);if(a==9) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY|BACKGROUND_GREEN|BACKGROUND_BLUE);if(a==10) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_BLUE);if(a==11) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_BLUE);if(a==12) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN);if(a==13) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY);if(a==14) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_BLUE);}
int a[35][35];
int m[100][2]={0,0,1,1,1,2,1,3},f=1,snl=3,fa=1;
int fx[5]={0,0,1,-1,0};
int fy[5]={0,1,0,0,-1};
int h1=1,h2=3;
int main(){
int n,i,j,k;
system("mode con cols=60 lines=30");
a[1][1]=1;
a[1][2]=1;
a[1][3]=1;
srand(time(0));
while(1){
Setpos(0,0);
for(i=1;i<=30;i++)
for(j=1;j<=30;j++)if(a[i][j]==1)Color(2),cout<<"■";else if(a[i][j]==2)Color(8),cout<<"■";else Color(0),cout<<" ";
int X=rand()%(27-3+1)+3,Y=rand()%(27-3+1)+3;
if(fa){
a[X][Y]=2;
}
h1+=fx[f];
h2+=fy[f];
if(h1>30||h1<1||h2>30||h2<1)break;
if(a[h1][h2]==1)break;
if(a[h1][h2]==2){
snl++;
fa=1;
m[snl][0]=h1;
m[snl][1]=h2;
}else fa=0;
a[m[1][0]][m[1][1]]=0;
for(i=1;i<snl;i++){
m[i][0]=m[i+1][0];
m[i][1]=m[i+1][1];
}
m[i][0]=h1;
m[i][1]=h2;
for(i=1;i<=snl;i++){
a[m[i][0]][m[i][1]]=1;
}
if(getkey('W')){
if(f!=2)
f=3;
}else if(getkey('A')){
if(f!=1)
f=4;
}else if(getkey('S')){
if(f!=3)
f=2;
}else if(getkey('D')){
if(f!=4)
f=1;
}
Sleep(10);
}
string f="Game Over!";
system("cls");
Setpos(13,17-f.size()/2);
Color(8);
for(i=0;i<f.size();i++){
cout<<f[i];
Sleep(300);
}
while(1);
return 0;
}