Я пишу игру 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 (), или я должен сделать что-то еще?
Многие из «специальных» клавиш на клавиатуре — «Вверх», «Вниз», «Влево», «Вправо», «Домой», «Конец», «Функциональные клавиши» и т. Д. Фактически возвращают два кода сканирования с контроллера клавиатуры обратно в ЦП. Все «стандартные» ключи возвращают один. Поэтому, если вы хотите проверить наличие специальных ключей, вам нужно дважды вызвать getch ().
Например, стрелка вверх сначала 224, а затем 72.
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
вернуть ключ, который выходит из цикла.