ncurses: обрабатывает ввод с клавиатуры в терминале на C

#c #ncurses

#c #ncurses

Вопрос:

Я пытаюсь создать простую игру в тетрис в терминале. Мне нужно перемещать фигуры, когда игрок нажимает клавишу со стрелкой. Я слышал о методе getch(), но, похоже, он не работает с клавишами со стрелками (все они были обнаружены с помощью одного и того же кода ввода: 27). Что мне делать?

Вот мой текущий код:

     initscr();
    int inputCode;
    do
    {
        inputCode = getch();
        // here I would put my code to move the pieces if the code is right
    } while (inputCode != 113); // q to exit
    endwin();
  

С уважением,
Томас

Комментарии:

1. Вы всегда можете использовать wasd

2. getch() должен возвращать KEY_UP , KEY_DOWN , KEY_LEFT или KEY_RIGHT при нажатии. Попробуйте добавить вызовы raw(); keypad(stdscr, TRUE); noecho(); перед циклом.

3. Эти статьи могут быть полезны. NCURSES- клавиши со стрелками не обнаружены? , 11. Взаимодействие с клавиатурой

Ответ №1:

Как указано на странице руководства:

    Most programs would additionally use the sequence:

       intrflush(stdscr, FALSE);
       keypad(stdscr, TRUE);
  

То есть ваша программа должна включить режим клавиатуры, чтобы получить KEY_UP и т. Д:

Опция клавиатуры включает клавиатуру терминала пользователя. Если включено (значение bf равно TRUE), пользователь может нажать функциональную клавишу (например, клавишу со стрелкой), и wgetch(3x) возвращает единственное значение, представляющее функциональную клавишу, как в KEY_LEFT . Если отключено (bf равно FALSE), curses не обрабатывает функциональные клавиши специально, и программа должна сама интерпретировать escape-последовательности. Если клавиатура в терминале может быть включена (настроена на передачу) и выключена (настроена на локальную работу), включение этой опции приводит к включению клавиатуры терминала при вызове wgetch(3x). Значение по умолчанию для клавиатуры равно FALSE .