Мне сказали использовать такой код:
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 учат только тому, как, они не учат ремеслу.)
Думайте о консоли как о растровом дисплее с очень низким разрешением — когда вы сделаете это, вы увидите, как 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 );
}
Та-да.
Других решений пока нет …