예제 #1
0
    /*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;
    }
예제 #2
0
    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;
    }
예제 #3
0
 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);
 }