AIの積み込みロジックを呼び出す際に必要なインタフェイスについて,考察する.
設計(実装済みの内容)TumiDeciderWithPruningインタフェイスAIロジックが実装(implements)すべきインタフェイスであり, メンバとして以下の関数を宣言している.
これらの関数の呼び出し時には,以下の情報が渡される.
TumiDeciderWithPruning2インタフェイスTumiDeciderWithPruningに,呼び出し引数として,相手と自分のオジャマ降下予告の情報を追加した. これにより,AIロジック内で以下の処理を行うことが可能になった.
TumiDeciderWithPruning2は,連鎖読み4-5以降の新しいAIで使用している.
実装(Javaソース)TumiDeciderWithPruningpublic 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(); }
TumiDeciderWithPruning2public 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(); } |