C - 更快地显示终端信息的方法

时间:2015-11-02 17:10:57

标签: c terminal console printf

所以我试图在我的终端上显示游戏板并让玩家输入他们的下一步(在我的情况下是4行)。每次玩家输入时,我都会再次画板。

Player 'O' won! Well, player 'X' did play badly.

不幸的是,当单独插入每个角色的墙壁和游戏棋子时,您基本上可以看到我的慢速计算机如何逐个显示每个角色。

为了简化这里的事情,我假装我只想显示一大堆字符。我已经有大部分逻辑和输入正常工作,所以我是只是寻找优化。

所以这是我的第一种方法。只需完成循环并逐一打印即可。

// Rows
for(int x = 0; x < 10; x++) {
    // Columns
    for(int y = 0; y < 10; y++) {

        // Note: to keep evererything neatly in-line, I'll just use if-statements
        if((y % 3) == 0) printf(" ");
        if((y % 3) == 1) printf("X");
        if((y % 3) == 2) printf("O");

    }
    printf("\n");  // Add line-break at the end
}

所以我的猜测是,每次我调用printf时,计算机都会相应地分析和编辑字符串,然后再将其打印到屏幕上。这可能是它如此缓慢的原因。 (如果我错了,请纠正我。)

作为第二种方法,我尝试在打印之前将所有字母保存在char数组中。

char text[500]; // Note: In my program I don't know how long the text is.
int index = 0;

// Rows
for(int x = 0; x < 10; x++) {
    // Columns
    for(int y = 0; y < 10; y++) {

        if((y % 3) == 0) text[index] = ' '; // Set text index accordingly
        if((y % 3) == 1) text[index] = 'X';
        if((y % 3) == 2) text[index] = 'O';
        index++; // Increase index

    }
    text[index] = '\n';  // Add line-break
    index++;
}
text[index] = '\0'; // End of string
printf(text);

虽然起初有点压倒一切,但这段代码对我来说非常合适,并且实际上能够更快地打印字符串很多,很多

问题在于(1)您很快就会失去对索引的追踪(因此调试真的很痛苦)而(2)你必须活着担心你的文字将超过500个字符(或者你只需​​要100个字符,浪费了大量的自由空间)。

我现在的问题是:是否有任何快速且更一致的方式在终端屏幕上显示信息?除了每轮显示游戏板外,我还可以删除最后几个字符吗?直到我找到需要编辑的作品?我可以冻结屏幕,直到内容准备好了吗?

对于那些感兴趣的人,这里(差不多)我的完整C代码:http://pastebin.com/Emffgsdd

1 个答案:

答案 0 :(得分:1)

是的,每次都不是重绘所有内容,而是只能绘制更改(比如游戏中的新游戏元素)。挑战在于跟踪屏幕状态。

一个众所周知的终端库负责处理大部分问题,NCURSES。 Eric Raymond有一个很好的online book