Behavior控场模式的解析(上)

废话不多说,直接上代码

        /// <summary>
        /// 重写behavior名称
        /// </summary>
        /// <returns>一个字符串,behavior的名称</returns>
        public override string BehaviorName() { return "控场模式"; }

        /// <summary>
        /// 定义了一个叫penman的私有成员,但是没什么卵用
        /// </summary>
        PenalityManager penman = PenalityManager.Instance;

        /// <summary>
        /// 重点来了,计算场面价值的关键函数
        /// </summary>
        /// <param name="p">场面</param>
        /// <returns>价值</returns>
        public override float getPlayfieldValue(Playfield p)
        {
            //p.value的初始值是Int32.MinValue,也就是-2147483648
            //意思就是防止多次运算,这个场面的val如果大于-2000000(已经计算过val)则直接返回
            if (p.value >= -2000000) return p.value;
                                   
            int retval = 0;//定义了一个叫retval的变量来接受计算的结果

            #region 双方血量价值
            int hpboarder = 10;//己方血量临界值
            if (p.ownHeroName == HeroEnum.warlock && p.enemyHeroName != HeroEnum.mage) hpboarder = 6;
            int aggroboarder = 11;//敌方血量临界值
            if (p.ownHero.Hp + p.ownHero.armor > hpboarder)
            {
                retval += p.ownHero.Hp + p.ownHero.armor;//血量大于临界值,价值为1
            }
            else
            {
                if (p.nextTurnWin()) retval -= (hpboarder + 1 - p.ownHero.Hp - p.ownHero.armor);//如果下回合能斩杀,血量价值为1
                else retval -= 2 * (hpboarder + 1 - p.ownHero.Hp - p.ownHero.armor) * (hpboarder + 1 - p.ownHero.Hp - p.ownHero.armor);//血量小于临界值,价值为2*差平方
            }

            if (p.enemyHero.Hp + p.enemyHero.armor > aggroboarder)
            {
                retval += -p.enemyHero.Hp - p.enemyHero.armor;//敌方血量大于临界值,价值为1
            }
            else
            {
                retval += 4 * (aggroboarder + 1 - p.enemyHero.Hp - p.enemyHero.armor);//敌方血量小于临界值,价值为4
            }
            #endregion

            #region 惩罚价值
            retval -= p.evaluatePenality;
            #endregion

            #region 己方手牌价值
            retval += p.owncards.Count * 5; 
            #endregion

            #region 任务进度价值
            retval += p.ownQuest.questProgress * 10; 
            #endregion

            #region 双方水晶价值
            retval += p.ownMaxMana;
            retval -= p.enemyMaxMana;
            retval += p.ownMaxMana * 20 - p.enemyMaxMana * 20;
            #endregion

            #region 双方技能价值
            retval += (p.enemyHeroAblility.manacost - p.ownHeroAblility.manacost) * 4;//双方技能费用的价值
            if (p.ownHeroPowerAllowedQuantity != p.enemyHeroPowerAllowedQuantity)
            {
                if (p.ownHeroPowerAllowedQuantity > p.enemyHeroPowerAllowedQuantity) retval += 3;//双方技能可以使用次数的价值
                else retval -= 3;
            }
            #endregion

            #region 敌方法强价值
            if (p.enemyHeroName == HeroEnum.mage || p.enemyHeroName == HeroEnum.druid) retval -= 2 * p.enemyspellpower;
            #endregion

            #region 双方武器价值
            if (p.ownWeapon.Angr > 0)
            {
                if (p.ownWeapon.Angr > 1) retval += p.ownWeapon.Angr * p.ownWeapon.Durability;
                else retval += p.ownWeapon.Angr * p.ownWeapon.Durability + 1;
            }

            if (!p.enemyHero.frozen)
            {
                retval -= p.enemyWeapon.Durability * p.enemyWeapon.Angr;
            }
            else
            {
                if (p.enemyWeapon.Durability >= 1)
                {
                    retval += 12;
                }
            }
            #endregion

            #region 抽牌价值
            if (p.lethalMissing() <= 5)
            {
                retval += p.owncarddraw * 100;//如果对面差5以内斩杀,显著提高抽牌价值
            }
            if (p.ownMaxMana < 4)
            {
                retval += p.owncarddraw * 2;//3费以内抽一张牌+2价值
            }
            else
            {
                retval += p.owncarddraw * 5;//3费以上抽一张牌+5价值
            }

            if (p.owncarddraw + 1 >= p.enemycarddraw) retval -= p.enemycarddraw * 7;
            else retval -= (p.owncarddraw + 1) * 7 + (p.enemycarddraw - p.owncarddraw - 1) * 12; 
            #endregion

            //int owntaunt = 0;
            int readycount = 0;//可以攻击随从的数量,没什么卵用
            int ownMinionsCount = 0;//血量小于等于4,攻击大于2或者血量大于3的随从数量。这作者脑子坏掉了?想表达啥?

            #region 己方随从价值
            foreach (Minion m in p.ownMinions)
            {
                retval += 5;//首先给每个随从一个5的初始值
                retval += m.Hp * 2;//加上2倍血量
                retval += m.Angr * 2;//加上2倍攻击
                retval += m.handcard.card.rarity;//加上卡牌稀有度?作者菜逼
                if (!m.playedThisTurn && m.windfury) retval += m.Angr;//如果不是本回合打的并且有风怒,加上攻击力
                if (m.divineshild) retval += 1;//如果圣盾,+1
                if (m.stealth) retval += 1;//如果潜行,+1
                if (m.handcard.card.isSpecialMinion && !m.silenced)//如果是没被沉默的特殊随从
                {
                    retval += 1;//默认+1
                    if (!m.taunt && m.stealth) retval += 20;//如果不是嘲讽,是潜行,+20
                }
                else
                {
                    if (m.Angr <= 2 && m.Hp <= 2 && !m.divineshild) retval -= 5;//否则如果是攻击血量都小于等于2且没有圣盾,-5
                }
                if (m.lifesteal) retval += m.Angr / 2;//吸血,+攻击力一半
                if (m.divineshild && m.taunt) retval += 4;//圣盾嘲讽,+4
                if (p.ownMinions.Count > 2 && (m.handcard.card.name == CardDB.cardName.direwolfalpha || m.handcard.card.name == CardDB.cardName.flametonguetotem || m.handcard.card.name == CardDB.cardName.stormwindchampion || m.handcard.card.name == CardDB.cardName.raidleader)) retval += 10;//如果随从至少3个,团队领袖这类群体buff随从价值+10
                if (m.handcard.card.name == CardDB.cardName.bloodmagethalnos) retval += 10;//血法师+10
                if (m.handcard.card.name == CardDB.cardName.nerubianegg)//蛛魔之卵的价值
                {
                    if (m.Angr >= 1) retval += 2;
                    if ((!m.taunt && m.Angr == 0) && (m.divineshild || m.maxHp > 2)) retval -= 10;
                }
                if (m.Ready) readycount++;
                if (m.Hp <= 4 && (m.Angr > 2 || m.Hp > 3)) ownMinionsCount++;
                retval += m.synergy;//加种族与职业匹配度
            }
            #endregion

            #region 克苏恩价值
            retval += p.anzOgOwnCThunAngrBonus;//加克苏恩buff 
            #endregion

            #region buff手牌价值
            retval += p.anzOwnExtraAngrHp - p.anzEnemyExtraAngrHp;//加给手牌的buff 
            #endregion

 

posted @ 2020-08-23 13:55  魔王的骑士  阅读(1142)  评论(2编辑  收藏  举报