C++ Getch()与linux c+;中的显示函数不兼容+;

C++ Getch()与linux c+;中的显示函数不兼容+;,c++,ncurses,curses,C++,Ncurses,Curses,我正在为一个班级制作一个2D地牢爬虫类游戏。我正在尝试接收用户输入,而不需要按enter键。具体地说,我想使用wasd作为方向键在二维数组中移动 我曾经尝试过使用ncurses库,但它目前干扰了我的显示功能(我相信在使用endl时) 通常情况下,我的板显示如下: xxx xxx xxx 但是当使用ncurses库中的getch()时,我的板看起来像: xxx ……xxx ……xxx 有没有一种方法可以使用curses库中的getch()而不干扰我的print函数 void ParkBoard::

我正在为一个班级制作一个2D地牢爬虫类游戏。我正在尝试接收用户输入,而不需要按enter键。具体地说,我想使用wasd作为方向键在二维数组中移动

我曾经尝试过使用ncurses库,但它目前干扰了我的显示功能(我相信在使用endl时)

通常情况下,我的板显示如下:
xxx
xxx
xxx

但是当使用ncurses库中的getch()时,我的板看起来像:
xxx
……xxx
……xxx

有没有一种方法可以使用curses库中的getch()而不干扰我的print函数

void ParkBoard::print() {
displayMessage();
for (int i = 0; i < getSize(); i++) {
    cout << " ";
    for (int j = 0; j < getSize(); j++) {
        if (j == 0) {
            parkBoard[i][j]->display();
        }
        else {
            cout << " ";
            parkBoard[i][j]->display();
        }
    }
    cout << endl;
}
void ParkBoard::print(){
displayMessage();
对于(int i=0;icoutncurses希望它能够完全控制显示终端。您正在使用ncurses进行输入,但仍将输出输出到
std::cout

这是行不通的。至少在没有重大黑客攻击的情况下

ncurses是一个全有或全无的交易。要么将ncurses用于输入,要么用于终端输出,要么完全使用其他东西

但是有一个更简单的解决方案,因为您所要做的只是“接收用户输入,而不需要按下enter键”:

  • 只需将文件描述符0置于非阻塞模式,并使用
    read()
    从fd 0读取(因为
    std::cin
    从非阻塞文件描述符读取时需要过多的保姆)
  • 请参阅手册页,并搜索
    O_NONBLOCK
    。然后:

  • 通过关闭
    ICANON
    标志,将终端置于非规范模式。请参阅手册页。这就是ncurses所做的,以访问原始击键

  • 如果程序中止,您需要做一些工作将终端恢复到规范模式,以便以“正常”终端模式返回shell。

    ncurses希望它能够完全控制显示终端。您正在使用ncurses进行输入,但仍将输出输出到
    std::cout

    这是行不通的。至少在没有重大黑客攻击的情况下

    ncurses是一个全有或全无的交易。要么将ncurses用于输入,要么用于终端输出,要么完全使用其他东西

    但是有一个更简单的解决方案,因为您所要做的只是“接收用户输入,而不需要按下enter键”:

  • 只需将文件描述符0置于非阻塞模式,并使用
    read()
    从fd 0读取(因为
    std::cin
    从非阻塞文件描述符读取时需要过多的保姆)
  • 请参阅手册页,并搜索
    O_NONBLOCK
    。然后:

  • 通过关闭
    ICANON
    标志,将终端置于非规范模式。请参阅手册页。这就是ncurses所做的,以访问原始击键
  • 如果程序中止,您需要做一些工作将终端恢复到规范模式,以便以“正常”终端模式返回shell。

    short:no

    长:

    诅咒(默认情况下)写入标准输出,如
    cout
    。但使用二合一程序需要切换I/O模式,并记住诅咒和
    cout
    的输出缓冲是不同的

    当curses初始化时,它会更改终端的输入和输出模式,以允许读取单个字符(输入),并允许使用单个回车符和换行符(输出)
    cout
    假设换行符(换行符)导致回车。当你使用诅咒时,那不是真的

    当curses初始化时,它保存终端输入和输出模式的副本,您可以使用curses和调用临时切换到/从中切换。使用这些而不是特别的termios调用来避免混淆诅咒

    除了终端模式外,还有对地址的输出缓冲。如果您使用
    cout
    向标准输出写入了一些内容,请在切换回诅咒之前刷新该流。从curses切换到
    cout
    时,在curses中执行a以确保屏幕处于已知状态

    虽然可以用于为诅咒指定实际输出流(并使它们不同于
    cout
    cin
    ),但仍必须使用curses接口来可靠地使用库。

    short:no

    长:

    诅咒(默认情况下)写入标准输出,如
    cout
    。但使用二合一程序需要切换I/O模式,并记住诅咒和
    cout
    的输出缓冲是不同的

    当curses初始化时,它会更改终端的输入和输出模式,以允许读取单个字符(输入),并允许使用单个回车符和换行符(输出)
    cout
    假设换行符(换行符)导致回车。当你使用诅咒时,那不是真的

    当curses初始化时,它保存终端输入和输出模式的副本,您可以使用curses和调用临时切换到/从中切换。使用这些而不是特别的termios调用来避免混淆诅咒

    除了终端模式外,还有对地址的输出缓冲。如果您使用
    cout
    向标准输出写入了一些内容,请在切换回诅咒之前刷新该流。从curses切换到
    cout
    时,在curses中执行a以确保屏幕处于已知状态

    虽然您可以使用指定诅咒的实际输出流(并使其不同于
    cout
    cin
    ),