如何在不为每个字符使用 Sleep() 的情况下一次输出一个字母,就像它正在打字一样?
3 回答
睡眠是最好的选择,因为它不会浪费 CPU 周期。
另一个选项是忙于等待,这意味着您不断旋转执行 NoOps。你可以用任何完全不做任何事情的循环结构来做到这一点。我不确定这是为了什么,但似乎您可能还想随机化您在角色之间等待的时间以使其具有自然的感觉。
我将有一个 Tick() 方法,该方法将遍历字母,并且仅在随机数小于我设置的阈值时才进行。
一些伪代码可能看起来像
int escapeIndex = 0;
int escapeMax = 1000000;
boolean exportCharacter = false;
int letterIndex = 0;
float someThresh = 0.000001;
String typedText = "somethingOrOther...";
int letterMax = typedText.length();
while (letterIndex < letterMax){
escapeIndex++;
if(random(1.0) < someThresh){
exportCharacter = true;
}
if(escapeIndex > escapeMax) {
exportCharacter = true;
}
if(exportCharacter) {
cout << typedText.charAt(letterIndex);
escapeIndex = 0;
exportCharacter = false;
letterIndex++;
}
}
如果我在视频游戏中这样做,可以说模拟玩家在终端中输入文本,这就是我的做法。每次都不一样,它的逃生机制为操作提供了最大时间限制。
睡眠是完成您所描述的事情的最佳方式,作为替代方案,忙于等待只会浪费 CPU 周期。从评论中,听起来你一直在尝试手动硬编码你想用睡眠调用打印的每个字符,而不是使用循环......
由于没有迹象表明这是大约 20 分钟后的作业,我想我会发布这段代码。它使用usleep
from ,如果您使用的是 Windows try <unistd.h>
,它会休眠 X微秒Sleep()
。
#include <stdio.h>
#include <unistd.h>
void type_text(char *s, unsigned ms_delay)
{
unsigned usecs = ms_delay * 1000; /* 1000 microseconds per ms */
for (; *s; s++) {
putchar(*s);
fflush(stdout); /* alternatively, do once: setbuf(stdout, NULL); */
usleep(usecs);
}
}
int main(void)
{
type_text("hello world\n", 100);
return 0;
}
由于stdout
已缓冲,因此您将不得不在打印每个字符 ( ) 后刷新它,或者通过运行一次fflush(stdout)
将其设置为根本不缓冲输出。setbuf(stdout, NULL)
"hello world\n"
上面的代码将在每个字符之间延迟 100ms打印;非常基础。