如果在那段时间条件发生变化(不再成立),我应该用什么来停止 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()
以找出是哪一个。
我是 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()
以找出是哪一个。