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) }); } } }
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) }); } } }
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 })); }
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 })); }
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 })); }