在C语言的游戏中测量时间和做动作

在C语言的游戏中测量时间和做动作,c,game-physics,C,Game Physics,我正在尝试用C语言开发一个游戏,使用conio创建ascii接口 我必须在迷宫中控制我的英雄,找到出口,避开敌人 每个敌人应该每1秒移动一次 但是我不知道如何控制我的英雄和每个敌人的移动(每1秒) 不使用线程就可以做到这一点吗?conio是msdos的旧接口。试着阅读有关ncurses的内容。并检查协同路由,而不是thrads。@ulix使用conio.h表明@Zaratruta很可能在windows上,因此应该是一个更好的建议。对于计时,线程睡眠非常简单。你为什么不想用它?如果你想提高时间准确

我正在尝试用C语言开发一个游戏,使用conio创建ascii接口

我必须在迷宫中控制我的英雄,找到出口,避开敌人

每个敌人应该每1秒移动一次

但是我不知道如何控制我的英雄和每个敌人的移动(每1秒)



不使用线程就可以做到这一点吗?

conio是msdos的旧接口。试着阅读有关ncurses的内容。并检查协同路由,而不是thrads。@ulix使用
conio.h
表明@Zaratruta很可能在windows上,因此应该是一个更好的建议。对于计时,线程睡眠非常简单。你为什么不想用它?如果你想提高时间准确性,你可以设定游戏在每一帧中处理工作所需的时间,然后在剩余的时间里睡觉。您可能应该这样做,因为控制台I/O速度很慢。仍然会有一个随机(大约1毫秒)的线程唤醒时间,但这应该不是问题,因为您需要1秒的速率。让我们假设conio是必需的,并且我们需要在没有线程的情况下执行此操作。有可能吗?是的,你只是运行一个循环,消耗CPU周期来产生延迟,同时也考虑到实际工作所花费的时间。这是非常准确的,因为您不必担心线程唤醒时间。箭鱼的答案似乎已经走上了正轨。conio是MSDO的一个旧接口。试着阅读有关ncurses的内容。并检查协同路由,而不是thrads。@ulix使用
conio.h
表明@Zaratruta很可能在windows上,因此应该是一个更好的建议。对于计时,线程睡眠非常简单。你为什么不想用它?如果你想提高时间准确性,你可以设定游戏在每一帧中处理工作所需的时间,然后在剩余的时间里睡觉。您可能应该这样做,因为控制台I/O速度很慢。仍然会有一个随机(大约1毫秒)的线程唤醒时间,但这应该不是问题,因为您需要1秒的速率。让我们假设conio是必需的,并且我们需要在没有线程的情况下执行此操作。有可能吗?是的,你只是运行一个循环,消耗CPU周期来产生延迟,同时也考虑到实际工作所花费的时间。这是非常准确的,因为您不必担心线程唤醒时间。箭鱼的答案看起来正朝着这个方向发展。除此之外,kbhit()将是一个函数,用于在这个循环中检测用户按键。此外,向循环中添加一个短睡眠(如10毫秒)将减少CPU使用,而不会对响应造成太大影响。@4386427谢谢,说得好。没有延迟
1
它肯定会在一秒前触发。但是如果用户不按任何键,敌人会冻结,对吗?@4386427如果在xx:yy:35.87调用时间,并且在xx:yy:36.01进行下一次检查,延迟是<1s@Zaratruta您应该使用
\u kbhit()
检查是否有要读取的输入,然后
\u getch()
像@hyde建议的那样获取它。要添加到这一点,kbhit()将是调用以检测此循环中用户按键的函数。此外,向循环中添加一个短睡眠(如10毫秒)将减少CPU使用,而不会对响应造成太大影响。@4386427谢谢,说得好。没有延迟
1
它肯定会在一秒前触发。但是如果用户不按任何键,敌人会冻结,对吗?@4386427如果在xx:yy:35.87调用时间,并且在xx:yy:36.01进行下一次检查,延迟是<1s@Zaratruta您应该使用
\u kbhit()
检查是否有要读取的输入,然后
\u getch()
像@hyde建议的那样获取它。
time_t last_time_moved = 0;
time_t delay = 1;
int user_input;

for(;;) { // in your game loop
    time_t now = time(NULL); // check for the current time

    // ...

    if(_kbhit()) {
        user_input = _getch();

        // act on user input
    }

    // ...

    if(now > (last_time_moved + delay)) {

        // move your enemies

        last_time_moved = time(NULL);
    }

    // ...
}