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