package net.demilich.metastone.game.behaviour.heuristic; import net.demilich.metastone.game.Attribute; import net.demilich.metastone.game.GameContext; import net.demilich.metastone.game.Player; import net.demilich.metastone.game.entities.minions.Minion; public class WeightedHeuristic implements IGameStateHeuristic { private float calculateMinionScore(Minion minion) { float minionScore = minion.getAttack() + minion.getHp(); float baseScore = minionScore; if (minion.hasAttribute(Attribute.FROZEN)) { return minion.getHp(); } if (minion.hasAttribute(Attribute.TAUNT)) { minionScore += 2; } if (minion.hasAttribute(Attribute.WINDFURY)) { minionScore += minion.getAttack() * 0.5f; } if (minion.hasAttribute(Attribute.DIVINE_SHIELD)) { minionScore += 1.5f * baseScore; } if (minion.hasAttribute(Attribute.SPELL_DAMAGE)) { minionScore += minion.getAttributeValue(Attribute.SPELL_DAMAGE); } if (minion.hasAttribute(Attribute.ENRAGED)) { minionScore += 1; } if (minion.hasAttribute(Attribute.STEALTH)) { minionScore += 1; } if (minion.hasAttribute(Attribute.UNTARGETABLE_BY_SPELLS)) { minionScore += 1.5f * baseScore; } return minionScore; } @Override public double getScore(GameContext context, int playerId) { float score = 0; Player player = context.getPlayer(playerId); Player opponent = context.getOpponent(player); if (player.getHero().isDestroyed()) { return Float.NEGATIVE_INFINITY; } if (opponent.getHero().isDestroyed()) { return Float.POSITIVE_INFINITY; } int ownHp = player.getHero().getHp() + player.getHero().getArmor(); int opponentHp = opponent.getHero().getHp() + opponent.getHero().getArmor(); score += ownHp - opponentHp; score += player.getHand().getCount() * 3; score -= opponent.getHand().getCount() * 3; score += player.getMinions().size() * 2; score -= opponent.getMinions().size() * 2; for (Minion minion : player.getMinions()) { score += calculateMinionScore(minion); } for (Minion minion : opponent.getMinions()) { score -= calculateMinionScore(minion); } return score; } @Override public void onActionSelected(GameContext context, int playerId) { } }