public Tile AIPickTileToDiscard(List <HandCombination> handCombs, Game game) { Tile discardTile = null; if (!this.HasReached) { List <Tile> allTiles = new List <Tile>(this.HandZone.Tiles); allTiles.AddRange(this.StealZone.Tiles); allTiles.Sort(Tile.CompareTiles); List <HandCombProbs> handCombProbs = new List <HandCombProbs>(); foreach (HandCombination handComb in handCombs) { List <Tile.TileProp> tileProp; float prob = handComb.GetProbabilityOfCompletion(allTiles, game.TilesInGame, game, out tileProp); HandCombProbs combProb = new HandCombProbs(handComb, tileProp, prob); handCombProbs.Add(combProb); } handCombProbs.Sort(HandCombProbs.SortFunc); while (handCombProbs.Count > 0 && discardTile == null) { HashSet <Tile.TileProp> tilePropSet = new HashSet <Tile.TileProp>(); foreach (HandCombProbs combProb in handCombProbs) { foreach (Tile.TileProp prop in combProb.necessaryTiles) { tilePropSet.Add(prop); } } foreach (Tile tile in this.handZone.Tiles) { if (!tilePropSet.Contains(new Tile.TileProp(tile))) { discardTile = tile; break; } } if (discardTile == null) { handCombProbs.RemoveAt(handCombProbs.Count - 1); } } } if (discardTile == null) { discardTile = this.handZone.Tiles.Last(); } return(discardTile); }
public static int SortFunc(HandCombProbs x, HandCombProbs y) { if (x.prob < y.prob) { return(1); } else if (x.prob > y.prob) { return(-1); } else { return(0); } }