Ejemplo n.º 1
0
        private void TestChows(IList <Tile> handTiles, Tile discardTile, MeldSide side,
                               IList <OutTurnOperation> operations)
        {
            if (!gameSettings.AllowChows)
            {
                return;
            }
            if (side != MeldSide.Left)
            {
                return;
            }
            var chows = MahjongLogic.GetChows(handTiles, discardTile, side);

            if (chows.Any())
            {
                foreach (var chow in chows)
                {
                    operations.Add(new OutTurnOperation
                    {
                        Type           = OutTurnOperationType.Chow,
                        Tile           = discardTile,
                        Meld           = chow,
                        ForbiddenTiles = gameSettings.AllowDiscardSameAfterOpen
                                                        ? null
                                                        : chow.GetForbiddenTiles(discardTile)
                    });
                }
            }
        }
Ejemplo n.º 2
0
        private void TestPongs(IList <Tile> handTiles, Tile discardTile, MeldSide side,
                               IList <OutTurnOperation> operations)
        {
            if (!gameSettings.AllowPongs)
            {
                return;
            }
            var pongs = MahjongLogic.GetPongs(handTiles, discardTile, side);

            if (pongs.Any())
            {
                foreach (var pong in pongs)
                {
                    operations.Add(new OutTurnOperation
                    {
                        Type           = OutTurnOperationType.Pong,
                        Tile           = discardTile,
                        Meld           = pong,
                        ForbiddenTiles = gameSettings.AllowDiscardSameAfterOpen
                                                        ? null
                                                        : pong.GetForbiddenTiles(discardTile)
                    });
                }
            }
        }
Ejemplo n.º 3
0
        public static IEnumerable <OpenMeld> GetPongs(IList <Tile> handTiles, Tile discardTile, MeldSide side)
        {
            var result          = new HashSet <Meld>(Meld.MeldConsiderColorEqualityComparer);
            var handTileList    = new List <Tile>(handTiles);
            var particularTiles = handTileList.FindAll(tile => tile.EqualsIgnoreColor(discardTile));
            var combination     = Combination(particularTiles, 2);

            foreach (var item in combination)
            {
                item.Add(discardTile);
                result.Add(new Meld(true, item.ToArray()));
            }
            return(result.Select(meld => new OpenMeld
            {
                Meld = meld,
                Tile = discardTile,
                Side = side
            }));
        }
Ejemplo n.º 4
0
        public static IEnumerable <OpenMeld> GetChows(IList <Tile> handTiles, Tile discardTile, MeldSide side)
        {
            var result = new HashSet <Meld>(Meld.MeldConsiderColorEqualityComparer);

            if (discardTile.Suit == Suit.Z)
            {
                return(new List <OpenMeld>());
            }
            var handTileList = new List <Tile>(handTiles);

            GetChows1(handTileList, discardTile, result);
            GetChows2(handTileList, discardTile, result);
            GetChows3(handTileList, discardTile, result);
            return(result.Select(meld => new OpenMeld
            {
                Meld = meld,
                Tile = discardTile,
                Side = side
            }));
        }
Ejemplo n.º 5
0
        public static IEnumerable <OpenMeld> GetKongs(IList <Tile> handTiles, Tile discardTile, MeldSide side)
        {
            var result   = new HashSet <Meld>(Meld.MeldConsiderColorEqualityComparer);
            var tileList = new List <Tile>(handTiles)
            {
                discardTile
            };
            var handCount = CountTiles(handTiles);
            int index     = Tile.GetIndex(discardTile);

            if (handCount[index] == 3)
            {
                var tiles = tileList.FindAll(t => Tile.GetIndex(t) == index);
                result.Add(new Meld(true, tiles.ToArray()));
            }
            return(result.Select(meld => new OpenMeld
            {
                Meld = meld,
                Tile = discardTile,
                Side = side
            }));
        }