You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言开发贪吃蛇游戏,如何实现蛇吃到食物后身体长度增加功能

C语言贪吃蛇蛇身增长实现方案

核心实现思路

用两个数组分别存储蛇身每一段的横、纵坐标,新增长度变量记录当前蛇的总长度。蛇移动时从尾部开始逐段把坐标更新为前一段的坐标,再更新蛇头位置;吃到食物时直接将长度+1即可完成增长,不需要额外处理尾部坐标。

具体修改步骤

1. 新增全局变量

保留原有全局变量,新增蛇身存储相关变量:

int tailX[100], tailY[100]; // 存储蛇身各段坐标,最大支持100段,可按需调整
int length; // 记录蛇的总长度

2. 修改setup初始化函数

在setUp函数中新增长度初始化逻辑:

void setUp()
{
    gameover = false;
    x = width / 2;
    y = height / 2;
    length = 1; // 新增:初始蛇长度为1(只有蛇头)
    label1:
    fruitX = (int)rand() % width-1;
    if(fruitX <= 0 || fruitX >= height || fruitX >= width)
        goto label1;

    label2:
    fruitY = (int)rand() % height-1;
    if(fruitY <= 0 || fruitY >= height || fruitY >= width)
        goto label2;
    score = 0;
}

3. 修改logic逻辑函数

新增蛇身坐标位移、撞自身判断、长度增长逻辑:

void logic()
{
    // 新增:处理蛇身坐标逐段位移
    int prevX = tailX[0];
    int prevY = tailY[0];
    int prev2X, prev2Y;
    tailX[0] = x;
    tailY[0] = y;
    for (int i = 1; i < length; i++)
    {
        prev2X = tailX[i];
        prev2Y = tailY[i];
        tailX[i] = prevX;
        tailY[i] = prevY;
        prevX = prev2X;
        prevY = prev2Y;
    }

    // 原有蛇头移动逻辑保留
    switch(flag)
    {
        case 1: // UP
            x--;
            usleep(200000);
            break;
        case 2: //DOWN
            x++;
            usleep(200000);
            break;
        case 3:  //LEFT
            y--;
            usleep(200000);
            break;
        case 4:  //RIGHT
            y++;
            usleep(200000);
            break;
    }
    // 原有撞墙逻辑保留
    if(x == width || y == height || x == -1 || y == -1)
    {
        gameover = 1;
    }
    // 新增:撞自身判断逻辑
    for (int i = 0; i < length; i++)
    {
        if (tailX[i] == x && tailY[i] == y)
            gameover = true;
    }
    // 原有吃果实逻辑修改
    if(x == fruitX && y == fruitY)
    {
        label1:
        fruitX = (int)rand() % width-1;
        if(fruitX <= 0 || fruitX >= width || fruitX >= height)
            goto label1;
        label2:
        fruitY = (int)rand() % height-1;
        if(fruitY <= 0 || fruitY >= width || fruitY >= height)
            goto label2;
        score += 5;
        length++; // 新增:吃到果实长度+1,自动完成增长
    }
}

4. 修改draw绘制函数

新增蛇身绘制逻辑:

// MIDDLE AREA
for(int i = 0; i < width; i++)
{
    for(int j = 0; j < height; j++)
    {
        if(j == 0)
        {
            printf("#");
        }
        if(x == i && y == j)
        {
            printf("0"); // 蛇头
        }
        else if(fruitX == i && fruitY == j)
        {
            printf("f"); // 果实
        }
        // 新增:绘制蛇身
        else 
        {
            int print = 0;
            for (int k = 0; k < length; k++)
            {
                if (tailX[k] == i && tailY[k] == j)
                {
                    printf("o"); // 蛇身,可自定义字符
                    print = 1;
                }
            }
            if (!print)
            {
                if(j == width-1)
                {
                    printf("#");
                }
                else
                {
                    printf(" ");
                }
            }
        } 
    }
    printf("\n");
}

注意事项

  • tailX/tailY数组的长度可以根据游戏地图大小调整,只要大于地图总格子数就不会溢出
  • 可以自行修改蛇身的绘制字符,也可以调整增长的分数规则
  • 如果要优化随机果实生成逻辑,可以加判断避免果实生成在蛇身上,遍历tail数组判断坐标不重复即可

内容的提问来源于stack exchange,提问作者Nagraju Kasarla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 12:45:03