BUG有点多的贪吃蛇,DEVC++可以运行。

#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;

       }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值