如何阻止/限制命令行数字记忆游戏的提前用户输入?
解决控制台数字记忆游戏的提前输入问题
你的问题核心是控制台输入缓冲区会保留用户在数字显示期间的输入,导致后续cin直接读取这些内容,破坏游戏逻辑。下面给出两种实用的解决思路:
方法一:清除输入缓冲区(通用简单)
在需要用户输入前,清空缓冲区里的所有残留内容,确保cin只读取用户在输入阶段的输入。
修改步骤:
- 在代码开头添加头文件:
#include <limits>
- 在
cin>>ans;之前插入清除缓冲区的代码:
displaytext("Enter what you memorised: ",0.05,false); // 新增:清除输入缓冲区 cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); cin>>ans;
方法二:临时禁用输入(平台特定,彻底阻止提前输入)
如果要完全禁止用户在数字显示期间输入,可以通过修改控制台/终端的输入模式实现:
Windows平台
使用Windows API修改控制台输入模式:
#include <windows.h> // 禁用输入 void disableInput() { HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); DWORD mode; GetConsoleMode(hStdin, &mode); SetConsoleMode(hStdin, mode & ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT)); } // 恢复输入 void enableInput() { HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); DWORD mode; GetConsoleMode(hStdin, &mode); SetConsoleMode(hStdin, mode | ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT); }
在游戏循环中调用:
displaytext("MEMORISE THIS ---> ",0.05,false); displaytext(to_string(num),0.2,false); disableInput(); // 显示数字时禁用输入 usleep(2000000); enableInput(); // 等待结束后恢复输入 system("CLS");
Linux/macOS平台
使用终端属性函数修改输入模式:
#include <termios.h> struct termios oldt, newt; // 禁用输入 void disableInput() { tcgetattr(STDIN_FILENO, &oldt); newt = oldt; newt.c_lflag &= ~(ICANON | ECHO); // 关闭规范模式与回显 tcsetattr(STDIN_FILENO, TCSANOW, &newt); } // 恢复输入 void enableInput() { tcsetattr(STDIN_FILENO, TCSANOW, &oldt); }
调用方式和Windows平台一致。
额外优化建议
- 你的
rng()函数每次调用都重新执行srand(time(NULL)),短时间内会生成重复随机数,建议把srand(time(NULL))放在main()开头仅调用一次。 checkans函数中ans是int类型,但num是long long,当数字位数超过int范围时会出错,建议将ans也改为long long类型。
内容的提问来源于stack exchange,提问作者henry
相关产品推荐
相关产品推荐

