はじめに
エンジニアの皆さんなら一度はBrainfuckでゲームを作りたいと思ったことがあると思います。
という訳で本記事ではBrainfuckを用いてゲームを作ることを考えてみます。
Brainfuckとは
Brainfuck(ブレインファック)は難解プログラミング言語のひとつ[要出典]。なお名称に卑語が含まれるため、Brainf*ckなどと表記されることがある。
開発者Urban Müllerがコンパイラがなるべく小さくなる言語として考案した。 実際、Müllerが開発したコンパイラのサイズはわずか123バイト、インタプリタは98バイトであった。
Brainfuckプログラムは非常に可読性・記述性が低いため実用性は期待できないが、チューリング完全である。その簡潔さから多くの派生言語を生み出すこととなった。
引用
https://ja.wikipedia.org/wiki/Brainfuck
上記の通り実用性は低いですが、チューリング完全な言語なのでやろうと思えばゲームなども作ることができる訳です。
Brainfuckはデータ配列に対してポインタを操作するプログラムを書きます。
8つの命令は以下の通りです。
命令 | 動作 |
---|---|
> | ポインタのインクリメント |
< | ポインタのデクリメント |
+ | ポインタが指す値のインクリメント |
- | ポインタが指す値のデクリメント |
. | ポインタが指す値の出力 |
, | 入力をポインタが指す先に挿入 |
[ | ポインタが指す値が0なら] にジャンプ |
] | ポインタが指す値が0でないなら[ にジャンプ |
例えば、Hello, World!
を出力する最も短いプログラムは以下のようになります。
+[-->-[>>+>-----<<]<--<---]>-.>>>+.>>..+++[.>]<<<<.+++.------.<<-.>>>>+.
参考
https://esolangs.org/wiki/Brainfuck#Hello.2C_World.21
https://codegolf.stackexchange.com/questions/55422/hello-world/163590#163590
Brainfuckでゲームを作るとしたら
前項の説明の通り、Brainfuckには入出力はあるもののゲームを作るのに向いているとは言い難いです。
それでもゲームを作りたい。
ローグのようなテキストアドベンチャーのゲームもありますが、Brainfuckでも描画系がほしい、そんなあなたにお勧めのゲームエンジンがあります。
その名も__「Brainfuck Game Engine」__
https://github.com/MatheusAvellar/brainfuck-game-engine
画像
https://github.com/MatheusAvellar/brainfuck-game-engine
Electronで実装されていてるゲームエンジンで、BrainfuckインタプリタはJavaScriptで書かれています。 プログラムは初期化時に呼ばれるload.bc
と、毎フレーム呼ばれるupdate.bc
の2つ作ることができます。
セルは25x25個存在し、各セルに値を入れることで、値に対応した色を描画することができます。セルは左上から下方向に伸びていて、25個区切りで横方向に配置されています。描画に使われるのは上の部分の25x18=475個のセルです。
.
命令はポインタの指す先の値の出力ではなく、全セルを描画する命令となります。
色と値の対応
0 = No change (shows the background color)
1 = Black (#333)
2 = Gray (#ccc)
3 = White (#fff)
4 = Red (#c33)
5 = Green (#3c3)
6 = Blue (#33c)
また、描画は毎フレーム行われ、その際にキー、マウス入力を扱うことができます。
,
命令はポインタの指す先の値に応じて、キー、マウス入力があった際にその値を更新します。
0 = Left arrow => (0 = unpressed, 1 = pressed)
1 = Up arrow => (0 = unpressed, 1 = pressed)
2 = Right arrow => (0 = unpressed, 1 = pressed)
3 = Down arrow => (0 = unpressed, 1 = pressed)
4 = 'A' key => (0 = unpressed, 1 = pressed)
5 = 'S' key => (0 = unpressed, 1 = pressed)
6 = X coordinate of mouse => (0 to 24)
7 = Y coordinate of mouse => (0 to 18)
8 = Mouse click => (0 = unpressed, 1 = pressed)
例えば、Aキーが押されたときだけ、最初のマスを赤く塗るプログラムは以下のようになります。
[-] セルを0にする
> 入力を受け取るため一時的なセルに移動
++++, 4回インクリメントし、Aキーの入力を受け付ける
[ 押された場合は1が挿入されて、0ではないので [ 内に進む
< ++++ 上のセルに戻り、4を挿入
> - 入力用のセルに行き、デクリメント(このとき0になる)
]
. キャンバスを更新
加えて、このゲームエンジンでは、連続した同じ記号の省略記法として{
,}
の2つの記号が追加されいます。使い方は以下の通りです。
100回ポインタのインクリメント
{>100}
8回値のインクリメント
{+8}
GitHubには1000行近いコードでマルバツゲームが実装されています。丁寧にコメントも書かれていますが、やはり難解です。
// Checking hover on middle square
{>309} // Middle square
{>400} // Get far away from anything else
[-]+
>[-]{+12} // Set desired mouse X (12)
>[-]{+6}, // Get mouse X (id 6)
[ <- >- ] // 'Compare' both values
< [ // Mouse X is not right
<[-]>[-] // Clean up
]
< [ // Mouse X is right
>[-]<[-] // Clean up
+
>[-]{+9} // Set desired mouse Y (9)
>[-]{+7}, // Get mouse Y (id 7)
[ <- >- ] // 'Compare' both values
ソースコードの一部分
おわりに
Brainfuckは難解な言語でネタにされがちですが、最低限の機能を持ったプログラミング言語で、実際にコードを書いてみるとメモリ(セル)の管理などで論理的な思考力が問われます。四則演算や比較演算ですら簡単に書けないと思います。プログラマなら一度Brainfuckのコードを書いてみてはいかかでしょうか。
あと、Brainfuckは8個の命令しかない低レベルな言語なのでプログラミング初心者におススメです。