如何使计时器每秒从30倒数1?

问题描述 投票:0回答:3

我想让一个计时器每秒显示30、29等,然后在有输入时停止。我知道您可以这样做:

    for (int i = 60; i > 0; i--)
    {
        cout << i << endl;
        Sleep(1000);
    }

这将输出60​​、59等。但这在程序运行时不允许任何输入。如何做到这一点,以便您在倒计时运行时可以输入内容?

Context

这不是家庭作业。我正在制作一款文字冒险游戏,并且有一个区域,敌人会冲向您,您有30秒的时间来决定要做什么。我不知道如何使计时器能够在运行时允许用户输入内容。

c++ windows chrono
3个回答
1
投票

如果在Linux上运行,则可以使用经典的select()调用。在while循环中使用时,您可以等待一个或多个文件描述符的输入,同时还提供了一个超时,之后必须返回select()调用。将所有内容循环包装,就可以同时进行倒数计时和对标准输入的处理。

https://linux.die.net/man/2/select


0
投票

您的游戏约为每秒1帧,因此用户输入是一个问题。通常,游戏具有较高的帧频,如下所示:

while (true){
    CheckTime(); // Start frame, or Sleep(1) and continue. Use this for constant frame rate or delete this for full speed. 
    ReadInput(); // Use _getch() in conio.h to avoid echo
    GameLogic();
    Render(); // Write your countdown number if necessary
}

0
投票

我认为这不是最佳解决方案,但希望对您有所帮助:)

#include <iostream>
#include <Windows.h>
#include <omp.h>
using namespace std;

int main()
{
    omp_set_num_threads(2);
    volatile bool flag = true;
#pragma omp parallel
    {
        for (int i = 0; i < 60; i++)
        {
            if(!flag) break;
            if (omp_get_thread_num() == 0)
            {
                cout << i << endl;
                Sleep(1000);
            }
            if(omp_get_thread_num() == 1)
            {
                cout<<"asd";
                int x;
                cin>>x;
                flag = false;
            }
        }
    }
    return 0;
}

注意:编译此代码时,请使用-fopenmp参数。

像这样g ++ x.cpp -fopenmp

祝您有美好的一天:)

© www.soinside.com 2019 - 2024. All rights reserved.