基于c语言的贪吃蛇游戏

#include<stdlib.h>                         /*包含srand函数*/
#include<stdio.h>                          /*基本输入输出函数*/
#include<windows.h>                        /*windows画图等函数包含Srand函数*/
#include<conio.h>                           /*键盘按键函数*/
#include<time.h>                            /*产生时间随机函数*/
#define    HEAD    300                     /*头部赋初值*/
#define    FOOD    400                     /*食物赋初值*/
/*画图设置背景*/
void draw(int a,int x,int y)

 if(x==0)     printf("\t\t");                        /*制表共16行*/
  if(y==0)     printf("\t\t");                         /*制表共16列*/   
  if(x==16)    printf("\n");
  if(x>0&&x<16&&y>0&&y<16)
  {
   if(a!=0)
    printf("█");                             /*如果是蛇或者是食物则显示出来*/
   else printf("□");                             /*如果什么都不是则输出空白*/
 }
}
void Draw(int (*sna)[17])            /*int (*sna)[17]数组指针,它只是一个指针,指向17个元素数组的地址*/
{
  int i,j;
  system("cls");                                  /*清屏*/    
  system("color A4");                             /*设置背景为红色,底板为绿色*/
  for(i=0;i<17;i++)
  for(j=0;j<17;j++)
  draw(sna[i][j],j,i);                                /*画出蛇的图像*/
}
/*画图设置背景*/
/*判断蛇是否死亡*/
int life(int (*sna)[17])
{
  int x,y,a=0,max=0,sum=0;
/*判断头部是否在最外层的。*/ 
  for(x=0,y=0;y<17;y++)
   if(sna[x][y]==HEAD)                             //判断头部是否在最外层的。
  return 0;
  for(x=16,y=0;y<17;y++)
   if(sna[x][y]==HEAD)
   return 0;
   for(y=0,x=0;x<17;x++)
  if(sna[x][y]==HEAD)
  return 0;
  for(y=16,x=0;x<17;x++)
  if(sna[x][y]==HEAD)
  return 0;
/*判断头部是否在最外层的。*/
/*判断头部是否撞到自己*/ 
  for(x=0;x<16;x++)
  {
    for(y=0;y<16;y++)
    {
     if(max<sna[x][y])
     if(sna[x][y]!=HEAD&&sna[x][y]!=FOOD)
     max=sna[x][y];
    }
    }                                                          /*判断头部是否撞到自己*/         
    for(a=0;a<max;a++)
    {
     for(x=0;x<16;x++)
     {
      for(y=0;y<16;y++)
      {
      if(a+1==sna[x][y])
      sum++;
       }
      }
  }
   if(sum!=max)
   return 0;
/*判断头部是否撞到自己*/  
   return 1;
}
void    gameover(int  score)
{
 system("cls");                                   /*清屏*/
    system("color 2");                                /*设置颜色为绿*/
    printf("\n\n\n\n\n\n\n\n");                       /*换行*/
    printf("\t\t\t\t");                               /*设置列数*/
    printf("游戏结束\n");
    printf("\n\n\n\n\n\n");
    printf("\t\t\t\t");
    printf("score=%d\n",score);
    printf("\n\n\n\n\n\n\n\n");
    printf("\t\t\t");
    printf("按Esc键退出,按任意键重新开始。\n");
} /*游戏结束*/
/*产生随机数*/
int rando()
{
  srand(time(NULL));                                 /*产生一个较大的随机数*/
  return rand()%15+1;                                /*产生1,2,3,,,,16随机数*/
}
/*产生随机数*/
/*最主要的部分,,,主要用了123,,,HEAD,,,,,食物是FOOD来标记蛇的每一部分*/
void   sign()
{     /*初始化及函数声明*/
 void upmove(int (*sna)[17]);
    void downmove(int (*sna)[17]);
    void leftmove(int (*sna)[17]);
    void rightmove(int (*sna)[17]);
    int juge(int (*sna)[17],int key);
 int  i=5,j=7,score=0,snake[17][17]={0},key,key1=0;                
 snake[1][1]=1;
 snake[1][2]=2;
 snake[1][3]=3;
 snake[2][3]=HEAD;
 while(snake[i][j]!=0)          
   {
    i=rando();
    j=rando();
   }
  snake[i][j]=FOOD;                                 /*随机产生一个食物*/
   /*初始化及函数声明*/
     Draw(snake);                                     /*画出初始化的蛇及食物的图形*/
     /*进入循环进行标记*/
     while(life(snake))                              /*在蛇活着的时候一直进入大循环*/
  {
   key=getch();
  switch(key)
  {
   case 72:
   while(!kbhit()&&life(snake)&&key1!=80)                       /*当!kbhit()表示键盘无输入及上一步与输入的这一步不是相反方向时且蛇是活着的*/
    {
     if(juge(snake,key))
     {
      score++;                                   /*所吃的食物得分*/
      Draw(snake);                                 /*画出现在的蛇形*/
      Sleep(100);                                /*延时*/
     }
     upmove(snake);                                   /*调用向上移动函数*/
     Draw(snake);
     key1=key ;                                  /*用来标记上一步*/
     Sleep(100);
    }
   break;
   case  80:
   while(!kbhit()&&life(snake)&&key1!=72) 
   {
     if(juge(snake,key))
     {
      score++;                                   /*所吃的食物得分*/
      Draw(snake);                                 /*画出现在的蛇形*/
      Sleep(100);                                /*延时*/ 
     }
     downmove(snake);                                   /*调用向下移动函数*/
     Draw(snake);
     key1=key ;                                  /*用来标记上一步*/
     Sleep(100);
   }
   break;
   case  75:
   while(!kbhit()&&life(snake)&&key1!=77) 
   {
     if(juge(snake,key))
     {
      score++;                                   /*所吃的食物得分*/
      Draw(snake);                                 /*画出现在的蛇形*/
      Sleep(100);                                /*延时*/
     }
     leftmove(snake);                                   /*调用向左移动函数*/
     Draw(snake);
     key1=key ;                                  /*用来标记上一步*/
     Sleep(100); 
   }
   break;
   case  77:
   while(!kbhit()&&life(snake)&&key1!=75) 
   {
     if(juge(snake,key))
     {
      score++;                                   /*所吃的食物得分*/
      Draw(snake);                                 /*画出现在的蛇形*/
      Sleep(100);                                /*延时*/
     }
     rightmove(snake);                                   /*调用向右移动函数*/
     Draw(snake);
     key1=key ;                                  /*用来标记上一步*/
     Sleep(100);
   }
   break;
   case 27:
   exit(0);
  }
  }
  gameover(score);
  Sleep(1000);
  if(getch()==27)                                       /*推出游戏*/
    exit(0);
  else
  {
   sign();
   getch();
  } 
}
/*光标控制贪吃蛇移动*/
/*向上移动*/
int   upmove(int (*sna)[17])
{
 int  i,j,max=0;                                                  /*max用来标记蛇*/
  for(i=1;i<16;i++)
   for(j=1;j<16;j++)
   {
   if(sna[i][j]!=0&&sna[i][j]!=HEAD&&sna[i][j]!=FOOD)       /*出去头部  1,2,3标记法蛇的身子进行移动*/
    sna[i][j]=sna[i][j]-1;
   }
  for(i=1;i<16;i++)
   for(j=1;j<16;j++)
   {
    if(max<sna[i][j])
   if(sna[i][j]!=HEAD&&sna[i][j]!=FOOD)
   max=sna[i][j];                                          /*求出蛇头后的长度*/
   }
 for(i=1;i<16;i++)
   for(j=1;j<16;j++)
   {
    if(sna[i][j]==HEAD)
    {
     sna[i-1][j]=HEAD;                                 /*蛇头移动*/
    sna[i][j]=max+1;
    return 1;                                         /*蛇身移动*/
    }
   }
   
}
int   downmove(int (*sna)[17])
{
 int  i,j,max=0;
  for(i=1;i<16;i++)
   for(j=1;j<16;j++)
   {
   if(sna[i][j]!=0&&sna[i][j]!=HEAD&&sna[i][j]!=FOOD)       /*出去头部  1,2,3标记法蛇的身子进行移动*/
    sna[i][j]=sna[i][j]-1;
   }
  for(i=1;i<16;i++)
   for(j=1;j<16;j++)
   {
    if(max<sna[i][j])
   if(sna[i][j]!=HEAD&&sna[i][j]!=FOOD)
   max=sna[i][j];                                          /*求出蛇头后的长度*/
   }
 for(i=1;i<16;i++)
   for(j=1;j<16;j++)
   {
    if(sna[i][j]==HEAD)
    {
     sna[i+1][j]=HEAD;                                 /*蛇头移动*/
    sna[i][j]=max+1;
    return 1;                                         /*蛇神移动*/
    }
   }
   
}
int   leftmove(int (*sna)[17])
{
 int  i,j,max=0;
  for(i=1;i<16;i++)
   for(j=1;j<16;j++)
   {
   if(sna[i][j]!=0&&sna[i][j]!=HEAD&&sna[i][j]!=FOOD)       /*出去头部  1,2,3标记法蛇的身子进行移动*/
    sna[i][j]=sna[i][j]-1;
   }
  for(i=1;i<16;i++)
   for(j=1;j<16;j++)
   {
    if(max<sna[i][j])
   if(sna[i][j]!=HEAD&&sna[i][j]!=FOOD)
   max=sna[i][j];                                          /*求出蛇头后的长度*/
   }
 for(i=1;i<16;i++)
   for(j=1;j<16;j++)
   {
    if(sna[i][j]==HEAD)
    {
     sna[i][j-1]=HEAD;                                 /*蛇头移动*/
    sna[i][j]=max+1;
    return 1;                                         /*蛇神移动*/
    }
   }
   
}
int   rightmove(int (*sna)[17])
{
 int  i,j,max=0;
  for(i=1;i<16;i++)
   for(j=1;j<16;j++)
   {
   if(sna[i][j]!=0&&sna[i][j]!=HEAD&&sna[i][j]!=FOOD)       /*出去头部  1,2,3标记法蛇的身子进行移动*/
    sna[i][j]=sna[i][j]-1;
   }
  for(i=1;i<16;i++)
   for(j=1;j<16;j++)
   {
    if(max<sna[i][j])
   if(sna[i][j]!=HEAD&&sna[i][j]!=FOOD)
   max=sna[i][j];                                          /*求出蛇头后的长度*/
   }
 for(i=1;i<16;i++)
   for(j=1;j<16;j++)
   {
    if(sna[i][j]==HEAD)
    {
     sna[i][j+1]=HEAD;                                 /*蛇头移动*/
    sna[i][j]=max+1;
    return 1;                                         /*蛇神移动*/
    }
   }
   
}
/*光标控制贪吃蛇*/
/*判断在移动瞬间蛇能不能吃到食物*/
int juge(int (*sna)[17],int key)
{
  int i,j,a=rando(),b=rando(),max;                         /*a,b是随机食物的坐标*/
  for(i=0;i<16;i++)
  {
   for(j=0;j<16;j++)
   {
    if(sna[i][j]!=HEAD&&sna[i][j]!=FOOD)
      if(max<sna[i][j])
    max=sna[i][j];                                     /*求出蛇的头后的长度*/
   }
  }
  for(i=0;i<16;i++)
 {
   for(j=0;j<16;j++)
   {
    if(sna[i][j]==HEAD)
    {
     if(sna[i-1][j]==FOOD&&key==72)
     {
      sna[i-1][j]=HEAD;                      /*蛇头进入到食物的位置*/
      sna[i][j]=max+1;                        /*蛇的长度加一*/
      while(sna[a][b]!=0)
      {
       a=rando();
       b=rando();
       }
         sna[a][b]=FOOD;                       /*随机产生新的食物*/
       return 1;
     }
     if(sna[i+1][j]==FOOD&&key==80)
      {
             sna[i+1][j]=HEAD;                     /*蛇头进入到食物的位置*/       
       sna[i][j]=max+1;                           /*蛇的长度加一*/   
      while(sna[a][b]!=0)
      {
       a=rando();
       b=rando();
       }
        sna[a][b]=FOOD;                         /*随机产生新的食物*/    
      return 1;
      }
     if(sna[i][j-1]==FOOD&&key==75)
     {
      sna[i][j-1]=HEAD;                     /*蛇头进入到食物的位置*/      
      sna[i][j]=max+1;                         /*蛇的长度加一*/
      while(sna[a][b]!=0)
      {
       a=rando();
       b=rando();
       }
         sna[a][b]=FOOD;                         /*随机产生新的食物*/  
       return 1;
     }
     if(sna[i][j+1]==FOOD&&key==77)
     {
      sna[i][j+1]=HEAD;                    /*蛇头进入到食物的位置*/  
      sna[i][j]=max+1;                        /*蛇的长度加一*/    
      while(sna[a][b]!=0)
      {
       a=rando();
       b=rando();
       }
         sna[a][b]=FOOD;                       /*随机产生新的食物*/       
       return 1;
     }
   }
  }
 }
 return 0;
}
/*主函数,,主要用于调用sign函数*/
int  main()
{
 sign();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙在江湖aa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值