17static void kpsleep(
const double t) {
19 std::this_thread::sleep_for(std::chrono::milliseconds((
int)(1E3 * t + 0.5)));
23#define WIN32_LEAN_AND_MEAN
26using namespace std::chrono_literals;
28char getch(std::chrono::milliseconds
const &ms = 500ms) {
29 HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
30 DWORD dwMilliseconds = ms.count();
34 GetConsoleMode(hStdin, &dwMode);
35 DWORD newMode = dwMode & ~ENABLE_LINE_INPUT;
36 SetConsoleMode(hStdin, newMode);
38 DWORD result = WaitForSingleObject(hStdin, dwMilliseconds);
41 if (result == WAIT_OBJECT_0) {
43 if (ReadFile(hStdin, &ch, 1, &dwRead, NULL) && dwRead == 1) {
49 SetConsoleMode(hStdin, dwMode);
54#elif defined(__linux__) || defined(__unix__) || defined(__APPLE__)
57char getch(chrono::milliseconds
const &ms = 500ms) {
59 Mads::milliseconds_to_tv(ms, tv);
60 struct termios oldt, newt;
65 tcgetattr(STDIN_FILENO, &oldt);
67 newt.c_lflag &= ~(ICANON | ECHO);
69 tcsetattr(STDIN_FILENO, TCSANOW, &newt);
73 FD_SET(STDIN_FILENO, &readfds);
75 int select_result = select(STDIN_FILENO + 1, &readfds, NULL, NULL, &tv);
77 if (select_result > 0 && FD_ISSET(STDIN_FILENO, &readfds)) {
83 tcsetattr(STDIN_FILENO, TCSANOW, &oldt);