我是编码的初学者,我被指示编写基于文本的游戏,所以我试图弄清楚是否有可能仅在C语言中在有限的时间内打印出一条语句并且是否还可以让他们在有限的时间内输入答案?问题是,如果我打印出一些东西,它们可能会向上滚动,而这正是我要避免的事情。如果可能,请在下面输入我可以参考的代码或资源。谢谢。
答案 0 :(得分:4)
默认情况下,终端被设计为在缓冲区中逐渐发出越来越多的文本行。文本被添加到末尾,并且前几行保持可见(直到终端配置的缓冲区大小的限制)。
通过更改终端模式,可以获得更多的“ GUI”感觉,这通常使用 curses 或 ncurses 之类的库来完成。这将允许您在窗口的特定部分显示文本,并删除该文本。结束程序后, curses “重置”终端,使整个“ GUI”消失(尽管某些终端如果向上滚动页面仍会向用户显示GUI的“最终状态”)
一个代码示例将是有关如何使用 ncurses 的教程,该教程对于这种媒介来说有点太宽泛了,但并不难找到。
由于您正在学习入门课程,因此很可能会鼓励您去做下一个最好的事情:
在上述#3以外的所有情况下,实现“计时器”的责任由您自己承担。
答案 1 :(得分:0)
您可以打印退格键以删除刚显示的文本。像这样:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main() {
char * string = "Hello";
printf("%s", string);
fflush(stdout);
sleep(1);
char * backspaces = malloc(strlen(string) * sizeof(char));
for (int i = 0 ; i < strlen(string) ; i++) backspaces[i] = '\b';
printf("%s", backspaces);
}
对于有限时间的有效输入,您可以使用gettimeofday来检查输入是否在规定时间内。
答案 2 :(得分:0)
使用ANSI转义命令执行以下操作:1)记住光标当前所在的位置2)在行上打印(并记住printf()
返回的值3)启动计时器(例如,使用alarm()
)当计时器/警报到期时,将发出信号。使用信号标记事件,然后在主代码中:如果声明了信号标记,则使用ANSI转义序列将光标移动到保存/记住的位置,然后写入从原始printf()
返回的长度的空间数据。然后恢复光标
答案 3 :(得分:-1)
您可以使用\r
将打印光标移至行首。因此您可以替换该内容,以达到在一段时间后删除该内容的效果