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 として使用して、ピクセル単位の値 (ピクセルは 1 文字) を設定できることがわかります。線やボックスなどの基本的な形状だけでなく、

Java や GDI でオブジェクトを繰り返し呼び出して複雑なシーンを作成するのと同じように、addch( と共に) 繰り返し呼び出してグラフィカル オブジェクトを画面に描画します。非常にゆっくりと実行するだけです ;)moveGraphics

あなたが与えた例について「間違っている」と感じる唯一のことは、アートワークがコードに(文字通り)ハードコードされていることです。これは、コードが超高速であることを意味しますが、編集するのは悪夢になります。

長期的な解決策は、アートワークをファイルシステム内の別のファイルに移動し、このファイルをバッファーに読み込むようにプログラムを変更することです。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 に答える