/** * $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; } } |