成長して、私の最初のコンソールゲームシステムはAtari 2600でした。私は子供の頃にとても楽しんだゲームのいくつかを常に愛しています。グラフィックの多くはまだ記憶に残るものであり、おそらく象徴的です。
これらのスプライトは非常に単純なビットマップで、幅が8ピクセルで、高さが可変であり、バイナリ表現はピクセルの配置です。
たとえば、16進バイト0x18、0x24、0x18は、次のような粗い円を描きます。
0x18: 00011000
0x24: 00100100
0x18: 00011000
8ピクセル幅はかなり小さなグラフィックスを作成するため(Atari 2600規格でも)、高さ、幅、またはその両方を2倍または4倍にして、同じ画像のより大きな(よりブロッキーでゆがんだ)バージョンを作成するのが一般的でした。通常、プレーヤーのスプライトとプレイフィールドの両方で、垂直または水平に反転されます。ゲームの戦闘はこれの良い例です。
課題は、これらのスプライトをASCII形式の「グラフィック」として表示するコードを作成することです。これには、スプライトを垂直、水平、またはその両方に伸縮する機能が含まれます。これは、完全なプログラムまたは呼び出し可能な関数の形式である必要があります。
入力:
- それぞれがその行の水平ビットを表すバイトの配列。
- 各方向のゼロ以外の整数値。水平および垂直は、その次元のスケーリング係数を表します。
- 負の値は、ディメンションが軸に沿って反転されることを示します。
出力:
- STDOUTまたは改行で区切られた文字列へのASCII表現。黒(0)ピクセルにはスペース文字を使用し、白(1)ピクセルには任意の印刷可能な非スペース文字を使用します。
テストデータ:
bmp1 = [ 0x06, 0x0F, 0xF3, 0xFE, 0x0E, 0x04, 0x04, 0x1E, 0x3F, 0x7F, 0xE3, 0xC3, 0xC3, 0xC7, 0xFF, 0x3C, 0x08, 0x8F, 0xE1, 0x3F ]
bmp2 = [ 0x07, 0xFD, 0xA7 ]
bmp3 = [ 0x00, 0x8E, 0x84, 0xFF, 0xFF, 0x04, 0x0E, 0x00 ]
bmp4 = [ 0x00, 0xFC, 0xFC, 0x38, 0x3F, 0x38, 0xFC, 0xFC]
注:上記の入力バイト配列の例は、16進数で提供されています。プラットフォームがバイト表現に16進リテラルを受け入れない場合、それらをネイティブのバイト等価リテラルに変換できます。
出力例:
f( bmp1, 1, 1 ) =>
--------
XX
XXXX
XXXX XX
XXXXXXX
XXX
X
X
XXXX
XXXXXX
XXXXXXX
XXX XX
XX XX
XX XX
XX XXX
XXXXXXXX
XXXX
X
X XXXX
XXX X
XXXXXX
--------
f( bmp1, -2, 1 ) =>
----------------
XXXX
XXXXXXXX
XXXX XXXXXXXX
XXXXXXXXXXXXXX
XXXXXX
XX
XX
XXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXXXX
XXXX XXXXXX
XXXX XXXX
XXXX XXXX
XXXXXX XXXX
XXXXXXXXXXXXXXXX
XXXXXXXX
XX
XXXXXXXX XX
XX XXXXXX
XXXXXXXXXXXX
----------------
f( bmp2, 1, 2 ) =>
--------
XXX
XXX
XXXXXX X
XXXXXX X
X X XXX
X X XXX
--------
f( bmp2, 2, 1 ) =>
----------------
XXXXXX
XXXXXXXXXXXX XX
XX XX XXXXXX
----------------
f( bmp2, -2, -2 ) =>
----------------
XXXXXX XX XX
XXXXXX XX XX
XX XXXXXXXXXXXX
XX XXXXXXXXXXXX
XXXXXX
XXXXXX
----------------
f( bmp3, 1, -1 ) =>
--------
XXX
X
XXXXXXXX
XXXXXXXX
X X
X XXX
--------
f( bmp3, 3, 3 ) =>
------------------------
XXX XXXXXXXXX
XXX XXXXXXXXX
XXX XXXXXXXXX
XXX XXX
XXX XXX
XXX XXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXX
XXX
XXX
XXXXXXXXX
XXXXXXXXX
XXXXXXXXX
------------------------
f( bmp4, -1, -1 ) =>
--------
XXXXXX
XXXXXX
XXX
XXXXXX
XXX
XXXXXX
XXXXXX
--------
f( bmp4, 4, 2 ) =>
--------------------------------
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
--------------------------------
注:上下の水平線は、出力の開始と終了を示しています。出力では必要ありませんが、示されているように、先頭および/または末尾に空の行(すべてゼロ/スペースで表される)が必要です。
注2:これらのテストビットマップは、Wikipediaで「公正使用」とタグ付けされたゲームスクリーンショットに基づいてインスピレーションを受け、再描画/コード化されました。