如果在那段时间条件发生变化(不再成立),我应该用什么来停止 C 中的 sleep() 函数?

What should I use to stop the sleep() function in C if a condition changes in that period of time (doesn't hold anymore)?

我是 C 中的 业余爱好者,我有以下任务:我们有一个二维 table,玩家控制 'X' 在中间。玩家应该可以移动 'X'。但是,每 2 秒一个随机字符会出现在 table 边界附近的特定点,这样如果边界附近的所有方块中都有一个字符,玩家就输了。

我在移动 'X' 时遇到问题,同时随机字符每 2 秒出现一次。如果我按下按钮向任何方向移动 'X' 但代码仍然是 'sleeping',只有在一定的剩余时间过去后才会发生变化,即几乎不够好 - 每 2 秒 1 次移动.

我希望 sleep() 函数在 键盘输入 停止 ,在 [=44] 上打印更改的位置=] 和 重新开始 之后的剩余时间,或者至少再次睡眠 2 秒。但是,我目前无法理解所有复杂的东西,比如多线程,所以你能用简单的术语详细说明你的答案吗?我的电脑正在使用 Windows.

这是我的部分代码:

void move()
{
    if (kbhit())
    {
        chkb = getch();//character from keyboard
        if ((int)chkb == 27)//if chkb is ESC
        {
            printf("\nGame Exited. We already miss you!");
            stop();
        }
        else
        {
            changeposition();
            printTable();
        }
    }
}

while (1)
    {
        move();
        switch (rand() % 4)
        {
        case 0:
            balls[p1][p2] = 'R';//array of chars
            break;
        case 1:
            balls[p1][p2] = 'G';
            break;
        case 2:
            balls[p1][p2] = 'B';
            break;
        case 3:
            balls[p1][p2] = 'Y';
            break;
        default:
            balls[p1][p2] = '?';
        }

        printTable();
        verifyLose();
        Sleep(2000);
        }
    }
    printTable();

我正在寻找类似的东西:

Sleep(for a time, if some condition is true);
if(condition is false){
    ->make it true
    ->start sleep again with remaining time
}

或类似的东西。有任何想法吗?提前致谢!

请注意,sleep 函数 不是 C11 标准的一部分。您可以通过阅读 n1570, the draft C11 standard. See also this C reference 网站进行检查。

但是 sleep 是 POSIX 的一部分。例如阅读 sleep(3).

您可能想要使用一些 event looping library, such as Glib from GTK (cross-platform on Windows, Linux, MacOSX), or libev or libevent

您可能想要使用终端界面库,例如 ncurses

您可以考虑在 cross-platform 库之上编写图形应用程序,例如 GTK (or Qt, or FLTK; both requiring learning programming in C++)

您可以决定编写 Windows-specific C 程序。

然后请务必阅读 WinAPI, e.g. here

的文档

我自己从未在 Windows 上编写过代码,但我相信您可能会对 Windows 具体的 Sleep function.

感兴趣

我想对于游戏来说,您需要一些 input-multiplexing 功能。在 Linux 上,select(2) or poll(2) comes to mind. Perhaps you might be interested by Socket.Poll 在 Windows 上(但应以其他方式轮询键盘或鼠标)。

对于游戏,我建议使用 libSFML

无论您要使用什么 API 或库,请务必阅读其文档

另请在 github.

上查找 现有 open-source 个示例

另请阅读 C 编译器的文档(也许 GCC) and of your debugger (maybe GDB). Enable all warnings and debug info in your compiler (with GCC, compile with gcc -Wall -Wextra -g). Consider using static analysis tools like Clang static analyzer or Frama-C. Read perhaps this draft report, and look (at end of 2020) into the DECODER European project, and recent papers to ACM SIGPLAN 赞助的会议(关于编译器和静态分析)。

请注意 PC 键盘有多种布局(我的是 AZERTY)。你可能想使用一些库来抽象这些。

我不会调用 MS Sleep() 或 gcc sleep(),而是使用非阻塞函数,就像 MS kbhit().

对于 1 秒计时器,使用示例是

clock_t target = clock() + CLOCKS_PER_SEC;
while(!kbhit() && clock() < target) {
    // some code if needed
}

循环将在按下某个键或1秒后结束。您可以再次检查 kbhit() 以找出是哪一个。