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
相关产品推荐
相关产品推荐

