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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM