贪吃蛇完整代码(史上最详细)

//0丶头文件
#include<stdio.h> //标准函数
#include<stdlib.h> //库文件
#include<graphics.h> //图形窗口
#include<conio.h> //控制台
#define SNAKE_NUM 500 //蛇的最大节数

//1丶蛇方向
enum DIR 
{
   UP, //上
   DOWN, //下
   LEFT, //左
   RIGHT, //右
}

//2丶蛇结构
struct snake
{
   int size; //蛇的节数
   int speed; //蛇的速度
   int dir; //蛇的方向
   POINT coor[SNAKE_NUM]; //蛇坐标
}sanke;

//3丶食物结构
struct food
{
   int x; //食物横坐标
   int y; //食物纵坐标
   int r; //食物半径
   bool flag; 食物是否被吃
   DWORD color; //食物颜色
}food;

//4丶数据初始化
void GameInit()
{
   initgraph(640,480); //初始化图形窗口大小
   srand(GetTickCount()); //从开机到现在经过的毫秒数,随机生成食物
   snake.size=3; //初始化蛇的节数
   snake.speed=10; //初始化蛇的速度
   snake.dir=RIGHT; //初始化蛇的方向

   for(int i=0;i<snake.size;i++) 
   {
      snake.coor[i].x=40-10*i; //初始化蛇的三段节数代表 0 1 2 依此类推
      snake.coor[i].y=10; 
   }

   food.x=rand()%640; 
   food.y=rand()%480;
   food.r=rand()%10+5; //随机生成半径为0~4的食物
   food.flag=true;
   food.color=RGB(rand()%256,rand()%256,rand()%256);
}

//5丶游戏绘制
void GameDraw()
{
   BeginBatchDraw(); //双缓冲绘制
   setbkcolor(RGB(28,115,119)); //图形窗口背景颜色
   cleardevice(); //清空图形
   setfillcolor(GREEN); //蛇和食物颜色

   for(int i=0;i<snake.size;i++) 
   {
     solidcircle(snake.coor[i].x,snake.coor[i].y,5); //绘制蛇 solidcircle - 圆形填充物
   }
   if(food.flag)
   {
     solidcircle(food.x,food.y,food.r); //绘制食物
   }
   EndBatchDraw(); //结束绘制
}

//6丶让蛇动起来
void snakeMove()
{
   for(int i=0;i<snake.size;i++)
   {
    snake.coor[i]=snake.coor[i-1]; //移动时位置发生改变
   }

   switch(_getch()) //_getch()接收按键
   {
     case UP:
     snake.coor[0].y-=snake.speed;
     if(snake.coor[0].y+10<=0)
     {
       snake.coor[0].y=480;
     }
     break;
        case DOWN:
     snake.coor[0].y+=snake.speed;
     if(snake.coor[0].y-10>=480)
     {
       snake.coor[0].y=0;
     }
     break;
        case LEFT:
     snake.coor[0].x-=snake.speed;
     if(snake.coor[0].x+10<=0)
     {
       snake.coor[0].x=640;
     }
     break;
        case RIGHT:
     snake.coor[0].x-=snake.speed;
     if(snake.coor[0].x-10>=640)
     {
       snake.coor[0].x=0;
     }
     break;
   }
}

//7丶通过按键控制蛇的方向
void KeyControl()
{
  if(_kbhit())
  {
     switch(_getch())
     {
          case 'w':
          case 'W':
      case '72':
      if(snake.dir!=DOWN)
      {
      snake.dir=UP;
      }
      break;
      case 's':
      case 'S':
      case '80':
      if(snake.dir!=UP)
      {
      snake.dir=DOWN;
      }
      break;
      case 'a':
      case 'A':
      case '75':
      if(snake.dir!=RIGHT)
      {
      snake.dir=LEFT;
      }
      break;   
      case 'd':
      case 'D':
      case '78':
      if(snake.dir!=LEFT)
      {
      snake.dir=RIGHT;
      }
      break;
      case ' ': //空格暂停游戏逻辑
      while(1)
      {
        if(_getch()==' ')
        return;
      }
    }  
  } 
}

//8丶吃食物
void Eatfood()
{
  if(food.flag&&snake.coor[0].x>=food.x-food.r&&snake.coor[0].x<=food.x+food.r&&
    snake.coor[0].y>=food.y-food.r&&snake.coor[0].y<=food.y+food.r)
  {
    food.flag=false;
    snake.size++;
  }
  if(!food.flag) //食物被吃重新生成食物
  {

    food.x=rand()%640;
    food.y=rand()%480;
    food.r=rand()%10+5;
    food.flag=true;
    food.color=RGB(rand()%256,rand()%256,rand()%256);
  }
}

//9丶暂停游戏
void stop()
{
   if(_kbhit())
   {
      if(_getch()==' ')
      {
         while(_getch()==' ')
         {
 
         }
      }
   }
}

//10丶主函数
int main()
{
   GameInit(); //初始化数据
   
   while(1)
   {
      GameDraw(); //游戏绘制
      snakeMove(); //让蛇动起来
      KeyControl(); //通过按键改变蛇的方向
      Eatfood(); //吃食物
      Sleep(40); //控制蛇的速度
}







  • 13
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值