C语言中usleep(milliseconds)无法实现游戏迷宫逐字符延迟打印
问题原因与解决方法
核心问题1:未初始化的延迟变量
labirinto函数里的milliseconds变量没有初始化,属于未定义行为,它的初始值是随机的,可能导致延迟时间异常(比如变成0,相当于没有延迟),这会让你误以为是调用方式的问题。
核心问题2:标准输出缓冲区未手动刷新
C语言中printf默认是行缓冲模式——只有输出换行符\n或者缓冲区被填满时,才会把缓冲区里的内容输出到终端。你逐字符打印空格和#的时候,单个字符不会触发自动刷新,所以所有内容会先存在缓冲区里,等所有延迟执行完后一次性输出。而直接在main调用时可能因为某些巧合(比如缓冲区刚好被填满)触发了刷新,才让你觉得正常。
修复步骤
- 初始化
milliseconds变量,设置你需要的微秒数(注意usleep的参数是微秒,1毫秒=1000微秒,比如设置10毫秒就是10000)。 - 每次调用
printf后,手动调用fflush(stdout);强制刷新输出缓冲区,让字符立刻显示。 - 可选优化:
startgame里的scanf("%c", &entrada)可能会留下缓冲区残留字符,换成getchar()更直接,或者在scanf后清空缓冲区,避免后续输出异常。 - 补充:所有声明为
int类型的函数都需要返回值,原代码缺失返回语句也属于未定义行为。
修改后的完整代码
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #define SIZEl 30 #define SIZEh 10 struct sNOCOBRA{ char cabeca[1][1], i, j; struct sNO *prox; }; int labirinto(); int startgame(); int limites(); int gameover(); int main() { startgame(); // limites(); // gameover(); } int labirinto() { // 初始化延迟时间为10毫秒(10000微秒),可按需调整 int milliseconds = 10000; for (int i = 0; i < SIZEl + 2; i++) { printf("#"); fflush(stdout); // 手动刷新缓冲区 usleep(milliseconds); } printf("\n"); fflush(stdout); for (int i = 0; i < SIZEh; i++) { printf("#"); fflush(stdout); usleep(milliseconds); for (int j = 0; j < SIZEl; j++) { printf(" "); fflush(stdout); usleep(milliseconds); if (j == SIZEl - 1) { printf("#\n"); fflush(stdout); usleep(milliseconds); } } } for (int i = 0; i < SIZEl + 2; i++) { printf("#"); fflush(stdout); usleep(milliseconds); } printf("\n"); fflush(stdout); return 0; } int startgame() { char entrada; printf("You've got to eat your way out!\n(sútil referência a DOOM shh...)\n\n S T A R N O W ?"); fflush(stdout); // 确保提示语先显示 entrada = getchar(); // 用getchar更直接读取Enter键 if (entrada == '\n') { labirinto(); } // 清空缓冲区里的残留字符(如果用户输入了其他内容再按Enter) while ((entrada = getchar()) != '\n' && entrada != EOF); return 0; } int limites() { for (int i = 0; i < SIZEl - 2; i++) { for (int j = 0; j < SIZEh - 2; j++) { printf("o"); } } return 0; } int gameover() { printf("G A M E O V E R !⠀\n"); return 0; }
内容的提问来源于stack exchange,提问作者Khaos
相关产品推荐
相关产品推荐

