Как построить сложную «графику» с помощью 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) вы рисуете графический объект на экране так же, как вы можете создавать сложные сцены с повторяющимися вызовами Graphics объект в Java или 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 );
}

Та-да.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]