AI開発
開発環境:
本プログラムコードは, Microsoft Visual C# 2010 Express で開発しました.
思考アルゴリズムの開発には,これと同等以上の環境が必要です.
Microsoft Visual C# 2010 Express
こちらから無料ダウンロード可能です.
実装の流れ:
zipファイルを展開し,PojeClientフォルダの PojeClient.csproj をダブルクリックして開発を始めます.
AI_template.cs などを別名のクラスにコピーし,public getName() メソッドと,public void makeAction(object currentState) メソッドを実装してください.
また,Form_main.cs の冒頭にプレイヤーリストを登録するコードがありますので,ここにご自分が作ったクラスを登録してください.
まずは,すでにあるサンプルを少しいじって挙動を調べるようなことから入ることをお勧めします.
知るべきクラスと,知らなくていいクラス:
本プロジェクトには多くのクラスが含まれますが,思考アルゴリズムを作成するためだけなら,全てのクラスに目を通す必要はありません.
具体的には,必要なクラスは次のようになっています.
クラス名 | 意味 |
---|---|
State | 現在の状態を表すクラス.主に,Boardを2つ持つ |
Board | 自分と相手それぞれの状態を表す. 主に,盤状態,JamInfo, 配珠色を持つ |
JamInfo | それぞれの邪魔珠の状態を表す. 何個が,いつ落ちるか |
Action | 現在の2個の珠をどう落とすかの行動を表す. 主に,軸珠のX座標と回転からなる |
Logger | 情報をテキストボックスに表示する |
Settings | 何個消しか,フィールドサイズなどの設定情報を持つ |
AI_* | AIのサンプル,テンプレート |
必要ないクラスは簡単に説明すると
クラス名 | 意味 |
---|---|
BoardPainter | 盤の描画に関するクラス |
DrawTools | 描画関係のツール |
Form_ChangeSettings | 設定変更用のフォーム |
Form_main | メインフォーム |
GameManager | ゲームの進行を司るクラス(長くて煩雑) |
NextGenerator | 配珠の色を決定するクラス |
Player | 意思決定のインタフェース |
Player_PTP | 通信対戦クライアント |
Player_User | ユーザが操作する場合のクラス |
Program | C# のデフォルトエントリポイント |
SGFManager | 棋譜の格納と読み込みに関するクラス |
Signal | プログラム全体にフォームが閉じたことなどを 知らせるクラス |
VSServer | 通信対戦サーバ |
で,ゲームのそのものの改良などを目指す場合には必要になりますが,思考アルゴリズムを作る際には知る必要はありません.
思考アルゴリズムの作り方(1)入力と出力:
makeActionメソッドには, currentStateが引数として渡されますが,その前に setParamメソッドで timeLimit, answerBox も渡されています.
makeActionメソッドで行うことは,currentState(現在の状態)を参考に,timeLimit秒以内に,Actionを決定して fAnswerBox[0] に格納することです.
このメソッドは戻り値がvoidであり,return action; のような終わり方はできません.returnした時点,または制限時間が過ぎたときに,fAnswerBox[0] に入っている行動が実行されます.従って,重い処理をする場合には,とりあえずまともな行動を fAnserBox[0]に格納してから行うと仮に時間切れになってもそれを実行してもらえますので,安心です.
思考アルゴリズムの作り方(2)プリミティブな方法:
currentState からは,テンプレートにあるように,myBoard, oppBoard を取得できます.そこから,現在の自分のフィールド上の珠の色を myBoard.getStone(x, y) メソッドでintで取得できます.
1-4なら色珠,0なら空所,-1なら邪魔珠があることを表します.また,myBoard.getNextColors() メソッドで,要素6つのint配列を取得できます.これは [0][1] が現在の配珠の色,[2]から[5]が次に来る色を表します.
これらから,「盤上の珠の色・来ている珠の色」が分かりますので,(あと邪魔珠の情報など加えれば)行動を決定することができます.
行動は,軸珠のx座標(1-7),回転(0-3,それぞれ右上左下),ボード,色2つ を指定して作ります.
Action a = new Action(x, r, myBoard, myBoard.getNextColors()[0], myBoard.getNextColors()[1]);
あるいは
Action a = new Action(fAnswerBox[0], x, r);
1から自分のアルゴリズムを作りたい人は,これらのプリミティブな情報を使えます.
思考アルゴリズムの作り方(3)用意された関数を使う方法:
そこそこ強い AI_ChargeAndFire3 を見ても分かりますが,それなりのAIを数十行のプログラムで作ることは難しくありません.AIToolsクラスは,それを容易にするための便利な関数を集めたクラスです.
例えば,ある局面である行動を取った場合にどれだけ攻撃できるか?といったことは常に欲しくなる情報ですが, calcTotalGainメソッドを使えばこれを計算してくれます.
どんな情報は簡単に得られるのか,実際の例は AI_template に書いてありますので,これを参考にしてください.
た,より高度なアルゴリズムを作る際には,もっと多くの機能を持ったツールが欲しくなると思います.ぜひ,「こんなツールがあるとうれしい」といった情報を挙げていただくようお願いします.