【问题标题】:Is there a way to block cin input for a certain time and then allow input again?有没有办法阻止cin输入一段时间然后再次允许输入?
【发布时间】:2015-09-09 11:06:02
【问题描述】:

我正在编写一个基于文本的游戏,其中通过在每个字符之间休眠几毫秒来打印到终端的消息,然后像这样从玩家那里获取输入:

#include <iostream>
#include <unistd.h>
#include <climits>
int main() {
    std::string line;
    std::string message = "LotsAndLotsAndLotsAndLotsAndLotsAndLotsAndLotsAndLotsAndLotsAndLotsAndLotsAndLotsAndLotsAndLotsAndLotsAndLotsOfText\n";
    for(char c : message) {
        usleep(1000 * 40);
        std::cout << c << std::flush;
    }

    std::getline(std::cin, line);
    std::cout << line << "\n";

    return 0;
}

问题是,如果玩家在打印消息时输入任何内容,getline 会捡起它。

我不能使用 cin.ignore,因为我不知道玩家在等待消息时可能会输入多少个字符或什么类型的字符。有没有办法解决这个问题?

【问题讨论】:

  • cin 就是这样。您需要使用特定于平台的输入 API 来阻止或被输入打断。
  • 也许您可以定义一个标志,在打印消息时,您应该通过从缓冲区中删除信息来忽略您阅读的所有内容。
  • 如果您需要高级终端操作(阻止用户输入、在任意位置输出...),ncurses 可能是一个不错的选择。
  • 消息是从单独的文件中读取的吗?这可能是有用的信息。

标签: c++ iostream cin


【解决方案1】:

这部分是推测性的答案,因为我还没有实际测试过。可以创建一个循环来阻止代码的其他部分执行,直到循环完成,该循环将一直运行到您完成消息为止。该循环将使用参数/标志,例如 eof 或者(我忘记这是否真的可能)类似行尾消息之类的东西。同时,您可以将获取输入的代码作为单独方法的一部分,以便该方法仅在您希望它被调用时才被调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    相关资源
    最近更新 更多