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, ' ')了,但这似乎仍然过于冗长。

(是的,这是一个家庭作业,但我不是在要求答案,只是一种很好地解决问题的方法。太多的 CS 课程只教如何,他们不教手艺。)

4

1 回答 1

4

把控制台想象成一个分辨率很低的光栅显示器——当你这样做时,你可以看到 ncurses 如何被用作一种原始图形 API,允许你设置每像素值(其中一个像素是单个字符),以及基本形状,例如线条和盒子。

通过重复调用addch(连同move),您可以将图形对象绘制到屏幕上,就像您可以通过重复调用GraphicsJava 或 GDI 中的对象来制作复杂场景一样——只是做起来很慢;)

关于您给出的示例,唯一感觉“错误”的是艺术品被硬编码(相当字面意思)到您的代码中。这意味着您的代码非常快,但编辑起来却是一场噩梦。

一个长期的解决方案是将您的作品移动到文件系统中的单独文件中,并修改您的程序以将该文件读入缓冲区。要使用 ncurses 绘制艺术作品,您只需遍历缓冲区中的 (ascii) 字符并采取相应措施,例如 (pusedocode):

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 );
}

达达。

于 2012-09-23T04:28:38.703 回答