public override PlayerTask GetMove(POGame poGame) { if (poGame.Turn != lastTurnCounter) { //Console.WriteLine("New turn " + poGame.Turn + "\n"); actionsToDo.Clear(); lastTurnCounter = poGame.Turn; mcts = new MCTS(poGame); actionsToDo = mcts.run(); } var player = poGame.CurrentPlayer; /* * Console.WriteLine("------------------------------------" + "\nCards on hand:\n" + String.Join(";\n", player.HandZone)); * Console.WriteLine("\nCurrent Turn and Mana:\n" + poGame.Turn + ";\n" + player.RemainingMana); * Console.WriteLine("\nCurrent Health and Enemy Health:\n" + player.Hero.Health + ";\n" + player.Opponent.Hero.Health); * * Console.WriteLine("\nCards on enemy field:\n" + String.Join(";\n", player.Opponent.BoardZone)); * if (player.Opponent.BoardZone.Where(p => p.HasTaunt).Sum(p => p.Health) > 0) * Console.WriteLine("Total taunt on enemy side:\n" + player.Opponent.BoardZone.Where(p => p.HasTaunt).Sum(p => p.Health)); * * Console.WriteLine("\nCards on own field:\n" + String.Join(";\n", player.BoardZone)); * if (player.BoardZone.Where(p => p.HasTaunt).Sum(p => p.Health) > 0) * Console.WriteLine("Total taunt on own side:\n" + player.BoardZone.Where(p => p.HasTaunt).Sum(p => p.Health)); */ if (actionsToDo.Any()) { PlayerTask task = actionsToDo[0]; actionsToDo.RemoveAt(0); return(task); } else { return(poGame.CurrentPlayer.Options().First(x => x.PlayerTaskType == PlayerTaskType.END_TURN)); } /* * * Root = new Node(); * * var player = poGame.CurrentPlayer; * * // simple Mulligan Rule * if (player.MulliganState == Mulligan.INPUT) * { * List<int> mulligan = new MidRangeScore().MulliganRule().Invoke(player.Choice.Choices.Select(p => poGame.getGame().IdEntityDic[p]).ToList()); * return ChooseTask.Mulligan(player, mulligan); * } * * // Get all valid options for this turn * var validOpts = poGame.Simulate(player.Options()).Where(x => x.Value != null); * validOpts.OrderBy(x => new MidRangeScore { Controller = player }.Rate()); * * // Build initial tree * foreach (KeyValuePair<PlayerTask, POGame> actionState in validOpts) * { * var appnode = new Node(); * appnode.state = actionState.Value; * appnode.nodeAction = actionState.Key; * appnode.Q = new MidRangeScore { Controller = player }.Rate(); //might be wrong * Root.childNodes.Append<Node>(appnode); * } * * // Stats output * List<PlayerTask> options = new List<PlayerTask>(); * if (validOpts.Any()) * { * Console.WriteLine("------------------------------------" + "\nCards on hand:\n" + String.Join(";\n", player.HandZone)); * Console.WriteLine("\nCurrent Turn and Mana:\n" + poGame.Turn + ";\n" + player.RemainingMana); * Console.WriteLine("\nCurrent Health and Enemy Health:\n" + player.Hero.Health + ";\n" + player.Opponent.Hero.Health); * * Console.WriteLine("\nCards on enemy field:\n" + String.Join(";\n", player.Opponent.BoardZone)); * if (player.Opponent.BoardZone.Where(p => p.HasTaunt).Sum(p => p.Health) > 0) * Console.WriteLine("Total taunt on enemy side:\n" + player.Opponent.BoardZone.Where(p => p.HasTaunt).Sum(p => p.Health)); * * Console.WriteLine("\nCards on own field:\n" + String.Join(";\n", player.BoardZone)); * if (player.BoardZone.Where(p => p.HasTaunt).Sum(p => p.Health) > 0) * Console.WriteLine("Total taunt on own side:\n" + player.BoardZone.Where(p => p.HasTaunt).Sum(p => p.Health)); * * options = poGame.CurrentPlayer.Options(); * * } * return options[Rnd.Next(options.Count)]; */ }