倒数C中的问答游戏

杜林斯福克

我想做一个倒计时的问答游戏。问题是; 当我使用系统时,cls所有打印都将进行。我尝试使用printf("/ b")在那种情况下,我无法从用户那里获取数据,因为系统处于循环中。

我可以保留问题输出并递减计数并从用户那里获取输入吗?

这是我的倒计时代码:

int v=30;
while(v!=0) {
    printf("\n\t%d",v);
    v--;
    sleep(1);
    system("cls");
}
大卫·兰金

如果我理解您的问题,并且只想在屏幕上的同一位置显示倒数,那么对于支持VT100仿真(和某些早期VTXX版本)的终端,您可以使用ANSI转义来控制光标的可见性和车回车键('\r')将光标位置返回到原始起点。如果对整型输出使用field-width修饰符,则甚至不需要ANSI转义符即可清除到行尾。如果您的倒数中包含可变数量的字符,则可以使用ANSI转义符清除到行尾,以确保在每次迭代中都删除所有文本。

例如,您可以这样做:

#include <stdio.h>
#include <unistd.h>

int main (void) {
    
    int v = 30;
    
    printf ("\033[?25l");                           /* hide cursor */
    while (v--) {
        printf ("  countdown: %2d\r", v);           /* print, CR */
        fflush (stdout);                            /* flush stdout */
        sleep (1);
    }
    printf ("\033[?25h\n");                         /* restore cursor, \n */
}

如果倒计时数字后确实还有其他文本,且每次迭代的长度都不同,则可以使用:

        printf ("  countdown: %2d\033[0k\r", v);    /* print, clear to end, CR */

其中包括清除到行尾的转义\033[0k

上面使用的两个额外的ANSI转义是\033[?25l隐藏光标)和\033[?25h恢复光标)。

fflush(stdout);之所以必须这样做,是因为C语言中的输出默认情况下是行缓冲的。没有fflush(stdout);,所有输出将被缓冲,直到'\n'遇到为止-使所有文本一次出现。

试试看。如果您具有VT兼容终端,它将可以正常工作。但请注意,不鼓励使用ANSI转义的原因是它们不可移植。并非所有终端都支持VT仿真(但很多...)。有关其他转义序列,请参见ANSI Escape序列-VT100 / VT52

如果您要开发一个成熟的终端应用程序,并在屏幕上格式化许多输入和输出,则最好使用提供该功能的库(例如ncursees等)来您服务

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章