#include<bits/stdc++.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
using namespace std;
int snake[11][11],refresh[11][11],head_x,head_y,tail_x,tail_y,score;
int deltax[5]={0,-1,1,0,0};
int deltay[5]={0,0,0,-1,1};
struct Noivelist{
int dx,dy;
}id[10010];
bool is_fruit=false;
void set_fruit();
int get_key();
void show_map();
void movement();
void init();
void lauch();
void is_dead();
void is_win();
void eat_fruit(int now_x,int now_y);
void not_eat_fruit(int now_x,int now_y);
int main(){
lauch();
return 0;
}
void is_win(){
system("cls");
string str1="score: 121!!";
string str2="WTF,you did that and won?";
string str3="how did you do that ??";
for(int i=0;i<str1.size();i++){
printf("%c",str1[i]);
Sleep(100);
}
printf("\n");
for(int i=0;i<str2.size();i++){
printf("%c",str2[i]);
Sleep(100);
}
printf("\n");
for(int i=0;i<str3.size();i++){
printf("%c",str3[i]);
Sleep(100);
}
printf("\n");
exit(0);
}
void lauch(){
init();
show_map();
for(int i=0;i<11;i++){
for(int j=0;j<11;j++){
cout<<snake[i][j];
}
cout<<endl;
}
while(score<121){
printf("score: %d\n\n",score);
printf("use w a s d to move\n\n");
movement();
if(!is_fruit)set_fruit();
system("cls");
show_map();
cout<<endl<<endl<<endl;
for(int i=0;i<11;i++){
for(int j=0;j<11;j++){
cout<<snake[i][j];
}
cout<<endl;
}
}
is_win();
}
void is_dead(){
system("cls");
string str1="score:";
string str2="what a pityyyyyy...";
for(int i=0;i<str1.size();i++){
printf("%c",str1[i]);
Sleep(200);
}
int sc[10],cnt=0;
memset(sc,0,sizeof sc);
while(score>0){
sc[++cnt]=score%10;
score/=10;
}
for(int i=cnt;i>=1;i--){
printf("%d",sc[i]);
Sleep(200);
}
printf("\n");
for(int i=0;i<str2.size();i++){
printf("%c",str2[i]);
Sleep(200);
}
printf("\n");
exit(0);
}
void init(){
for(int i=0;i<11;i++)for(int j=0;j<11;j++)snake[i][j]=0;
snake[5][5]=score+3;
head_x=5,head_y=5;
tail_x=5,tail_y=5;
score=0;
set_fruit();
}
void movement(){
int direction=get_key();
int dx=deltax[direction];
int dy=deltay[direction];
int now_x=dx+head_x,now_y=dy+head_y;
if(snake[now_x][now_y]==score+2 and snake[now_x][now_y]!=0){
dx*=-1,dy*=-1;
now_x=dx+head_x;
now_y=dy+head_y;
int t=snake[now_x][now_y];
if(t==-1)eat_fruit(now_x,now_y);
if((t!=-1&&t!=0)||now_x<0||now_x>11||now_y<0||now_y>11)is_dead();
if(t==0)not_eat_fruit(now_x,now_y);
}else{
int t=snake[now_x][now_y];
if(t==-1)eat_fruit(now_x,now_y);
if((t!=-1&&t!=0)||now_x<0||now_x>11||now_y<0||now_y>11)is_dead();
if(t==0)not_eat_fruit(now_x,now_y);
}
}
void eat_fruit(int now_x,int now_y){
id[score+3].dx=now_x;
id[score+3].dy=now_y;
score++;
snake[now_x][now_y]=score+3;
head_x=now_x;
head_y=now_y;
is_fruit=false;
}
void not_eat_fruit(int now_x,int now_y){
snake[now_x][now_y]=score+3;
snake[head_x][head_x]=0;
head_x=now_x,head_y=now_y;
for(int i=score+2;i>=3;i--){
snake[id[i].dx][id[i].dy]=i;
int tx=id[i].dx,ty=id[i].dy;
id[i].dx=now_x,id[i].dy=now_y;
now_x=tx,now_y=ty;
}
tail_x=now_x,tail_y=now_y;
cout<<head_x<<' '<<head_y<<endl;
cout<<tail_x<<' '<<tail_y<<endl;
Sleep(500);
if(tail_x==head_x&&tail_y==head_y)return;
else snake[tail_x][tail_y]=0;
return;
}
void show_map(){
for(int i=1;i<=13;i++)cout<<"# ";
cout<<endl;
for(int i=0;i<11;i++){
cout<<"# ";
for(int j=0;j<11;j++){
int t=snake[i][j];
if(t==0)printf(" ");
if(t!=0&&t!=score+3&&t!=-1)printf("O ");
if(t==score+3)printf("@ ");
if(t==-1)printf("$ ");
}
cout<<"# ";
printf("\n");
}
for(int i=1;i<=13;i++)cout<<"# ";
cout<<endl;
}
void set_fruit(){
is_fruit=true;
srand(time(NULL));
int x=rand()%11,y=rand()%11;
while(snake[x][y]!=0)x=rand()%11,y=rand()%11;
snake[x][y]=-1;
}
int get_key(){
char key;
while(1){
if(_kbhit()){
key=getch();
if(key==97)return 3;
if(key==115)return 2;
if(key==100)return 4;
if(key==119)return 1;
return get_key();
}
}
}