Как я могу использовать kbhit() и getch() в Linux? С++

Я пишу простую игру про змейку на C++. Но у меня проблема: мне нужно использовать kbhit() и getch() для чтения того, что вводит пользователь. Для ее использования мне нужна conio.h, но в Linux этой библиотеки нет. Я попытался использовать это, но возникла проблема: код компилируется но я не могу использовать программу, она просто останавливается.

Итак, как я могу использовать kbhit() и getch()? Или есть какая-то альтернатива ему?

Мой код:

#include <iostream>
#include <conio.h>
using namespace std;

bool GameOver;
const int height = 20;
const int width = 20;
int x, y, fruit_x, fruit_y, score;
enum eDirection { STOP, RIGHT, LEFT, UP, DOWN };
eDirection dir;

void setup() {
    GameOver = false;
    dir = STOP;
    x = width / 2 - 1;
    y = height / 2 - 1;
    fruit_x = rand() % width;
    fruit_y = rand() % height;
    score = 0;
}

void draw() {
    system("clear");

    for (int i = 0; i < width; i++)
    {
        cout << "#";
    }
    cout << endl;

    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            if (j == 0 || j == width - 1)
        {
            cout << "#";
        }
        if (i == y && j == x)
        {
            cout << "0";
        }
        else if (i == fruit_y && j == fruit_x)
        {
            cout << "F";
        }
        else
        {
            cout << " ";
        }
    }
    cout << endl;
    }

    for (int i = 0; i < width; i++)
    {
        cout << "#";
    }
    cout << endl;
}

void input() {
    if (_kbhit)
    {
        switch(getch())
    {
        case 'a':
            dir = LEFT;
            break;
        case 'd':
            dir = RIGHT;
            break;
        case 'w':
            dir = UP;
            break;
        case 's':
            dir = DOWN;
            break;
        case 'x':
            GameOver = true;
            break;
        }
    }
}

void logic() {
    switch(dir)
    {
    case LEFT:
        x--;
        break;
    case RIGHT:
        x++;
        break;
    case UP:
        y--;
        break;
    case DOWN:
        y++;
        break;
    }
}


int main() {
    setup();
    while(!GameOver)
    {
        draw();
        input();
        logic();
    }

}

person h4cktivist    schedule 28.04.2020    source источник
comment
Вероятно, вы ищете ncurses.   -  person Eljay    schedule 28.04.2020
comment
game.cpp: 63: 6: ошибка: «kbhit» не был объявлен в этой области. Нет kbhit() и getch()   -  person h4cktivist    schedule 28.04.2020
comment
Правильно, API для ncurses отличается от API для conio. Вам нужно будет прочитать документацию для ncurses.   -  person Eljay    schedule 28.04.2020
comment
Итак, я попытался использовать это. Я должен сделать while(true) для чтения того, что вводит пользователь, но это останавливает мой код   -  person h4cktivist    schedule 28.04.2020
comment
Вы включили режим без задержки, как указано в getch документация?   -  person Eljay    schedule 28.04.2020
comment
Итак, я использую while (true) { switch(getch()) {...} }. И получите /tmp/ccDiCfGP.o: В функции input()': game.cpp:(.text+0x1fa): undefined reference to stdscr' game.cpp:(.text+0x202): неопределенная ссылка на `wgetch' collect2: error: ld вернул 1 статус выхода   -  person h4cktivist    schedule 28.04.2020
comment
Вы установили библиотеку ncurses (ссылка)? Вы ссылаетесь на библиотеку ncurses? Получили ли вы пример программа ncurses работает?   -  person Eljay    schedule 28.04.2020
comment
Да, я установил и подключил библиотеку. Я смотрел пример и работал с ним   -  person h4cktivist    schedule 28.04.2020


Ответы (1)


Как сказано в zoelabbb в этом ссылка,

Шаг 1: Откройте терминал sudo apt-get update

sudo apt-get upgrade
sudo apt-get install git
git clone https://github.com/zoelabbb/conio.h.git
cd conio.h

Шаг 2 :

sudo cp conio.h /usr/include/

или (шаг 2)

В графическом интерфейсе, используя пакет open-as-administrator:

Copy file conio.h --> !! copy file not folder !!
Go to /usr/include/
Right click on folder /usr/include/
Choose Open as Administrator
Paste file conio.h

Наконец после шага 1 и шага 2 вы можете использовать #include <conio.h> в своем коде.

person javad m    schedule 04.10.2020