
これは、JSのプログラミングエクスペリエンスを補充するために書かれた小さなゲーム「三目並べ」に関する投稿です。 ここではCanvasとDojoBaseが使用されます。 このライブラリは、イベントを処理し、IDで要素を見つけるために使用されます(これは非常に便利です)。 キャンバスは、競技場を描くために使用されます。
ゲーム自体
この実装からの「三目並べ」のルールは簡単です。敵の前に一連の5つの要素(任意の方向)を収集する必要があります。 動きの数は同じです。つまり、ゼロ(最初に行く)が行を収集し、十字に4つの要素の線がある場合、ラウンドは終了しません。 はい、この実装では、1つのゲームは複数のラウンドで構成されます。 フィールドに空きセルがなくなると、ゲームは終了します。 勝者は、より多くのラウンドを勝ち取ったものです。 過去のラウンドで使用されたセルは注がれ、非アクティブになります。 フィールド自体の解像度は、ブラウザウィンドウの解像度に応じて設定されます。
AIの作成(以降、AIでは、検索アルゴリズムのセットが解析されます)
ここで最も興味深いのは、もちろんAIです。 私は彼にいくつかの段階で多かれ少なかれ正確に歩くように「教え」ました...最初に、AIは私が見つけた最初のフリーセルに彼のバッジを置きました。 少しテストしてみると、これはおもしろくないことが明らかになりました。 それは動作しますが、ここで何かが間違っています。 これよりも良いケースだと考えた後、私はrandを台無しにしました。 その後、それはもう少し楽しくなりましたが、まだ-面白くありません。
だから、大丈夫、最初に彼にあなたが行くことができる(そして行くべき)すべての細胞を見つけさせてください。 つまり、そのようなもの(青で強調表示)。

これらの「必要な」セルは、このようなアルゴリズムによって決定されます
ここでは、競技場に関するすべての情報(そこで行われていること)が2次元のグローバル配列に含まれており、その要素の値はセルの状態を示しています。 方向の完全なセットが使用されます。つまり、この方向を持つすべての隣接セルがチェックされます。 array_2は、「必要な」セルの検索結果を記録します。

だから、彼らと決心し、次に何をすべきか? これらのセルのいずれかにランダムな要素を配置できます。 また、各セルに評価を割り当て、それらに基づいて最適なオプションを選択して使用することができます。 いいですね。 しかし、最初に別の質問を解決する必要があります。
ゼロのAIの過程で、「必要な」セルがないという状況が発生する場合があります。 たとえば、ラウンドの最初のターン。 次に、この状況(またはクロスまたはゼロに空きセルがない場合)で最適なオプションを見つけるためのアルゴリズムを考え出す必要があります。 そして、最も広い場所に行くのは良いことだと思います。
したがって、このようなアルゴリズムはここで実装されます
中間データ、つまり特定の形式のフリーセル(垂直および水平)の行は、m_sectionsに記録されます。 この関数の結果は、o_coordinateオブジェクトに書き込まれます。 セグメントが「空の」正方形の直径である場合、これは、その中心点(セル)がフリーセルの正方形の中心であり、その辺がこのセグメントに等しいことを意味します。

そして、評価に基づいて動きを選択するアルゴリズムの時が来ました。
ここにいる
「必要な」ポイントを持つ配列は、このアルゴリズムの入力に送られます。 配列m_assessments、補助、および血管は記録された細胞推定値です。 ここでは、前の例のように、セルの周りのすべての方向の完全な列挙が使用されます。 評価は、移動のタイプ(1行のブロックまたは追加)と要素の行の長さ(1、2、3、または4セル)の2つのパラメーターに従って実行されます。 割り当ては、基準を変更できる特別な機能を使用して行われます。 これらの推定(基準)は、特定のセルのすべての方向に要約されます。
「必要な」ポイントを持つ配列は、このアルゴリズムの入力に送られます。 配列m_assessments、補助、および血管は記録された細胞推定値です。 ここでは、前の例のように、セルの周りのすべての方向の完全な列挙が使用されます。 評価は、移動のタイプ(1行のブロックまたは追加)と要素の行の長さ(1、2、3、または4セル)の2つのパラメーターに従って実行されます。 割り当ては、基準を変更できる特別な機能を使用して行われます。 これらの推定(基準)は、特定のセルのすべての方向に要約されます。

おわりに
結局、私はAIを使った小さなゲームを手に入れました。 もちろん、「ドライ」ではなく、簡単に勝ちます。 「クロス」でプレイする場合、難易度は低くなりますが、「トークン」ではプレイするのが少し難しくなります。
マルチラウンドモードは、タスクをより面白くしました。 たとえば、ここでAIは最初の動きに最適なセルを見つける必要があります。 単一の空のセル(歩くことには意味がありません)には、どういうわけか「シェーディング」する必要があるという事実に関する問題がまだありました。 しかし、最終的に私はそれをやった。