C语音贪吃蛇入门

简易版贪吃蛇

#include <stdio.h>
#include <string.h>
#include <Windows.h>
#include <time.h>
#include <conio.h>  //获取键盘输入
#define MAPLENGTH 40
#define MAPWIDTH 20
#define MAXSIAE 50
//函数声明
void gotoxy (int x,int y);  //移动光标
void drawmap ();  //初始化地图(墙,食物,蛇)
void createvenom();  //加毒液
void clickcontrol();  //键盘控制+移动蛇
void recreatefood();  //食物被吃后重新随机生成食物
void recreatevenom();
int snakestatus();  //判断蛇的状态
//全局变量
int key = 'w';  //初始化移动方向
int changeflag = 1;  //蛇的变化标记
int score = 000;
//蛇的结构(数组实现)
 struct SNAKE
{
    int x[MAXSIAE];
    int y[MAXSIAE];
    int length;
    int speed;
}snake;
//食物结构
struct FOOD
{
    int x;
    int y;
}food;
struct VENOM
{
    int a;
    int b;
}venom;
int main ()
{
    drawmap();
    createvenom();
    gotoxy(MAPLENGTH + 1,MAPWIDTH + 1);
    printf("你的得分:%d",score);
    while(1)
    {
      clickcontrol();
      recreatefood();
      recreatevenom();
      if(!snakestatus())
      {
          break;
      }
    }
    gotoxy(MAPLENGTH/2,MAPWIDTH/2);
    printf("Game Over!\n");
    system("pause");
    return 0;
}
//初始化地图
void drawmap()
 {
    //墙
    int i;
    //打印上下边框
    for(i = 0;i <= MAPLENGTH;i += 2)
    {
        gotoxy(i,0);
        printf("■");
        gotoxy(i,MAPWIDTH);
        printf("■");
    }
    //打印左右边框
    for(i = 0;i <= MAPWIDTH;i++)
    {
        gotoxy(0,i);
        printf("■");
        gotoxy(MAPLENGTH,i);
        printf("■");
    }
    //食物
    srand((unsigned)time(NULL));
    food.x = rand()%(MAPLENGTH-2)+1;
    food.y = rand()%(MAPWIDTH-2)+1;
    gotoxy(food.x,food.y);
    printf("$");
    //蛇
    snake.length = 5;  //到下面只有length-1节,不知道为什么
    snake.speed = 200;  //定义延迟时间
    snake.x[0] = MAPLENGTH/2;
    snake.y[0] = MAPWIDTH/2;
    gotoxy(snake.x[0],snake.y[0]);
    printf("@");
    for(int j = 1;j <= snake.length - 1;j++)
    {
        snake.x[j] = snake.x[j-1];
        snake.y[j] = snake.y[j-1] + 1;
        gotoxy(snake.x[j],snake.y[j]);
        printf("@");
    }
}
//毒液
void createvenom()
 {
    venom.a = rand()%(MAPLENGTH-2)+1;
    venom.b = rand()%(MAPWIDTH-2)+1;
    gotoxy(venom.a,venom.b);
    printf("*");
 }
//键盘控制+移动蛇
void clickcontrol()
{
    //获取键盘输入
    if(_kbhit())
    {
        fflush(stdin);  //清空缓冲区,网上看的,不知道是什么???
        key = _getch();  //有按键,无按键则为初始方向‘w’
    }
    //擦除最后一节
    if(changeflag)
    {
        gotoxy(snake.x[snake.length - 1],snake.y[snake.length - 1]);  //最后一节
        printf(" ");
    }
    //剩下的节数
    for(int i = snake.length -1;i > 0;i--)
    {
        snake.x[i] = snake.x[i-1];  //后面的往前挪
        snake.y[i] = snake.y[i-1];  //前面的等于后面的坐标
    }
    //移动方向(蛇头)
    switch(key)
     {
    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]);  //打印蛇头
    Sleep(snake.speed);  //延迟打印
    printf("@");
    gotoxy(4,4);
}
//食物被吃后重新随机生成食物
void recreatefood()
{
    if(snake.x[0] == food.x && snake.y[0] == food.y)  //是否吃到食物
    {
        while(1)
            {
            int flag = 1;  //食物合不合适的标志
            srand((unsigned)time(NULL));
            food.x = rand()%(MAPLENGTH-2) + 1;
            food.y = rand()%(MAPWIDTH-2) + 1;
            //但是食物不能生成在蛇身上
            for(int k = 0;k < snake.length;k++)
            {
                if(snake.x[k] == food.x && snake.y[k] == food.y)
                {
                    flag = 0;  //食物不合适的标志
                    break;
                }
            }
             if(flag)
             {
                 break;
             }
            }
            gotoxy(food.x,food.y);
            printf("$");
            snake.length++;
            score++;
            gotoxy(MAPLENGTH + 1,MAPWIDTH + 1);
            printf("你的得分:%d",score);
    }
}
//毒液被吃后重新随机生成毒液
void recreatevenom()
{
    if(snake.x[0] == venom.a && snake.y[0] == venom.b)  //是否吃到毒液
    {
        while(1)
            {
            int flag = 1;  //毒液合不合适的标志

            venom.a = rand()%(MAPLENGTH-2) + 1;
            venom.b = rand()%(MAPWIDTH-2) + 1;
            //但是毒液不能生成在蛇身上
            for(int k = 0;k < snake.length;k++)
            {
                if(snake.x[k] == venom.a && snake.y[k] == venom.b)
                {
                    flag = 0;  //毒液不合适的标志
                    break;
                }
            }
             if(flag)
             {
                 break;
             }
            }
            gotoxy(venom.a,venom.b);
            printf("*");
            gotoxy(snake.x[snake.length - 1],snake.y[snake.length - 1]);
            snake.length--;
            printf(" ");
            score--;
            gotoxy(MAPLENGTH + 1,MAPWIDTH + 1);
            printf("你的得分:%d",score);
    }
}
//判断蛇的状态
int snakestatus()
{
    if(snake.x[0] == 0 || snake.x[0] == MAPLENGTH || snake.y[0] == 0 || snake.y[0] == MAPWIDTH)
        return 0;
    for(int k = 1;k < snake.length;k++)
    {
        if(snake.x[0] == snake.x[k] && snake.y[0] == snake.y[k])
            return 0;
    }
    return 1;
}
//光标跳转
void gotoxy (int x,int y)
{
    COORD pos;
    HANDLE handle;
    pos.X = x;
    pos.Y = y;
    handle = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(handle,pos);
}
  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值