Esempio n. 1
0
        //Choice cards***can choose a task when you play it
        private PlayerTask PlayCard(List <PlayerTask> PlayerTaskList, Controller myself, HandZone myHand, BoardZone theBoard, POGame game)
        {
            PlayerTask returnTask         = null;
            int        maxManaCard        = 0;
            int        HighestDamage      = 0;
            int        WeaponAttackDamage = 0;

            //For each valid option, prints all available moves and the cost of the card
            foreach (PlayerTask task in PlayerTaskList)
            {
                if (task.PlayerTaskType == PlayerTaskType.PLAY_CARD)
                {
                    /*if(task.Target != null){
                     *      Console.WriteLine($"Can Play: {task} Mana: {task.Source.Card.Cost} Target Controller: {task.Target.Controller} Type: {task.Source.Card.Type}");
                     * }
                     * else{
                     *      Console.WriteLine($"Can Play {task}, {task.Source.Card.Cost} mana. Type: {task.Source.Card.Type}");
                     * }*/

                    var cardType = task.Source.Card.Type;
                    if (game.CurrentPlayer.RemainingMana > 0)
                    {
                        if (cardType == CardType.MINION)
                        {
                            //Console.WriteLine(task);
                            //Console.WriteLine($"Entered if statement 0");
                            if (task.Source.Card.Taunt == true)
                            {
                                //Console.WriteLine($"Entered if statement 1");
                                if (theBoard.Count() >= 1)
                                {
                                    //Console.WriteLine($"Entered if statement 2");
                                    returnTask = task;
                                }
                            }
                            else if (task.Source.Card.Charge == true || task.Source.Card.Rush == true && task.PlayerTaskType == PlayerTaskType.PLAY_CARD && task.Source.Card.Cost >= maxManaCard)
                            {
                                //Adds to the task list because these  minions can attack in the same turn
                                //Console.WriteLine($"Entered if statement 3");
                                maxManaCard = task.Source.Card.Cost;
                                returnTask  = task;
                                var    mi             = new MinionID();                  //mi = minion id
                                Minion PlayerMinion   = null;
                                Minion OpponentMinion = null;
                                foreach (var x in playerList)
                                {
                                    if (x.ToString().Equals(task.Source.ToString()))
                                    {
                                        PlayerMinion = x;
                                    }
                                }
                                int Damage = 0;
                                foreach (var y in opponentList)
                                {
                                    if (y.AttackDamage > Damage)
                                    {
                                        Damage         = Damage + y.AttackDamage;
                                        OpponentMinion = y;
                                    }
                                }
                                mi.playerMinion   = PlayerMinion;
                                mi.opponentMinion = OpponentMinion;
                                TurnTaskList.Add(mi);
                                continue;
                            }
                            else
                            {
                                if (task.PlayerTaskType == PlayerTaskType.PLAY_CARD && task.Source.Card.Cost >= maxManaCard)
                                {
                                    maxManaCard = task.Source.Card.Cost;
                                    returnTask  = task;
                                }
                            }
                        }
                        else if (cardType == CardType.SPELL && task.Target != null && task.Target.Controller != myself && task.Target.Health > 0)
                        {
                            //Better way to verify spell target by ID
                            for (int i = 0; i < opponentList.Count(); i++)
                            {
                                if (opponentList[i].Id == task.Target.Id)
                                {
                                    returnTask = task;
                                }
                                else if (task.Target.AttackDamage > HighestDamage)
                                {
                                    HighestDamage = task.Target.AttackDamage;
                                    returnTask    = task;
                                }
                            }
                            if (task.Target.Id == game.CurrentOpponent.Hero.Id)
                            {
                                returnTask = task;
                            }
                            continue;
                        }
                        else if (cardType == CardType.WEAPON)
                        {
                            if (task.Source.Card.ATK > WeaponAttackDamage)
                            {
                                WeaponAttackDamage = task.Source.Card.ATK;
                                returnTask         = task;
                            }
                        }
                        // can't explicitly target own minions and hero
                        else if (task.Target == null)
                        {
                            maxManaCard = task.Source.Card.Cost;
                            returnTask  = task;
                        }
                    }
                    else if (myHand.Count() == 1)
                    {
                        returnTask = task;
                    }
                    else
                    {
                        //Console.WriteLine($"No play card task available");
                    }
                }
            }


            /*if(returnTask == null){
             *      Console.WriteLine("Return Playcard task: No card selected");
             * }
             * else{
             *      Console.WriteLine($"Return PlayCard task: {returnTask}");
             * }*/

            return(returnTask);
        }
Esempio n. 2
0
        private void TurnTasks(POGame game, Controller player)
        {
            TurnTaskList = new List <MinionID>();
            playerList   = GetMinions(game, game.CurrentPlayer);
            opponentList = GetMinions(game, game.CurrentOpponent);
            //Lowest Attack Damage --> Highest Attack Damage
            List <Minion> sortedPlayerList = playerList.OrderBy(x => x.AttackDamage).ToList();
            //Highest --> Lowest attack damage
            List <Minion> desSortedPlayerList = playerList.OrderByDescending(x => x.AttackDamage).ToList();
            //Highest Attack Damage --> Lowest Attack Damage
            List <Minion> sortedOpponentList = opponentList.OrderByDescending(x => x.AttackDamage).ToList();
            List <Minion> usedList           = new List <Minion>();

            /*	foreach (var o in sortedOpponentList){
             *              Console.WriteLine($"Here is opponent minion {o} which has {o.Health} health and does {o.AttackDamage} damage");
             *      }
             *      foreach (var p in sortedPlayerList){
             *              Console.WriteLine($"Here is player minion {p} which has {p.Health} health and does {p.AttackDamage} damage");
             *      }*/
            foreach (var o in sortedOpponentList)
            {
                int oHealth       = o.Health;
                int DamageCounter = 0;
                int index         = 0;
                //Console.WriteLine($"The opponent minion is {o} which has {oHealth} health.");
                //If I can play a card, it should play it if I can get rid of a minion in one move
                foreach (var p in desSortedPlayerList)
                {
                    if (!usedList.Contains(p) && p.AttackDamage != 0)
                    {
                        usedList.Add(p);
                        var diff = p.AttackDamage - oHealth;
                        if (diff <= 3 && diff >= 0)                          //3 is an arbitrary number to not use a 9 damage card on a 1 health opponent
                        {
                            index++;
                            var mi = new MinionID();
                            mi.playerMinion   = p;
                            mi.opponentMinion = o;
                            TurnTaskList.Add(mi);
                        }
                    }
                }
                //Otherwise, count of the damage to see the minimum amount of minions to kill a player.
                foreach (var p in sortedPlayerList)
                {
                    if (!usedList.Contains(p) && p.AttackDamage != 0)
                    {
                        usedList.Add(p);
                        if (DamageCounter < oHealth)
                        {
                            DamageCounter = DamageCounter + p.AttackDamage;
                            index++;
                            var mi = new MinionID();                             //mi = minion id
                            mi.playerMinion   = p;
                            mi.opponentMinion = o;
                            TurnTaskList.Add(mi);
                            //Console.WriteLine($"The player minion is {p} and after {index} cards has done {DamageCounter} damage.");
                        }
                        else
                        {
                            continue;
                        }
                    }
                }
                //Console.WriteLine($"A total of {DamageCounter} damage has been done on {o}");
                continue;
            }
            //Console.WriteLine($"In the list of tasks for turn {game.Turn}, there are {TurnTaskList.Count} elements.");

            /*foreach (var x in usedList){
             *      Console.WriteLine($"Used Minions: {x}");
             * }*/
        }