#include<stdio.h>
#include<conio.h>
#include<windows.h>
#include<time.h>
#define MAP_WIDTH 60
#define MAP_HEIGHT 30
#define MAXLEN 30
#define INITLEN 3
void gotoxy(int x,int y);
void createMap();
void createFood();
void initSnake();
void moveSnake();
int statement();
void Speed(int *a);
int score=0;
struct Food{
int x;
int y;
}food;
struct Snake{
int x[MAXLEN];
int y[MAXLEN];
int lenth;
}snake;
int direct='a';
int foodFlag=1;
int main(){
gotoxy(61,0);
printf("难度为1到5,难度随数字的增大而增大;输入1到5,选择难度。");
gotoxy(61,1);
printf("输入完毕后回车开始游戏。");
gotoxy(61,2);
printf("游戏提示1,不要长按键位,会出BUG。");
gotoxy(61,3);
printf("提示2:不要按与移动方向相反的键。");
int Sp=300;
Speed(&Sp);
createMap();
while(1){
Sleep(Sp);
if(foodFlag){
createFood();
}
moveSnake();
if(statement()){
gotoxy(MAP_WIDTH/2,MAP_HEIGHT/2);
printf("Game Over!\n");
exit(0);
}
}
system("pause>nul");
gotoxy(60,30);
return 0;
}
void createMap(){
for(int i=0;i<MAP_WIDTH;i++){
gotoxy(i,0);
printf("#");
gotoxy(i,MAP_HEIGHT-1);
printf("#");
}
for(int i=0;i<MAP_HEIGHT;i++){
gotoxy(0,i);
printf("#");
gotoxy(MAP_WIDTH,i);
printf("#");
}
initSnake();
}
void gotoxy(int x,int y){
COORD pos={x,y};
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut,pos);
}
void createFood(){
srand(time(NULL));
int Flag=1;
food.x=rand()%(MAP_WIDTH-2)+1;
food.y=rand()%(MAP_HEIGHT-2)+1;
for(int i=0;i<snake.lenth;i++){
if(snake.x[i]==food.x&&snake.y[i]==food.y){
Flag=0;
}
if(Flag){
gotoxy(food.x,food.y);
printf("+");
foodFlag=0;
}
}
}
void initSnake(){
snake.lenth=INITLEN;
snake.x[0]=MAP_WIDTH/2;
snake.y[0]=MAP_HEIGHT/2;
gotoxy(snake.x[0],snake.y[0]);
printf("@");
for(int i=1;i<snake.lenth;i++){
snake.x[i]=snake.x[i-1]+1;
snake.y[i]=snake.y[i-1];
gotoxy(snake.x[i],snake.y[i]);
printf("*");
}
}
void moveSnake(){
if(_kbhit()){
fflush(stdin);
direct=_getch();
}
gotoxy(snake.x[snake.lenth-1],snake.y[snake.lenth-1]);
printf(" ");
for(int i=snake.lenth-1;i>0;i--){
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
gotoxy(snake.x[i],snake.y[i]);
printf("*");
}
switch(direct){
case'w':
case'W':
snake.y[0]--;
break;
case's':
case'S':
snake.y[0]++;
break;
case'a':
case'A':
snake.x[0]--;
break;
case'd':
case'D':
snake.x[0]++;
break;
}
gotoxy(snake.x[0],snake.y[0]);
printf("@");
if(snake.x[0]==food.x&&snake.y[0]==food.y){
snake.lenth++;
score++;
foodFlag=1;
gotoxy(61,4);
printf("得分:%d",score);
}
}
int statement(){
if(snake.x[0]==0||snake.x[0]==MAP_WIDTH||snake.y[0]==0||snake.y[0]==MAP_HEIGHT-1){
return 1;
}
for(int i=1;i<snake.lenth;i++){
if(snake.x[0]==snake.x[i]&&snake.y[0]==snake.y[i]){
return 1;
}
}
return 0;
}
void Speed(int *a){
int b;
scanf("%d",&b);
switch(b){
case 1:*a=300;break;
case 2:*a=200;break;
case 3:*a=120;break;
case 4:*a=50;break;
case 5:*a=20;break;
}
}