C++ 我怎样才能不间断地进行倒计时,每秒钟检查一次输入的内容

C++ 我怎样才能不间断地进行倒计时,每秒钟检查一次输入的内容,c++,C++,我正在为我的班级制作一个名为键盘训练器的游戏,我遇到了一个问题,我想做一个循环,从5到0计数,并检查每一个数字是否插入了什么东西,比如一个字符,但在我的代码中,它只是从5到0计数,对输入没有任何反应,我想让它对输入有反应,但这对倒计时没有任何影响 #include <cstdlib> #include "stdafx.h" #include <conio.h> #include <iostream> #include <string> #inclu

我正在为我的班级制作一个名为键盘训练器的游戏,我遇到了一个问题,我想做一个循环,从5到0计数,并检查每一个数字是否插入了什么东西,比如一个字符,但在我的代码中,它只是从5到0计数,对输入没有任何反应,我想让它对输入有反应,但这对倒计时没有任何影响

#include <cstdlib>
#include "stdafx.h"
#include <conio.h>
#include <iostream>
#include <string>
#include <windows.h>

using namespace std;

void countdown(){
    for (int o = 5; o >= 0 ; o--)//Countdown timeris, kuris skaiciuoja nuo 5 iki 0
    {
        cout << o << " ";//Isveda timerio duomenis
        Sleep(1000);//Palaukia 1 sekunde
    }
}

int main(){
    int ivestas_kl, sugeneruotas_kl, ats_neats = 0, taip_ne, Y_N, i = 0,   ats = 0, neats = 0;
    string taip;
    cout << "Sveiki atvyke i Klaviaturos Treniruokli!\n";
    cout << "Ar norite pradeti zaidima?(Y/N)?\n" << "Kai paspausite Y, jums atsiras  zaidimo taisykles.\n\n";
    Y_N = _getch();
    if (Y_N == 121)//Patikrina ar Y_N yra Y raide
    {
        while (Y_N != 110 && i % 2 == 0)//Jei Y_N nera N ir i padalinus is 2  nelieka liekanos
        {
            i++;
            cout << "\tTaisykles\n";
            cout << "\t-------------------------------------------------------------------\n";
            cout << "\t|Sio zaidimo metu, jus turesite paspausti atsitiktinai sugeneruota|\n\t|klavisa siam tikslui jus turesite 5s. Jei suspesite ji paspausti,|\n\t|jus gausite viena taska ir sitaip taskai bus pridedami po du, jei|\n\t|nesuklysdami atspesite kelis is eiles, bet jei neatspesite vieno,|\n\t|taskai vel prisides po viena ir taip kas 2 spejimus.Trukme- 1min.|\n";
            cout << "\t-------------------------------------------------------------------\n";
            cout << "Pradeti zaidima?(taip)\t";
            cin >> taip;

            while (Y_N != 27 && taip == "taip")//Kol Y_N nera ESC ir taip yra lygus taip
            {
                system("cls");
                sugeneruotas_kl = rand() % 78 + 48;//Sugeneruoja betkoki skaciu nuo 48 iki 126
                char kl = char(sugeneruotas_kl);//Konvertuoja is int i char
                cout << "Spauskite " << kl << " !\n\n";//Parodo koki klavisa paspausti
                countdown();
                ivestas_kl = _getch();//Paima ivesta simboli
                char konv_ivestas_kl = char(ivestas_kl);//Konvertuoja int i char
                if (ivestas_kl != 0 && konv_ivestas_kl == kl)//Jei ivestas_kl nera lygus 0 ir konv_ivestas_kl yra lygus ivestam ir jei timerio laikas nesibaige
                {
                    ats++;
                    cout << "\nTeisingai!\n\n" << "Norint baigti zaidima spauskite ESC.\n";
                    break;
                }
                else if (konv_ivestas_kl != kl)
                {
                    neats++;
                    cout << "\nNespejote.\n\n";
                    break;
                }//Else if pabaiga
            }//For pabaiga
            Y_N = _getch();
        }
    }//While pabaiga
}//Pirmo if pabaiga
#包括
#包括“stdafx.h”
#包括
#包括
#包括
#包括
使用名称空间std;
无效倒计时(){
对于(int o=5;o>=0;o--)//倒计时时间,kuris skaiciuoja nuo 5 iki 0
{
cout您可以试验
GetAsyncKeyState()
clock()
的组合。使用这些C函数,您可以1)定义第三个函数来测试任何键是否已按下(或最近被按下),2)测试该事件(或缺少事件)利用这些功能,您应该能够实现所描述的功能

下面是一个简单的示例程序,它同时执行以下两个功能:

编辑修改为测试是否立即按下键或最近按下键:

#包括
#包括
#包括
#包括
BOOL isAnyKeyDown(无效);ghh
内部主(空){
时钟;
浮子过去了;
t=时钟();
而(1)
{
if(isAnyKeyDown())
{
//输入键,重置计时器,然后做一些事情
printf(“少于一秒”);
break;//当然,除了break之外,你还可以做一些事情,这里只是演示一下
}
睡眠(10);
t=时钟()-t;
已用时间=((浮点)t)/每秒时钟数;
如果(经过时间>1)
{
printf(“超过一秒”);
中断;/(见上文注释)
}
}                                      
getchar();
返回0;
}
布尔·伊萨尼·凯杜夫(无效)
{
int i;

对于(i=8;据我所知,没有标准的、可移植的方法可以做到这一点。大多数编译器/环境提供了一种方法来做到这一点,但这取决于您的设置。请描述您的环境详细信息?
(0x8000000&GetAsyncKeyState(i)!=0)|(0x00000001&GetAsyncKeyState(i)!=0)
似乎比
要做的工作多得多(0x80000001&GetAsyncKeyState(i))!=0
@kfsone-无参数。从我阅读的方式来看,您同时检查两个位的建议可以提供与我编写的相同的逻辑,但效率更高。
bool countdown()
{
  for (int o = 5; o >= 0 && !_kbhit(); o--)
  {
    cout << o << " ";
    Sleep(1000);
  }

  return _kbhit();
}
ivestas_kl = countdown() ? _getch() : 0;
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <ansi_c.h>

BOOL isAnyKeyDown(void);ghh
int main(void) {
    clock_t t;
    float elapsed;

    t = clock();
    while (1) 
    {
        if (isAnyKeyDown()) 
        {
            //key entered, reset timer and do stuff
            printf("less than one second");
            break;//of course you can do something besides break, this here just for demonstration
        }
        Sleep(10);
        t = clock() - t;
        elapsed = ((float)t)/CLOCKS_PER_SEC;
        if(elapsed > 1) 
        {
            printf("longer than one second");
            break;//(see comment above)
        }
    }                                      
    getchar();
    return 0;
}

BOOL isAnyKeyDown(void)
{
    int i;
    for(i=8;i<255;i++)
    {   //check both MSB and LSB for keydown NOW, and Key recently hit
        if((0x80000000 & GetAsyncKeyState(i) != 0) || (0x00000001 & GetAsyncKeyState(i) != 0)) return TRUE; 
    }

    return FALSE;   
}