如何使用ncurses构建复杂的“图形”?

3

我被告知要使用这样的代码:

    void printCharacter(int row, int col) {
        move(row, col);
        addch(' ');
        addch(' ');
        addch('0');
        addch(' ');
        addch(' ');
        move(row + 1, col);
        addch('<');
        addch('-');
        addch('|');
        addch('-');
        addch('>');
        move(row + 2, col);
        addch(' ');
        addch('/');
        addch(' ');
        addch('\\'); // Escape required for using '\'
        addch(' ');
    }

使用ncurses库编程时,我需要构建“棒人形”图形。但是我觉得这个过程非常重复乏味。是否有更好的方法来完成这个任务?我找到了mvaddch(row, col, ' ')函数,但它仍然显得太啰嗦了。
(是的,这是一项作业任务,但我不是在寻求答案,只是想找到一种优雅解决问题的方式。太多计算机科学课程只教授如何做,而不注重实践技巧。)
1个回答

4

将控制台视为非常低分辨率的光栅显示器 - 这样做可以看出ncurses可以用作一种原始的图形API,使您能够设置每个像素的值(其中一个像素是单个字符),以及基本形状,例如线条和框。

通过反复调用addch(以及move),您可以像在Java或GDI中使用重复调用Graphics对象创建复杂场景一样将图形对象绘制到屏幕上 - 只是速度会非常慢 ;)

唯一让人感觉“错误”的是您给出的示例中艺术品是硬编码(确切地说)进入您的代码中的。这意味着您的代码非常快,但它使编辑成为一场噩梦。

长期解决方案是将您的艺术品移动到文件系统中的单独文件中,并修改程序以将此文件读入缓冲区。要使用ncurses绘制艺术品,您只需遍历缓冲区中的(ASCII)字符并相应地处理,例如(伪代码):

void drawBuffer(int x, int y, char[] artBuffer) {
    move( x, y );
    foreach(char c in artBuffer) {
        if( c == '\n' ) move( x, ++y );
        else addch( c );
    }
}

编辑:或者直接从代码中使用drawBuffer,像这样:
char* stickFigure = "   0\n<-|->\n / \\";
void drawStickFigure(int x, int y) {
    drawBuffer( x, y, stickFigure );
}

哒哒。


分辨率理论上可以通过快速在两个(或更多)图像之间交替来提高。可能还可以编写代码将传统图像或像素艺术转换为ncurses近似表示。 - TLDR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接