廢話不多說,直接上代碼
/// <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