C++ Getch()与linux c+;中的显示函数不兼容+;
我正在为一个班级制作一个2D地牢爬虫类游戏。我正在尝试接收用户输入,而不需要按enter键。具体地说,我想使用wasd作为方向键在二维数组中移动 我曾经尝试过使用ncurses库,但它目前干扰了我的显示功能(我相信在使用endl时) 通常情况下,我的板显示如下: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::
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;i coutncurses希望它能够完全控制显示终端。您正在使用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
),