Пример #1
0
    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);
    }
Пример #2
0
 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);
     }
 }