所以我有一个用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,好像窗口中没有空白区域。知道为什么吗?
答案 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