1

我正在为我的班级制作一个名为 Keyboard Trainer 的游戏,我遇到了一个问题,我想制作一个从 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
4

2 回答 2

2
bool countdown()
{
  for (int o = 5; o >= 0 && !_kbhit(); o--)
  {
    cout << o << " ";
    Sleep(1000);
  }

  return _kbhit();
}

用法:

ivestas_kl = countdown() ? _getch() : 0;
于 2013-11-14T15:52:59.907 回答
1

您可以尝试使用 和GetAsyncKeyState()clock()组合。使用这些 C 函数,您可以1)定义第三个函数来测试是否有任何键被按下(或最近被击中), 2 ) 针对经过的时间测试该事件(或缺少事件)。有了这些功能,您应该能够实现您所描述的。

下面是一个简单的示例程序,它可以同时执行这两种操作:

EDIT修改为测试现在按下键或最近按下键:

#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;   
}
于 2013-11-14T15:58:32.283 回答