You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中usleep(milliseconds)无法实现游戏迷宫逐字符延迟打印

问题原因与解决方法

核心问题1:未初始化的延迟变量

labirinto函数里的milliseconds变量没有初始化,属于未定义行为,它的初始值是随机的,可能导致延迟时间异常(比如变成0,相当于没有延迟),这会让你误以为是调用方式的问题。

核心问题2:标准输出缓冲区未手动刷新

C语言中printf默认是行缓冲模式——只有输出换行符\n或者缓冲区被填满时,才会把缓冲区里的内容输出到终端。你逐字符打印空格和#的时候,单个字符不会触发自动刷新,所以所有内容会先存在缓冲区里,等所有延迟执行完后一次性输出。而直接在main调用时可能因为某些巧合(比如缓冲区刚好被填满)触发了刷新,才让你觉得正常。

修复步骤

  1. 初始化milliseconds变量,设置你需要的微秒数(注意usleep的参数是微秒,1毫秒=1000微秒,比如设置10毫秒就是10000)。
  2. 每次调用printf后,手动调用fflush(stdout);强制刷新输出缓冲区,让字符立刻显示。
  3. 可选优化:startgame里的scanf("%c", &entrada)可能会留下缓冲区残留字符,换成getchar()更直接,或者在scanf后清空缓冲区,避免后续输出异常。
  4. 补充:所有声明为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:25:57