[英]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进行输入和终端输出,也可以完全使用其他方法。
但是有一个更简单的解决方案,因为您要做的就是“无需按下回车键即可接收用户输入”:
read()
从fd 0进行read()
(因为从非阻塞文件描述符读取std::cin
会需要太多保姆)。 请参见fcntl(2)手册页,并搜索O_NONBLOCK
。 然后:
ICANON
标志将终端置于非规范模式。 请参见termios(3)手册页。 ncurses就是这样做的,以访问原始的击键。 如果程序中止,您将需要做一些工作以将终端恢复到规范模式,以便以“理智”的终端模式返回外壳。
简短:没有
长:
curses(默认情况下)写入标准输出,例如cout
。 但是使用二合一程序需要您切换I / O模式,并要记住curses和cout
的输出缓冲是不同的 。
当curses初始化时,它将更改终端的输入和输出模式,以允许读取(输入)单个字符,并允许其使用单个回车和换行字符(输出)。 cout
假定换行符(换行)引起回车。 当您使用诅咒时,情况并非如此。
当curses初始化时,它将保存终端的输入和输出模式的副本,您可以使用curses调用reset_shell_mode
和reset_prog_mode
临时切换到该模式或从该模式切换到该reset_prog_mode
。 使用这些而不是临时的termios调用来避免混淆诅咒。
除终端模式外,还有输出缓冲可寻址。 如果您使用的东西写在标准输出cout
,切换回之前的诅咒做流的冲刷。 从curses切换到cout
, 请 刷新 curses以确保屏幕处于已知状态。
尽管您可以使用newterm
为curses指定实际的输出流(并使它们不同于cout
和cin
),但仍然必须使用curses接口来可靠地使用库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.