/**
  * $Id: A5BDA1BCA5B9284B616964616E54756D6929.txt,v 1.1.1.1 2009/06/01 12:21:03 kamoi Exp $
  * Copyright 2004 kamoland.com All rights reserved.
  */
 package com.kamoland.rensacommon.ai.decider;
 
 import com.kamoland.rensacommon.Const;
 import com.kamoland.rensacommon.ai.AiUtil;
 import com.kamoland.rensacommon.ai.Tumi;
 import com.kamoland.rensacommon.ai.TumiDecider;
 import com.kamoland.rensacommon.rule.LinkedPuyo;
 import com.kamoland.rensacommon.rule.PuField;
 
 /**
  * 階段積み風の実装
  * 
  * @author kamoland.com
  * @version
  * <pre>
  * 2004/05/05 新規作成
  * </pre>
  */
 public class KaidanTumi implements TumiDecider {
 
    /**
     * デフォルトコンストラクタ
     */
    public KaidanTumi() {
    }
 
    /**
     * 積みに対する評価得点を算出する
     * @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 いずれかの敵が連鎖を発動中
     */
    public long evaluateTumi(
        PuField beforeField,
        PuField afterField,
        Tumi fallenTumi,
        byte[][] nextTumos,
        PuField[] enemyFields,
        boolean isAnyEnemyDoingRensa) {
 
        int result = 0;
        boolean emergency = false;
        
        if (beforeField.getPuyo(1, 4) > 0 ||
            beforeField.getPuyo(2, 4) > 0 ||
            beforeField.getPuyo(3, 4) > 0 ||
            beforeField.getPuyo(4, 4) > 0) {
            // 中央部が残り4列なら緊急モードとする
            emergency = true;
        }
        
        // ★1.連結個数を求める
        int cc1 = AiUtil.countConnected(afterField, fallenTumi.getI()[0], fallenTumi.getJ()[0], fallenTumi.getCol()[0]);
        int cc2 = AiUtil.countConnected(afterField, fallenTumi.getI()[1], fallenTumi.getJ()[1], fallenTumi.getCol()[1]);
        int cc = cc1 + cc2;
        if (cc1 > 0 && cc2 > 0) {
            // 2色優先
            cc += 10;       
        }
 
        if (cc > 0) {
            result = cc + 1000;
        }
 
        int yc = 0;
        if (result == 0) {
            // ★2.同色を同列にまとめる
            LinkedPuyo lp = AiUtil.queryByI(beforeField, fallenTumi.getI()[0], fallenTumi.getCol()[0]);
            int yc1 = lp.num;
            lp = AiUtil.queryByI(beforeField, fallenTumi.getI()[1], fallenTumi.getCol()[1]);
            int yc2 = lp.num;
            yc = yc1 + yc2;
            if (yc1 > 0 && yc2 > 0) {
                // 2色優先
                yc += 10;       
            }
        }
        if (yc > 0) {
            result = yc + 100;
        }
        
        // ★3.隣接行の上に置く
        int dan = 0;
        for (int k = 0; k < 2; k++) {
            if (fallenTumi.getI()[k] > 0) {
                LinkedPuyo lp = AiUtil.queryByI(beforeField, fallenTumi.getI()[k] - 1, fallenTumi.getCol()[k]);
                if (lp.p_j[0] > fallenTumi.getJ()[k]) {
                    // 右上に置こうとしている
                    dan = lp.p_j[0] - fallenTumi.getJ()[k];
                }           
            }
            if (fallenTumi.getI()[k] < Const.FIELD_X - 1) {
                LinkedPuyo lp = AiUtil.queryByI(beforeField, fallenTumi.getI()[k] + 1, fallenTumi.getCol()[k]);
                if (lp.p_j[0] > fallenTumi.getJ()[k]) {
                    // 左上に置こうとしている
                    dan = lp.p_j[0] - fallenTumi.getJ()[k];
                }           
            }
        }
        if (dan > 0) {
            result = dan + 10;
        }
 
        // ★4.できるだけ下に置く
        if (result == 0) {
            result = fallenTumi.getJ()[0] + fallenTumi.getJ()[1];
        }
 
        if (afterField.vanish(0).any_rensa && !emergency) {
            // ★緊急モード時以外は消すべきでない
            result = 0; 
        }
        return result;
    }
 }


© 2024 KMIソフトウェア