大一时期发现的贪吃蛇代码

#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<conio.h>
#include<time.h>
char gamemap[20][40];//游戏地图大小 20*40
int score=0;//当前分数 
//记录蛇的结点
int x[800];//每个结点的行编号
int y[800];//每个结点的列编号
int len = 0;//蛇的长度

//记录水果信息 
 int fx=0;//食物的横坐标 
 int fy=0;//食物的纵坐标 
 int fcount=0;//食物的数目 
 
 //主要函数操作 
void createfood();//生成食物 
void PrintgameMap(int x[],int y[]);//画游戏地图 
void move(int x[],int y[]);//移动蛇 


int main()
{
    srand(time(NULL));
   //初始化蛇头和身体的位置,默认刚开始蛇长为2 
    x[len] = 9;
    y[len] = 9;
    len++;
    x[len] = 9;
    y[len] = 8;
    len++;
    
    createfood();
    PrintgameMap(x,y);
    move(x,y);
    return 0;
}
void createfood()
{
    if(0==fcount)
    {
       int tfx=rand()%18+1;
        int tfy=rand()%38+1;
        int i,j;
        int have=0;//为0表示食物不是食物的一部分 
        for(i=0;i<len;i++)
        {
            for(j=0;j<len;j++)
            {
                if(x[i]==fx&&y[j]==fy)
                {
                    have=1;
                    break;
                }
                else
                {
                    have=0;
                }
            }
            if(1==have)//若为蛇的一部分,执行下一次循环 
            {
                continue;
            }
            else//否则生成新的水果 
            {
                fcount++;
                fx=tfx;
                fy=tfy;
                break;
            }
        }

            
        
    }
}
//游戏地图
void PrintgameMap(int x[],int y[])
{
    int snake = 0,food=0;
    
    
    int i, j;
    //画游戏地图,并画出蛇的初始位置
    for (i = 0; i < 20; i++)
    {
        for (j = 0; j < 40; j++)
        {
            if (i == 0 && j >= 1 && j <= 38)
            {
                gamemap[i][j] = '=';

            }
            else if (i == 19 && j >= 1 && j <= 38)
            {
                gamemap[i][j] = '=';
            }
            else if (j == 0 || j == 39)
            {
                gamemap[i][j] = '#';
            }
            else
            {
                gamemap[i][j] = ' ';
            }
            //判断蛇是否在当前位置
            int k; 
            for ( k = 0; k < len; k++)
            {
                
                if (i == x[k]&&j == y[k])
                {
                    snake = 1;
                    break;
                }
                else
                {
                    snake = 0;
                }
            }
          {
              if(fcount&&fx==i&&fy==j)
              {
                  food=1;
              }
              else
              {
                  food=0;
              }
          }
            //若蛇在当前位置
            if (1==snake )
            {
                printf("*");
            }
            else if(1==food)
            {
               printf("f");
            }
            //若蛇不在当前位置并且当前位置没有水果 
            else
            {
                printf("%c", gamemap[i][j]);
            }
            
        }
        printf("\n");
        
    }
    
    printf("score:%d",score);
}
//移动
void move(int x[],int y[])
{
    char s;
    s=getch();
    int move=0,beat=0;
    while (1)
    {
      
        int cx[800];
        int cy[800];
        memcpy(cx, x, sizeof(int)*len);
        memcpy(cy, y, sizeof(int)*len);
        //头
        
        if (s=='w')
        {
            
                x[0]--;
                move=1;
                if(x[0]<=0)
                {
                   printf("Game over\n");
                   break;
                }
            
        }
        else if (s=='s')
        {
            x[0]++;
            move=1;
            if(x[0]>=19)
            {
                printf("Game over\n");
                break;
            }
           
        }
        else if (s=='a')
        {
            y[0] --;
            move=1;
            if(y[0]<=0)
            {
                printf("Game over\n");
               break;
            }
            
        }
        else if (s=='d')
        {
             y[0]++;
            move=1;
             if(y[0]>=39)
            {
                 printf("Game over\n");
                 break;
            }
        }
        
        //身体
        int i;
        for ( i = 1; i < len; i++)
        {
            
            x[i] = cx[i - 1];
            y[i] = cy[i - 1];
            
        }
        for(i=1;i<len;i++)//要是咬到了自己 
        {
            if(x[0]==x[i]&&y[0]==y[i])
            {
                beat=1;
            }
            else
            {
                beat=0;
            }
        } 
        if(1==beat)
        {
            printf("Game over\n");
            break;
        }
        if(1==move)
        {
            if(fcount&&x[0]==fx&&y[0]==fy)//如果吃到了果子
            {
                //拷贝当前蛇头地址到第二个结点 
                memcpy(x+1,cx,sizeof(int)*len);
                memcpy(y+1,cy,sizeof(int)*len);
                len++;
                fcount--;
                fx=0;
                fy=0;
                score++; 
                createfood();
            }
            Sleep(70);
            system("cls");
            PrintgameMap( x, y);
            
        }
        else
        continue;
        if(kbhit())//判断是否按下按键 
        {
            s=getch();
        }
    
     }
    
}

还挺有意思的,记录一下

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值