2012-09-23 21 views
2

我被告知要使用这样的代码:如何使用ncurses构建复杂的“图形”?

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类只讲授如何,他们不教技艺。)

回答

3

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

通过调用addch重复(连同move)画一个图形对象到屏幕上,你可以与重复调用Java或GDI一个Graphics对象复杂的场景以同样的方式 - 只是做起来很慢;)

对于你给出的例子,唯一感觉“错误”的是这些图形是硬编码(完全字面地)到你的代码中。这意味着你的代码超快,但它使它成为编辑的噩梦。

一个长期的解决方案是将您的图稿移动到文件系统中的单独文件,并修改程序以将此文件读入缓冲区。要使用您刚刚通过(ASCII)迭代ncurses的字符缓冲区绘制艺术和采取相应的行动,例如(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); 
} 

Ta-da。