Я неправильно использую функцию getch () из библиотеки ncurses?

Я пишу игру Pacman на C ++ с использованием библиотеки ncurses, но я не могу правильно перемещать Pacman. я использовал getch() чтобы переместить его вверх, вниз, влево и вправо, но он двигается только вправо и больше никуда не двигается, когда я нажимаю любую другую клавишу.

Это фрагмент кода для продвижения вверх. Я написал аналогичный код с некоторыми измененными условиями для перемещения влево, вправо и вниз.

int ch = getch();
if (ch == KEY_RIGHT)
{
int i,row,column;
//getting position of cursor by getyx function
for (i=column; i<=last_column; i+=2)
{
//time interval of 1 sec

mvprintw(row,b,"<");   //print < in given (b,row) coordinates

//time interval of 1 sec

mvprintw(row,(b+1),"O");  //print "O" next to "<"int h = getch();   //to give the option for pressing another key
if (h != KEY_RIGHT)  //break current loop if another key is pressed
{
break;
}
}
}
if (condition)
{
//code to move left
}

Я неправильно использую getch (), или я должен сделать что-то еще?

3

Решение

Многие из «специальных» клавиш на клавиатуре — «Вверх», «Вниз», «Влево», «Вправо», «Домой», «Конец», «Функциональные клавиши» и т. Д. Фактически возвращают два кода сканирования с контроллера клавиатуры обратно в ЦП. Все «стандартные» ключи возвращают один. Поэтому, если вы хотите проверить наличие специальных ключей, вам нужно дважды вызвать getch ().

Например, стрелка вверх сначала 224, а затем 72.

1

Другие решения

261 согласуется с KEY_RIGHT (восьмеричное 0405 в curses.h). Это говорит нам, по крайней мере, что keypad был использован, чтобы позволить getch читать специальные ключи.

Показанный фрагмент не дает подсказки о том, как он был включен в остальную часть программы. Тем не менее, использование getch в цикле, скорее всего, источник путаницы, так как при выходе из цикла значение отбрасывается. Если вы ожидаете сделать что-то другое (от KEY_RIGHT), вы могли бы использовать ungetch сохранить (иначе отброшенное) значение в цикле, например,

if (h != KEY_RIGHT)  //break current loop if another key is pressed
{
ungetch(h);     //added
break;
}

Это позволит следующий позвонить getch вернуть ключ, который выходит из цикла.

0

По вопросам рекламы [email protected]