/*private void UpdateBoard() { foreach(Card card in Cards) if (card.State == CardStates.OnBoard && card.Health <= 0) DoDie (card.ID); }*/ public static bool CanDoAction(BoardState InitialState, BoardAction Action) { if (Action.Type == "ACTION_DRAW_CARDS") return true; if (Action.Type == "ACTION_DEAL_DAMAGE") return true; if (Action.Type == "ACTION_START_TURN") return true; if (Action.Type == "ACTION_END_TURN") return true; if (Action.Type == "ACTION_PLAY_CARD") { Card ActorCard = InitialState.GetCard((int)Action.Actor); BoardState.Player Player = InitialState.Players[(int)Action.Player]; return Player.CurrentMana >= InitialState.GetCardManaCost(ActorCard) && Action.Player == InitialState.ActivePlayer && ActorCard.State == CardStates.InHand; } if (Action.Type == "ACTION_ATTACK") { Card ActorCard = InitialState.GetCard((int)Action.Actor); int TargetID = (int)Action.Target; Card TargetCard = InitialState.GetCard(TargetID); if (ActorCard.CanAttack == false) return false; if (Action.Player != InitialState.ActivePlayer) return false; if (ActorCard.PlayerID == TargetCard.PlayerID) return false; if (InitialState.GetCardAttack(ActorCard) > 0 && (ActorCard.State == CardStates.Hero || ActorCard.State == CardStates.OnBoard) && (TargetCard.State == CardStates.Hero || TargetCard.State == CardStates.OnBoard)) return true; return false; } if (Action.Type == "ACTION_DIE") return true; return true; }
private static double AI_GetPlayerScore(BoardState State, int playerID) { double score = 0; int opponentID; int heroHealth = State.GetCardHealth(State.GetCard(State.GetHeroID(playerID))); score += heroHealth * 0.5; if (playerID == 0) opponentID = 1; else opponentID = 0; int enemyHeroHealth = State.GetCardHealth(State.GetCard(State.GetHeroID(opponentID))); score = score - 0.65 * enemyHeroHealth; List<Card> boardCards = State.GetPlayerOnBoardMinions(playerID); foreach (Card card in boardCards) { int cardHealth = State.GetCardHealth(card); int cardAttack = State.GetCardAttack(card); score += 0.8 * cardHealth + 0.7 * cardAttack; } List<Card> enemyBoardCards = State.GetPlayerOnBoardMinions(opponentID); foreach (Card card in enemyBoardCards) { int cardHealth = State.GetCardHealth(card); int cardAttack = State.GetCardAttack(card); score = score - 2.0 * (cardAttack + cardHealth); } if (heroHealth < 1) score = Mathf.NegativeInfinity; if (enemyHeroHealth < 1) score = Mathf.Infinity; return score; }
public static BoardAction GetAttackAction(BoardState InitialState, int actorID, int targetID) { Card ActorCard = InitialState.GetCard(actorID); return new BoardAction("ACTION_ATTACK", ActorCard.PlayerID, actorID, targetID, null); }