改变背景颜色会破坏程序? (ncurses的)

时间:2014-12-18 15:05:44

标签: c colors background ncurses

所以我有一个用ncurses制作的基本的“蛇”游戏。

添加时

start_color();
    init_color(COLOR_BLUE, 0, 0, 0);
    init_pair(1, COLOR_WHITE, COLOR_BLUE);
    bkgd(COLOR_PAIR(1));

改变背景颜色,程序进入无限循环。调试告诉我程序在生成食物时停止。这是代码:

void generate_food(food *food, int nrows, int ncols, snake *snake) {
    srand(time(NULL));
    int validLocation = 0;      

    do {
        food->x = rand() % nrows;
        food->y = rand() % ncols;
        if ( mvinch(food->x, food->y) == ' ' )
            validLocation = 1;
    }
    while (!validLocation);
    move(food->x, food->y);
    addch('*');
}

检查随机位置是否为空(=='')并在其中放入'*'。

完美无缺,直到我更改bkgd。它停留在do-while,好像窗口中没有空白区域。知道为什么吗?

1 个答案:

答案 0 :(得分:0)

ncurses中,mvinch不仅会返回该字符,还会返回chtype,其中包含字符信息,还会提供属性和颜色信息。这意味着,为了将其与角色进行比较,您必须从chtype中提取角色信息。

为此,ncurses提供了几个位掩码。从联机帮助页:

   Attributes
       The following bit-masks may be AND-ed with characters returned by winch.

       A_CHARTEXT     Bit-mask to extract character
       A_ATTRIBUTES   Bit-mask to extract attributes
       A_COLOR        Bit-mask to extract color-pair field information

简而言之,如果您为窗口设置背景颜色,mvinch将永远不会返回' '。相反,你可以使用:

if (mvinch(food->x, food->y) & A_CHARTEXT == ' ')

另见man mvinch