Unicode青蛙图标作食物时贪吃蛇垂直进食bug修复求助
问题分析与修复方案
问题根源
U+1318F是双列宽Unicode字符,终端中这类字符会占用2个相邻的字符单元格。你的碰撞检测逻辑仅检查蛇头坐标与食物的起始坐标(food.x, food.y)是否匹配,但当蛇从垂直方向右侧靠近时,蛇头的x坐标实际是food.x + 1,y坐标与食物一致,此时原有逻辑无法识别碰撞。
修复步骤
1. 确保ncurses宽字符支持正确初始化
ncurses默认不启用宽字符处理,必须先设置系统locale并使用宽字符绘制函数:
#include <locale.h> int main() { // 初始化locale,让ncurses识别宽字符 setlocale(LC_ALL, ""); initscr(); // 后续初始化代码(cbreak()、noecho()等) }
绘制食物时,替换mvaddch为宽字符专用函数:
// 定义宽字符食物图标 wchar_t food_icon = 0x1318F; // 在指定坐标绘制宽字符 mvaddwstr(food.y, food.x, &food_icon);
2. 修改碰撞检测逻辑
更新进食判定条件,同时检查蛇头是否处于宽字符占用的两个单元格之一:
// 假设snake_head是存储蛇头坐标的结构体,food是食物坐标结构体 if ((snake_head.x == food.x || snake_head.x == food.x + 1) && snake_head.y == food.y) { // 触发进食逻辑:增长蛇身、生成新食物等 grow_snake(); spawn_food(); }
3. 调整食物生成边界
为避免宽字符超出终端右侧边界,生成食物时限制x坐标的最大值:
void spawn_food() { // COLS是终端列数,减2是因为宽字符占2列 food.x = rand() % (COLS - 2); food.y = rand() % (LINES - 1); // 额外检查食物坐标是否与蛇身重叠(原有逻辑保留) while (check_collision_with_snake(food.x, food.y) || check_collision_with_snake(food.x+1, food.y)) { food.x = rand() % (COLS - 2); food.y = rand() % (LINES - 1); } }
验证测试
修复后测试以下场景:
- 蛇从食物左侧水平移动进食
- 蛇从食物右侧水平移动进食
- 蛇从食物上方/下方垂直移动(蛇头处于food.x或food.x+1位置)进食
所有场景均应正确触发进食逻辑。
内容的提问来源于stack exchange,提问作者Linuxero
相关产品推荐
相关产品推荐

