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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 21:05:11