繁体   English   中英

Getch()与Linux C ++中的显示功能不兼容

[英]Getch() incompatible with display function in linux c++

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

我试过使用ncurses库,但当前它与我的显示功能混淆了(我相信在使用endl时)。

通常我显示的板看起来像:
xxx
xxx
xxx

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

有没有办法使用curses库中的getch()而不干扰我的打印功能?

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;
}

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

这是行不通的。 至少并非没有重大黑客攻击。

ncurses是一项全有或全无的交易。 您可以使用ncurses进行输入和终端输出,也可以完全使用其他方法。

但是有一个更简单的解决方案,因为您要做的就是“无需按下回车键即可接收用户输入”:

  1. 只需将文件描述符0置于非阻塞模式,并使用read()从fd 0进行read() (因为从非阻塞文件描述符读取std::cin会需要太多保姆)。

请参见fcntl(2)手册页,并搜索O_NONBLOCK 然后:

  1. 通过关闭ICANON标志将终端置于非规范模式。 请参见termios(3)手册页。 ncurses就是这样做的,以访问原始的击键。

如果程序中止,您将需要做一些工作以将终端恢复到规范模式,以便以“理智”的终端模式返回外壳。

简短:没有

长:

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

当curses初始化时,它将更改终端的输入和输出模式,以允许读取(输入)单个字符,并允许其使用单个回车和换行字符(输出)。 cout假定换行符(换行)引起回车。 当您使用诅咒时,情况并非如此。

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

终端模式外,还有输出缓冲可寻址。 如果您使用的东西写在标准输出cout ,切换回之前的诅咒流的冲刷。 从curses切换到cout 刷新 curses以确保屏幕处于已知状态。

尽管您可以使用newterm为curses指定实际的输出流(并使它们不同于coutcin ),但仍然必须使用curses接口来可靠地使用库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM