AIの積み込みロジックを呼び出す際に必要なインタフェイスについて,考察する.

設計(実装済みの内容)

TumiDeciderWithPruningインタフェイス

AIロジックが実装(implements)すべきインタフェイスであり, メンバとして以下の関数を宣言している.

int getMaxPass()
実装している実行パスの最大番号を返す
void initEvaluator()
積み1手の決定前に呼び出される初期化関数
boolean prepareEvaluate()
積み候補の手に対して評価対象から外すこと(枝刈り)の可否を返す関数.実行パスの最大番号まで繰り返し呼び出される
long evaluateTumi()
積み候補の手に対する評価得点を算出して返す関数

これらの関数の呼び出し時には,以下の情報が渡される.

  • 相手のフィールド情報 (13×6のbyte配列)
  • 自分のフィールド情報 (13×6のbyte配列)
  • NEXT1〜NEXT3のツモ色 (byte配列)
  • 相手が連鎖中かどうかのフラグ (boolean)

TumiDeciderWithPruning2インタフェイス

TumiDeciderWithPruningに,呼び出し引数として,相手と自分のオジャマ降下予告の情報を追加した. これにより,AIロジック内で以下の処理を行うことが可能になった.
  • 相手の連鎖が相殺範囲内に収まる(自分に降ってこない)ことを判断して対応する
  • オジャマを食らった後の発火(カウンター発火)を評価する

TumiDeciderWithPruning2は,連鎖読み4-5以降の新しいAIで使用している.


実装(Javaソース)

TumiDeciderWithPruning

 public interface TumiDeciderWithPruning extends TumiDecider {
 
     /**
      * 評価処理の初期化.1手ごとに評価前に呼び出される
      * 
      * @param beforeField 自分のフィールド(NEXT積み適用前)
      * @param enemyFields 敵のフィールド
      * @param isAnyEnemyDoingRensa いずれかの敵が連鎖を発動中
      */
     public void initEvaluator(TumiField beforeField, TumiField[] enemyFields, boolean isAnyEnemyDoingRensa);
 
     /**
      * 評価得点を算出する準備,枝刈りを行う
      * 
      * @param pass 実行パスの番号(0〜maxPass)
      * @param tumiIndex 着目している積み手を識別する番号 (0〜21)
      * @param beforeField 自分のフィールド(NEXT積み適用前)
      * @param afterField 自分のフィールド(NEXT積み適用後)
      * @param fallenTumi NEXT積み(重力落下後)
      * @param nextTumos ツモ色.NEXT:[0][0]〜[0][1],NEXT2:[1][0]〜[1][1]
      * @param enemyFields 敵のフィールド
      * @param isAnyEnemyDoingRensa いずれかの敵が連鎖を発動中
      * @return 有効な積みとして残すならtrue,刈るならfalse
      */
     public boolean prepareEvaluate(int pass, int tumiIndex, TumiField beforeField, TumiField afterField, Tumi fallenTumi, byte[][] nextTumos, TumiField[] enemyFields, boolean isAnyEnemyDoingRensa);
         
     /**
      * 積み手に対する評価得点を算出する
      * @param tumiIndex 着目している積み手を識別する番号 (0〜21)
      * @param beforeField 自分のフィールド(NEXT積み適用前)
      * @param afterField 自分のフィールド(NEXT積み適用後)
      * @param fallenTumi NEXT積み(重力落下後)
      * @param nextTumos ツモ色.NEXT:[0][0]〜[0][1],NEXT2:[1][0]〜[1][1]
      * @param enemyFields 敵のフィールド
      * @param isAnyEnemyDoingRensa いずれかの敵が連鎖を発動中
      * @return 着目している積み手の評価得点 
      */
     public long evaluateTumi(int tumiIndex, TumiField beforeField, TumiField afterField, Tumi fallenTumi, byte[][] nextTumos, TumiField[] enemyFields, boolean isAnyEnemyDoingRensa);
 
     /**
      * 実装している実行パスの最大番号を返す
      * prepareEvaluate()呼び出し時には,passとして[0〜この返値]が使用される
      * 
      * @return 実行パスの最大番号
      */
     public int getMaxPass();
 }
 

TumiDeciderWithPruning2

 public interface TumiDeciderWithPruning2 extends TumiDecider {
 
     /**
      * 評価処理の初期化.1手ごとに評価前に呼び出される
      * 
      * @param beforeField 自分のフィールド(NEXT積み適用前)
      * @param enemyFields 敵のフィールド
      * @param isAnyEnemyDoingRensa いずれかの敵が連鎖を発動中
      * @param enemyJamas 敵が食らう予定のオジャマ得点
      * @param nextFallMyJama 次の手で自分にオジャマが降るかどうか
      * @param myJama 自分が食らう予定のオジャマ得点
      */
     public void initEvaluator(TumiField beforeField, TumiField[] enemyFields, boolean isAnyEnemyDoingRensa, int[] enemyJamas,
         boolean nextFallMyJama, int myJama);
 
     /**
      * 評価得点を算出する準備,枝刈りを行う
      * 
      * @param pass 実行パスの番号(0〜maxPass)
      * @param tumiIndex 着目している積み手を識別する番号 (0〜21)
      * @param beforeField 自分のフィールド(NEXT積み適用前)
      * @param afterField 自分のフィールド(NEXT積み適用後)
      * @param fallenTumi NEXT積み(重力落下後)
      * @param nextTumos ツモ色.NEXT:[0][0]〜[0][1],NEXT2:[1][0]〜[1][1]
      * @return 有効な積みとして残すならtrue,刈るならfalse
      */
     public boolean prepareEvaluate(int pass, int tumiIndex, TumiField beforeField, TumiField afterField, Tumi fallenTumi, byte[][] nextTumos);
         
     /**
      * 積み手に対する評価得点を算出する
      * @param tumiIndex 着目している積み手を識別する番号 (0〜21)
      * @param beforeField 自分のフィールド(NEXT積み適用前)
      * @param afterField 自分のフィールド(NEXT積み適用後)
      * @param fallenTumi NEXT積み(重力落下後)
      * @param nextTumos ツモ色.NEXT:[0][0]〜[0][1],NEXT2:[1][0]〜[1][1]
      * @return 着目している積み手の評価得点 
      */
     public long evaluateTumi(int tumiIndex, TumiField beforeField, TumiField afterField, Tumi fallenTumi, byte[][] nextTumos);
     
     /**
      * 実装している実行パスの最大番号を返す
      * prepareEvaluate()呼び出し時には,passとして[0〜この返値]が使用される
      * 
      * @return 実行パスの最大番号
      */
     public int getMaxPass();
 }


© 2024 KMIソフトウェア