GameMove GetMove(bool best) { var moves = tree.Keys; var possibleMoves = moves.Select(k => Tuple.Create(k, k.Worth())).Order(pr => pr.Item2); if (best) { return(possibleMoves.First().Item1); } else { int pos = rng.Next(possibleMoves.Count()); return(possibleMoves.Nth(pos).Item1); } return(GameMove.Random(board)); }
public GameMove GetMove(GameBoard board, GameBoard.Player player, bool best) { //Get stored moves for this board position with their associated worthiness values var moves = tree.ContainsKey(board.Key) ? tree[board.Key] : new Dictionary <int, Tuple <GameMove, MoveStats> >(); var possibleMoves = moves.Select(kvp => Tuple.Create(kvp.Key, kvp.Value.Item1, kvp.Value.Item2.Worth())).OrderByDescending(pr => pr.Item3); if (possibleMoves.Count() == 0) { return(GameMove.Random(board, Game.MoveFromPlayer(player))); } if (best) { //Get Best Move return(possibleMoves.First().Item2); } else { // get nth move in order of decreasing worth int pos = rng.Next(possibleMoves.Count()); return(possibleMoves.ElementAt(pos).Item2); } //return GameMove.Random(board, Game.MoveFromPlayer(player)); }