首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果某个条件在这段时间内发生了变化(不再有效),我应该使用什么来停止C中的use ()函数?

如果某个条件在这段时间内发生了变化(不再有效),我应该使用什么来停止C中的use ()函数?
EN

Stack Overflow用户
提问于 2020-11-14 11:01:17
回答 2查看 236关注 0票数 1

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

我在移动'X‘时遇到问题,同时随机字符每2秒出现一次。如果我按下按钮向任何方向移动'X‘,但是代码仍在“休眠”,则只有在某些剩余时间过去之后才会发生更改,这几乎是不够好的-- 1每2秒移动一次

我希望()函数在有键盘输入时停止,在表上打印已更改的位置,然后重新启动,然后再使用剩余的时间,或者至少再睡2秒。然而,我无法理解所有复杂的东西,如多线程,所以你能不能简单地解释一下你的答案?我的电脑使用的是。

下面是我代码的一部分:

代码语言:javascript
复制
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();

我在找这样的东西:

代码语言:javascript
复制
Sleep(for a time, if some condition is true);
if(condition is false){
    ->make it true
    ->start sleep again with remaining time
}

或者类似的东西。有什么想法吗?提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-14 12:38:53

我不会调用MS Sleep()或gcc sleep(),而是选择一个非阻塞功能,就像您对MS kbhit()一样。

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

代码语言:javascript
复制
clock_t target = clock() + CLOCKS_PER_SEC;
while(!kbhit() && clock() < target) {
    // some code if needed
}

当一个键被按下,或者1秒后,循环就会结束。您可以再次检查kbhit()以找出哪个。

票数 3
EN

Stack Overflow用户

发布于 2020-11-14 11:06:26

注意,sleep函数不是C11标准的一部分。您可以通过阅读n1570 ( C11标准草案)进行检查。也请参阅这个C参考网站。

sleep是POSIX的一部分。例如,阅读睡眠(3)

您可以使用一些事件循环库,例如来自GTK的滑翔 (跨平台Windows、Linux、MacOSX)或利别夫利贝特

您可以使用终端接口库,如诅咒

您可以考虑在跨平台库(如GTK (或QtFLTK;两者都需要学习用C++编程)之上编写一个图形应用程序)。

您可以决定编写一个特定于Windows的C程序。

然后一定要阅读WinAPI的文档,例如这里

我本人从未在Windows上进行过编码,但我相信您可能会对Windows特定的函数感兴趣。

我想对于一个游戏来说,你需要一些输入多路复用功能。在Linux上,出现了选择(2)民意测验(2)。也许您会对Windows上的Socket.Poll感兴趣(但轮询键盘或鼠标应该不这样做)。

对于游戏,我建议使用libSFML

无论您将使用何种API或库,请确保阅读其文档

还请参阅github上现有的开放源代码示例。

还可以阅读C编译器(可能是GCC)和调试器(可能是GDB)的文档。在编译器中启用所有警告和调试信息(使用GCC,用gcc -Wall -Wextra -g编译)。考虑使用静态分析工具,如Clang静态分析仪Frama-C。读一读这份草稿的报告,看看(2020年末) 译码器欧洲项目,以及山羊座赞助的会议(关于编译器和静态分析)的最新论文。

请注意,PC键盘有不同的布局(我的是阿兹蒂)。您可能需要使用一些库对这些进行抽象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64833192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档