【问题标题】:How to print nested loops quicker in c?如何在c中更快地打印嵌套循环?
【发布时间】:2019-12-17 16:30:48
【问题描述】:

我正在尝试用双数组和宏在 c 语言中创建一个类似迷宫的游戏。 但是打印整个迷宫的时间太长了。 有没有更快的方法。

#define SIZER 25 //row
#define SIZEC 50 //column

#define WALL "\xDB"
#define MAN "O"
#define ENEMY "\x40"
#define EMPTY " "

void print_game()
{
    int i,j;
    for(i=0;i<SIZER;++i){
        for(j=0;j<SIZEC;++j){
            if(game[i][j]==w)
                printf(WALL);
            else if(game[i][j]==m)
                printf(MAN);
            else if(game[i][j]==x)
                printf(ENEMY);
            else if(game[i][j]==e)
                printf(EMPTY);
            if(j==SIZEC-1)
                printf("\n");
        }
    }
}

【问题讨论】:

  • 你能用ncurses吗?
  • 我宁愿不这样做。但如果它们那么有效,我可能会尝试。
  • 不是多次调用printf,而是每次打印一个字符,而是缓冲整个屏幕并通过一次调用一次打印所有内容。
  • @RobertStiffler 你能再描述一下吗。或者给我一个关于它的研究课题。因为我对 c 编程非常陌生,对缓冲区操作了解不多。
  • 使用当前的实现,您调用printf 20x50=1000 次来打印板。为整个游戏板构建一个字符串并只调用一次printf 会更有效。缓冲区可以像char buffer[1300] 一样简单。您需要 1300 个字符 (26x50),因为您需要在每行末尾添加换行符。

标签: c arrays loops optimization nested


【解决方案1】:

此版本在调用printf 之前创建一个完整的行。这可以扩展为将整个迷宫组合成一个字符串,如 Robert Stiffler 的评论中所述。

#define SIZER 25 //row
#define SIZEC 50 //column

#define WALL '\xDB'
#define MAN 'O'
#define ENEMY '\x40'
#define EMPTY ' '

void print_game()
{
    int i,j;
    char line[SIZEC + 1];
    for(i=0;i<SIZER;++i){
        for(j=0;j<SIZEC;++j){
            if(game[i][j]==w)
                line[j] = WALL;
            else if(game[i][j]==m)
                line[j] = MAN;
            else if(game[i][j]==x)
                line[j] = ENEMY;
            else if(game[i][j]==e)
                line[j] = EMPTY;
        }
        line[SIZEC] = '\0';
        printf("%s\n", line);
    }
}

【讨论】:

    【解决方案2】:

    printf 是一个非常慢的函数,因为它需要能够解析具有多个 % 格式化程序和其中的宽度说明符的复杂字符串。

    如果您真的不需要 printf 的丰富功能,请切换到 puts (put-string) 或 putchar (put-character)应该更快。


    我也喜欢@RobertStifiller 的评论,建议您将所有输出附加到内存数组中,然后在最后只调用一次输出函数以一次打印所有数据。

    【讨论】:

    • 感谢您的想法。这确实帮助我理解了缓冲区。
    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多