2014-12-18 4 views
1

그래서 나는 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를 변경할 때까지 완벽하게 작동합니다. 마치 창에 빈 공간이없는 것처럼 잠시 멈 춥니 다. 왜 그런가?

답변

0

ncurses에서 mvinch은 문자를 반환하는 것이 아니라 문자 정보와 atttributes 및 색상 정보가 포함 된 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

참조