1 ポイント 投稿者 arcoding 3 시간 전 | まだコメントはありません。 | WhatsAppで共有

UmmLangで三目並べAIを実装してみました。
UmmLangは、変数、入出力、条件文、行ジャンプ程度しか提供しない難解プログラミング言語で、

[ Eoeoeom-eoeoeo,,,,,,,, sigeoeoeo-k dongtan-eo? Jun. ] のような見た目をしています。

ループや関数のような一般的な制御構造はほとんどありません。整数ですらピリオド(.)、カンマ(,)、空白だけで表現しなければならないため、一般的なアルゴリズムを実装するにはかなり不便な環境です。

まず 2×1 の三目並べを実装し、盤面表現とAI実装方式を検証しました。
各マスを1つの変数に対応させ、空きマス、X、Oをそれぞれ 0、1、2 で表したうえで、可能なすべての状態をドンタン(IF)文で列挙し、AIが置く位置を決めるように構成しました。
この過程で、盤面出力インターフェースとユーザー入力処理の構造もあわせて作りました。

その後、これを 3×3 の三目並べへ拡張しました。
問題は、合法的なゲーム状態が約 4,520 個に達し、すべてのケースを直接書くのが現実的に不可能だったことです。
そこで Python で別途コード生成器を作成しました。
生成器は、すべてのゲーム状態から O の数が X より多いもの、またはすでに勝負が終了している状態を除外したうえで、各状態における三目並べAI(ミニマックスベース)の最適手を計算します。
計算結果を UmmLang のドンタン条件文の形に自動変換し、case.umm ファイルを生成するようにしました。

最終的には、生成された数千個のドンタン分岐をメインソースに挿入して AI ロジックを完成させました。
プレイヤーが入力した座標を盤面変数に反映すると、生成された条件文が現在のゲーム状態と一致するケースを見つけ、AI の着手を実行します。
その後、盤面を再表示し、Jun 構文でユーザー入力部分へジャンプしてゲームループを構成しました。
つまり、ランタイムでは探索や計算を行わず、事前生成した条件文だけを実行するため、最適化されてはいないものの三目並べAIを実装できました。

GitHub には、Ryugat サイトで直接プレイする方法も残してあります。

まだコメントはありません。

まだコメントはありません。