/// <summary> /// Creates all possible semantically unique concealed combinations for a given number of tiles and a set of tiles already /// used in melds. /// </summary> /// <param name="numberOfTiles">The number of tiles in the concealed part of the hand.</param> /// <param name="meldedTiles">The tiles used in the melded part of the hand.</param> public IEnumerable<Combination> Create(int numberOfTiles, Combination meldedTiles) { Validate.NotNegative(numberOfTiles, nameof(numberOfTiles)); Validate.NotNull(meldedTiles, nameof(meldedTiles)); Clear(); var used = meldedTiles.Counts.ToList(); for (var i = 0; i < TypesInSuit; ++i) { TilesInExternalMelds[i] = used[i]; } return Create(numberOfTiles, TypesInSuit); }
/// <summary> /// Creates a new instance of TileGroupAnalyzer. /// </summary> public TileGroupAnalyzer(Combination concealedTiles, Combination meldedTiles, int meldCount, bool allowShuntsu) { Validate.NotNull(concealedTiles, nameof(concealedTiles)); Validate.NotNull(meldedTiles, nameof(meldedTiles)); Validate.InRange(meldCount, 0, 4, nameof(meldCount)); _meldCount = meldCount; _concealed = concealedTiles.Counts.ToList(); _used = meldedTiles.Counts.ToList(); _tileTypeCount = concealedTiles.Counts.Count; _protoGroups = allowShuntsu ? SuitProtoGroups : HonorProtoGroups; }
private static void CheckHand(int expectedCount, IList<int> concealedTiles, IList<int> meldedTiles, int meldCount) { var allowShuntsu = concealedTiles.Count == 9; var concealed = new Combination(concealedTiles); var melded = new Combination(meldedTiles); var analyzer = new TileGroupAnalyzer(concealed, melded, meldCount, allowShuntsu); var arrangements = analyzer.Analyze().ToList(); var hand = $"({string.Join("", concealedTiles)})({string.Join("", meldedTiles)})({meldCount})"; var arrangementTexts = arrangements.Select(a => $"({a.JantouValue}, {a.MentsuCount}, {a.MentsuValue})"); var message = $"hand {hand} has wrong arrangements: {string.Join("", arrangementTexts)}"; Assert.AreEqual(expectedCount, arrangements.Count, message); }
/// <summary> /// Creates all possible semantically unique concealed combinations for a given number of tiles. /// </summary> public IEnumerable<Combination> Create(int numberOfTiles) { var noMeldedTiles = new Combination(new int[TypesInSuit]); return Create(numberOfTiles, noMeldedTiles); }