こんにちは、ハブラ ここに絶望的なBrainFuck患者の自己診断があります。
タイトルからすべてを理解し、投稿全体を読みたくない場合は、 ゲームとBFDevをダウンロードして、すぐに投稿の最後の「遊び方」セクションに進んでください。 この投稿では、私がBrainFuckでどのように病気になったか、そしてこの素晴らしい言語でゲーム「Sea Battle」を作成するプロセスについて説明しています。
病歴
感染症
BrainFuckは、(言葉ではなく、文化的に翻訳された場合)単に脳を破壊するために作成されました。 つまり、この言語には演算子が8つしかなく、8ビットセルのメモリテープで作業できます。 詳細はウィキペディア ( eng )に書かれています。 私がこの記事を初めて読んだとき、言語は本当に難解で、これをコーディングすることはまったく不可能だと思いました。 正常なものでない限り、プログラムを作成するプログラムを作成するプログラムを作成します...しかし、それは誤った印象でした。 何もすることがなかったので、私はそれを理解することにしました。 同じウィキペディアで学ぶことができるように、多くの派生言語があります:BrainForkと手続き型pBFの両方です。 ウィキペディアの記事を再度読んだ後、BrainFuck開発環境-BFDevへのリンクを見つけました。 幸いなことに、BFDevは手続き型BrainFuckをサポートしています。これにより、倒錯した言語の雰囲気を変えることなくコードを大幅に削減できます。 実際、これはコピーペーストから逃れるための単なる方法です。 すべてが3つの新しい演算子を介して実装されます:(および)プロシージャを記述するため、および:呼び出すため。 手順の名前は、オペレーターが呼び出されたときにセルにある番号です(すべてのオペレーターを習得するのに30秒かかりました。BFDevは非常に便利で、火に燃料を追加しました。
最初の症状
私はすぐにプログラミングを開始しました。私はすぐに、入力された数字、つまり数字を加算する加算プログラムを書きました。 それから私は乗算することを学びました...そしてそれはそれです。 私は他に何も発明することができませんでした。 除算アルゴリズムを思いつくことはできませんでした。 「これ」に何かを書くことができるという感覚はすぐに消え、地面に戻りました。 私は今でもこの言語についての私の意見は真実だと思います。これをコーディングできますが、その真の意味でのBrainFuckは非常に早く始まります。 その後、BFDevは長い間見捨てられ、再び頭を伸ばしたいと思いました。
第二波
再び、私はサッパーについてのhabreとボディーシャツの数独についての投稿の後に覆われました。 私は倒錯についても多くのことを知っていると決め、BrainFackで三目並べを書き始めました。 このために、配列を操作するためのアルゴリズムが発明されました。 議論されるすべてのアルゴリズムは、投稿の最後に説明されています。 配列のデータを使用して擬似グラフィックフィールドを描画するのは非常に簡単であることがわかりました。 2つの座標で配列に要素を書き込むことも問題ではありませんでした。 私が書いたものでは、2人のプレーヤーがプレーすることはすでに可能でしたが、コンピューターは関与しませんでした。 このプログラムは、何も考えずに、画面上に忠実にクロスとゼロを描いただけです。 これはもちろん素晴らしいことですが、面白くありません。 それから私は数独を試しました。 三目並べで実装されたテーブルを操作するシステムは改善されましたが、数独のコンパイルと解決の問題の完全な非識字のために、開発プロジェクトも三目並べと同じ段階で停止しました。
終わりの始まり
そして最後に、この投稿専用のプログラムであるSea Battleに移りました。 すぐにこの名前でわかる予約をしてください。 これは古典的な海戦ではありませんが、5x5のフィールドと4枚のシングルデッキ船での変更であり、その場所は制限を受けません。 そのため、この瞬間までに、ユーザーと対話し、テーブルを操作する方法を既に知っていました。 実際、問題は小さいままです。あらゆる種類のゲーム状況を実現し、コンピューターのプレイ方法を教えます。 問題はすぐに現れました。 bfの場合、最も単純なものさえないので、私はそれを発明しなければなりませんでした。 この問題が解決したとき、私は知性の問題に目を向けました。
コンピューター感染
次に、独自の乱数ジェネレーターが必要でした。 Googleのおかげで、擬似乱数変数を生成するための最も単純な線形合同法が見つかりました。 実装中に、2つの問題が発生しました。メソッドでは、残りの部分での除算が必要であり、座標を取得するには残りの部分での除算が必要です。 正直なところ、私は両方の問題に取り組み、私はごまかしました。 判明したように、ランダムジェネレーターでは、除算する必要はまったくなく、モジュロnを追加して座標を計算できれば十分であり、すべての数値を既知の定数で除算する必要はありませんでした。 乱数ジェネレーターには、シードが必要です。シードは、人間が配置した船の座標の合計から単純に計算されます。 アルゴリズムではすべてが良いようです。フィールド上での均一な分布、次の動きを計算するためのアルゴリズム、これは人間には明らかではありません。最も重要なことは、私はこれを実装できたということです!
このアルゴリズムの何がそんなに悪いのですか?
しかし、悪いことは、静的なシーケンスを生成することであり、カウントダウンが始まるこのシーケンス内の数のみがsidに依存します。 このため、コンピューターは25ゲームしかプレイできません。すべてを覚えていれば、船の位置を計算するのは難しくありません。 この問題のそれほど重要ではないことを何が言っているのか、まだ覚えていませんが。 あなたは確かに乱数を生成するために他のアルゴリズムを使用することができますが、残念ながら、今のところ熱意の告発は終わりました。
明らかにされた剖検(アルゴリズムの説明)
最も単純なアルゴリズム
[-]-現在のセルをゼロにします。
[>]-0が見つかるまで右に移動します。si文字列のスタイルで配列を保存すると便利です。
[> + <-]-右側のセルへの要素の転送
[++++++++++>、––––––––––––]-ユーザーに文字列を要求します。 BFDevの例でスパイされた唯一のアルゴリズム。
不治の
セル値と指定された数値を比較する
Brainfuckではゼロとしか比較できないため、最初に比較対象から減算します。 したがって、[]演算子を使用して、elseの場合に提供されるアクションを実行し、以前に設定されたフラグをリセットできます。 それに対応して、[]で、等しい場合のフラグに対するアクションを記述します。 微妙な点は、角かっこで囲まれたコードは、開始位置と同じセルで終了する必要があることです。 その後、値を復元することを忘れないでください。 1と比較したいとし、比較する要素を持つセルに立っているとします。
[> +> + <<-] >> [<< + >>-]バックアップ
+フラグ設定
> [コードの不一致>-<[-]]
> [一致コード[-]]
プラスモジュロ25
アイデアは通常のプラスであり、25が判明したかどうかを確認するだけで、そうである場合はリセットします。 古い値を保存するのは面白くないので、バックアップはありません。
([-]> + -------------------------> [-]-<[> + <[<-> +]]
> [<< ------------------------- >> [-]] << ++++++++++++++ +++++++++++++ [> + <-])
2次元配列を使用する
次元が6x22の2次元配列があるとします。 このような配列はプログラムで使用されます。 このような配列の次元は、表示されるフィールドとテーブルの画像のシンボルの両方が1つの配列に格納されるという事実に関連しています。
最初に、2つの座標から配列の数値を取得する必要があります。 これを行うには、22を掛けた行番号を列番号に追加します。 どういうわけかこの要素に到達する必要があります。 数えられた数のセルに立っていて、書き込みたい、または左に値を書きたい文字があり、別の空のセルがあるとします。 この全体が、配列の最初の要素の直前にあります。 最初の要素を空のセルにコピーします。 2つのセルを数値と値で1つ右にシフトし、数値を減らします。 数がゼロになるまで繰り返します。 実際、配列の最初のn-1要素を左に2セルシフトして、n番目に到達します。 次に、最初の要素をコピーして所定の位置に移動します。 停止するには、配列の前にゼロが必要です。
余りのある除算
任意の数ではなく、所定の定数を超えない一部を定数で除算するアルゴリズム。 この場合、被除数は25に制限され、除数は5です。すべてが単純です。ゼロにリセットされるまで数値を減らし、5回の繰り返しごとに結果を増やします。 残りは反復ごとに増加し、5回ごとにゼロになります。
[-> + <[-> + <[-> + <[-> + <[->> + <[-] <
[-> + <[-> + <[-> + <[-> + <[->> + <[-] <
[-> + <[-> + <[-> + <[-> + <[->> + <[-] <
[-> + <[-> + <[-> + <[-> + <[->> + <[-] <
[-> + <[-> + <[-> + <[-> + <[->> + <[-] <
]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
線形合同擬似ランダム変数生成方法
0〜25の数値を生成する必要があります。アルゴリズムは、次の繰り返し関係に基づいています。
式によれば、aを乗算してcを加算する必要がありますが、すべてがモジュロ25である必要があります。単純な式に従ってカウントすると、a = 6になります。 cは任意であり、一般的に言えば、Sidからカウントする方が良いでしょうが、このプログラムではc = 2のみです。 25を法とするプラスアルゴリズムを使用して、コードを取得します。
[> [-] :::::: <-]> [-] ::、ここで:25を法とするプラス手続きの呼び出し。これは単純な乱数ジェネレータです。
遊び方
プログラムを実行するには、 BFDev環境が必要です。 それを介して、ゲームファイルを開きます。 次に、ツールバーの手続き型BrainFuckを選択する必要があります(一番右のボタン、番号16のボタンの近く)。 すべての準備が整ったら、F9を押してゲームを開始し、楽しんでください。 ゲームは、下にある[出力]ウィンドウで開始されます。 まず、4隻の船を手配する必要があります。 ゲームの内容を注意深く読んでください。 座標は、行と列の順序で2桁として入力されます(スペースまたは区切り文字なし)。 5桁を超える、または2桁を超える座標を入力しないでください。 船を1つのセルに入れないでください! チェックはないため、プログラムは必要な処理をすべて開始します。 入力が正しくない場合、ループが発生する場合があります。 緊急に完了するには、Ctrl + F2を押します。 船を配置した後、ゲームは座席を要求します。 0〜9の任意の数字がシードになる可能性があります。プレーヤーの船の配置が同じ場合、異なるコンピューターの動作が発生する可能性があります。 あなたが最初に行きます。 ヒットした場合、動きは歩いた人に残ります。 誰かがすべての敵船を破壊するとすぐにゲームは終了します。 ここにグリッチが1つあります。 ゲームはスリップでのみ終了できます。 あなたが勝った場合、ゲームはすぐに終了しません。 完了するには、任意のセルで撮影するか、Ctrl + F2を押す必要があります。
以上です! 素敵なゲームを!
PS 元の Bfdev サイトは持続可能なホスティングによって区別されないため、リンクはDropbox上にあります。