Exemple #1
0
 public static int SortFunc(TileDrawProb x, TileDrawProb y)
 {
     if (x.prob < y.prob)
     {
         return(1);
     }
     else if (x.prob > y.prob)
     {
         return(-1);
     }
     else
     {
         return(0);
     }
 }
    public override float GetProbabilityOfCompletion(List <Tile> _tiles, List <Tile.TileProp> allTileData, Game game, out List <Tile.TileProp> outTilePropsUsed)
    {
        List <Tile> tiles = new List <Tile>(_tiles);

        Tile.TileType[] tileTypes = new Tile.TileType[3] {
            Tile.TileType.Red, Tile.TileType.Blue, Tile.TileType.Yellow
        };

        List <Tile.TileProp> usableTiles  = new List <Tile.TileProp>();
        List <Tile>          tilesForHand = new List <Tile>();

        foreach (Tile.TileType tileType in tileTypes)
        {
            List <Tile> sets;
            List <Tile> pairs;
            List <Tile> singles;

            List <Tile> colorTiles = tiles.FindAll(t => t.Type == tileType);
            Tile.SeparateIntoSetsPairsSingles(colorTiles, out sets, out pairs, out singles);

            if (sets.Count > 0)
            {
                for (int i = 0; i < 3; ++i)
                {
                    Tile tile = tiles.Find(t => t.IsSame(sets[0]));
                    tilesForHand.Add(tile);
                    tiles.Remove(tile);
                }
            }
            else if (pairs.Count > 0)
            {
                TileDrawProb bestDrawProb = new TileDrawProb(new Tile.TileProp(pairs[0]), 0);
                foreach (Tile tile in pairs)
                {
                    TileDrawProb drawProb = game.GetProbOfDrawingTile(new Tile.TileProp(tile), 1);

                    if (drawProb.prob > bestDrawProb.prob)
                    {
                        bestDrawProb = drawProb;
                    }
                }

                for (int i = 0; i < 2; ++i)
                {
                    Tile tile = tiles.Find(t => bestDrawProb.tileProp.Equals(t));
                    tilesForHand.Add(tile);
                    tiles.Remove(tile);
                }
            }
            else if (singles.Count > 0)
            {
                TileDrawProb bestDrawProb = new TileDrawProb(new Tile.TileProp(singles[0]), 0);
                foreach (Tile tile in singles)
                {
                    TileDrawProb drawProb = game.GetProbOfDrawingTile(new Tile.TileProp(tile), 2);

                    if (drawProb.prob > bestDrawProb.prob)
                    {
                        bestDrawProb = drawProb;
                    }
                }

                Tile tileToAdd = tiles.Find(t => bestDrawProb.tileProp.Equals(t));
                tilesForHand.Add(tileToAdd);
                tiles.Remove(tileToAdd);
            }
            else
            {
                usableTiles.AddRange(allTileData.FindAll(t => t.type == tileType));
            }
        }

        List <Tile.TileProp> tilePropsUsed;
        float prob = Tile.FindCompleteHandWithHighestProb(tilesForHand, usableTiles, game, out tilePropsUsed);

        // Remove any used tiles that have excess numbers.
        List <Tile.TileProp> tobeRemoved = new List <Tile.TileProp>();

        foreach (Tile.TileProp tileProp in tilePropsUsed)
        {
            if (_tiles.FindAll(t => tileProp.Equals(t)).Count > CombatSceneController.SetSize)
            {
                tobeRemoved.Add(tileProp);
            }
        }
        tobeRemoved.ForEach(tp => tilePropsUsed.Remove(tp));

        outTilePropsUsed = tilePropsUsed;
        return(prob);
    }