如何制作每秒从 30 乘 1 倒计时的计时器?

How to make a timer that counts down from 30 by 1 every second?

本文关键字:倒计时 计时器 何制作      更新时间:2023-10-16

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

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

这将输出 60、59 等。但这不允许在程序运行时进行任何输入。我如何制作它,以便您可以在倒计时运行时输入内容?

上下文

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

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

#include <Windows.h>
#include <iostream>
int main() {
// Initialization
ULARGE_INTEGER initialTime;
ULARGE_INTEGER currentTime;
FILETIME ft;
GetSystemTimeAsFileTime(&ft);
initialTime.LowPart = ft.dwLowDateTime;
initialTime.HighPart = ft.dwHighDateTime;
LONGLONG countdownStartTime = 300000000; // 100 Nano seconds
LONGLONG displayedNumber = 31; // Prevent 31 to be displayed
// Game loop
while (true) {
GetSystemTimeAsFileTime(&ft); // 100 nano seconds
currentTime.LowPart = ft.dwLowDateTime;
currentTime.HighPart = ft.dwHighDateTime;
//// Read Input ////
bool stop = false;
SHORT key = GetKeyState('S');
if (key & 0x8000)
stop = true;
//// Game Logic ////
LONGLONG elapsedTime = currentTime.QuadPart - initialTime.QuadPart;
LONGLONG currentNumber_100ns = countdownStartTime - elapsedTime;
if (currentNumber_100ns <= 0) {
std::cout << "Boom!" << std::endl;
break;
}
if (stop) {
std::wcout << "Stopped" << std::endl;
break;
}
//// Render ////
LONGLONG currentNumber_s = currentNumber_100ns / 10000000 + 1;
if (currentNumber_s != displayedNumber) {
std::cout << currentNumber_s << std::endl;
displayedNumber = currentNumber_s;
}
}
system("pause");
}

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

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