//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); }
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}"); * }*/ }