Ejemplo n.º 1
0
        public override bool IsClaimingDiscardedTileToCompleteWinningHand(Tile discardedTile)
        {
            var uncalledTilesWithClaimedDiscard = new List <Tile>(Hand.UncalledTiles)
            {
                discardedTile
            };

            if (!TileGrouper.CanGroupTilesIntoLegalHand(uncalledTilesWithClaimedDiscard))
            {
                return(false);
            }

            while (true)
            {
                WriteOptionChoiceIntroductoryText();
                Console.WriteLine($"\tW: Claim the discarded {discardedTile} to form a [w]inning hand.");
                Console.WriteLine("\tP: [P]ass.");
                var choice = TakeInputAsLowercase();
                if (choice == "w")
                {
                    return(true);
                }
                if (choice == "p")
                {
                    return(false);
                }
                WriteUnrecognizedInputText();
            }
        }
Ejemplo n.º 2
0
        public override bool IsWinningHand()
        {
            var uncalledTilesWithoutBonusTiles = new List <Tile>();
            var bonusTileSets = new List <TileGrouping>(BonusSets);

            foreach (var tile in UncalledTiles)
            {
                if (tile.GetType() == typeof(BonusTile))
                {
                    bonusTileSets.Add(new TileGrouping(tile));
                }
                else
                {
                    uncalledTilesWithoutBonusTiles.Add(tile);
                }
            }

            if (GetAdjustedCountOfPassedTiles(uncalledTilesWithoutBonusTiles, CalledSets) != WinningHandBaseTileCount)
            {
                return(false);
            }

            return(IsThirteenOrphans(uncalledTilesWithoutBonusTiles, CalledSets) ||
                   IsSevenPairs(uncalledTilesWithoutBonusTiles, CalledSets) ||
                   TileGrouper.CanGroupTilesIntoLegalHand(uncalledTilesWithoutBonusTiles));
        }
Ejemplo n.º 3
0
        public override TurnAction GetTurnActionAgainstDiscardedTile(Tile discardedTile, Player discardingPlayer)
        {
            RecentlySelectedTileGrouping = null;
            var isNextInTurnOrder  = IsPlayerNextInTurnOrder(discardingPlayer);
            var canMakeWinningHand = CanClaimDiscardedTileToCompleteWinningHand(discardedTile);

            var potentialHandTiles = new List <Tile>(Hand.UncalledTiles)
            {
                discardedTile
            };
            var groupsInvolvingDiscardedTile = TileGrouper.FindAllGroupsInTiles(potentialHandTiles)
                                               .Where(group => group.Contains(discardedTile)).ToList();
            var allowedGroups = FilterUnallowedGroups(groupsInvolvingDiscardedTile,
                                                      x => x.IsSequence() && !isNextInTurnOrder);

            while (true)
            {
                WriteOptionChoiceIntroductoryText();

                for (int i = 0; i < allowedGroups.Count; i++)
                {
                    Console.WriteLine($"\t{i + 1}. Claim the discarded {discardedTile} to make: " +
                                      $"[{allowedGroups[i]}].");
                }
                if (canMakeWinningHand)
                {
                    Console.WriteLine($"\tW: Claim the discarded {discardedTile} to form a [w]inning hand.");
                }
                Console.WriteLine($"\tP: [P]ass.");
                var choice = TakeInputAsLowercase();

                if (choice == "w" && canMakeWinningHand)
                {
                    return(TurnAction.DeclareWin);
                }
                if (choice == "p")
                {
                    return(TurnAction.Pass);
                }

                int.TryParse(choice, out int numericChoice);
                if (numericChoice > 0 && numericChoice < allowedGroups.Count + 1)
                {
                    RecentlySelectedTileGrouping = allowedGroups[numericChoice - 1];
                    var action = RecentlySelectedTileGrouping.IsTriplet() ? TurnAction.FormTriplet :
                                 (RecentlySelectedTileGrouping.IsQuad() ? TurnAction.FormQuad :
                                  (RecentlySelectedTileGrouping.IsSequence() ? TurnAction.FormSequence : TurnAction.Pass));
                    return(action);
                }
                WriteUnrecognizedInputText();
            }
        }
Ejemplo n.º 4
0
        public bool CanClaimDiscardedTileToCompleteGroup(Tile discardedTile, bool canBeSequence)
        {
            var potentialHandTiles = new List <Tile>(Hand.UncalledTiles)
            {
                discardedTile
            };
            var groupsInvolvingDiscardedTile = TileGrouper.FindAllGroupsInTiles(potentialHandTiles)
                                               .Where(group => group.Contains(discardedTile)).ToList();

            if (!canBeSequence)
            {
                groupsInvolvingDiscardedTile = groupsInvolvingDiscardedTile.Where(group => !group.IsSequence()).ToList();
            }

            return(groupsInvolvingDiscardedTile.Count > 0);
        }
Ejemplo n.º 5
0
        public IList <TileGrouping> GetAllGroupsThatCanBeMadeWithDiscardedTile(Tile discardedTile, bool canBeSequence)
        {
            var potentialHandTiles = new List <Tile>(Hand.UncalledTiles)
            {
                discardedTile
            };
            var groupsInvolvingDiscardedTile = TileGrouper.FindAllGroupsInTiles(potentialHandTiles)
                                               .Where(group => group.Contains(discardedTile)).ToList();

            if (!canBeSequence)
            {
                groupsInvolvingDiscardedTile = groupsInvolvingDiscardedTile.Where(group => !group.IsSequence()).ToList();
            }

            return(groupsInvolvingDiscardedTile);
        }
Ejemplo n.º 6
0
        public override bool IsClaimingDiscardedTileToCompleteGroup(Tile discardedTile, bool canBeSequence)
        {
            if (!CanClaimDiscardedTileToCompleteGroup(discardedTile, canBeSequence))
            {
                return(false);
            }
            var potentialHandTiles = new List <Tile>(Hand.UncalledTiles)
            {
                discardedTile
            };
            var groupsInvolvingDiscardedTile = TileGrouper.FindAllGroupsInTiles(potentialHandTiles)
                                               .Where(group => group.Contains(discardedTile)).ToList();

            if (!canBeSequence)
            {
                groupsInvolvingDiscardedTile = groupsInvolvingDiscardedTile.Where(group => !group.IsSequence()).ToList();
            }

            while (true)
            {
                WriteOptionChoiceIntroductoryText();
                for (int i = 0; i < groupsInvolvingDiscardedTile.Count; i++)
                {
                    Console.WriteLine($"\t{i + 1}. Claim the discarded {discardedTile} to make: " +
                                      $"[{groupsInvolvingDiscardedTile[i]}].");
                }
                Console.WriteLine("\tP: [P]ass.");
                var choice = TakeInputAsLowercase();
                if (choice == "p")
                {
                    return(false);
                }
                int.TryParse(choice, out int numericChoice);
                if (numericChoice > 0 && numericChoice <= groupsInvolvingDiscardedTile.Count)
                {
                    return(true);
                }
                WriteUnrecognizedInputText();
            }
        }
Ejemplo n.º 7
0
        public IList <IList <TileGrouping> > FindAllWaysToParseWinningHand()
        {
            var allWaysToSplitTiles = TileGrouper.FindAllWaysToGroupTilesAfterRemovingAPair(UncalledTiles);

            if (IsThirteenOrphans(UncalledTiles, CalledSets))
            {
                allWaysToSplitTiles.Add(new List <TileGrouping> {
                    new TileGrouping(UncalledTiles.ToArray())
                });
            }
            if (IsSevenPairs(UncalledTiles, CalledSets))
            {
                allWaysToSplitTiles.Add(new List <TileGrouping> {
                    new TileGrouping(UncalledTiles.ToArray())
                });
            }

            var waysToSplitTilesThatUseAllTiles = allWaysToSplitTiles.Where(
                allGroups => allGroups.Sum(t => t.Count()) == UncalledTiles.Count() ||
                allGroups.All(group => group.IsBonus())).ToList();

            return(waysToSplitTilesThatUseAllTiles);
        }
Ejemplo n.º 8
0
        public override TileGrouping GetClosedOrPromotedQuadMade()
        {
            var closedQuads = TileGrouper.FindAllGroupsInTiles(Hand.UncalledTiles)
                              .Where(group => group.IsQuad()).ToList();
            var promotedQuads = new List <TileGrouping>(Hand.CalledSets.Where(
                                                            group => group.IsTriplet() && Hand.UncalledTiles.Contains(group.First())));
            var allQuads = closedQuads.Concat(promotedQuads).ToList();

            while (true)
            {
                WriteOptionChoiceIntroductoryText();
                for (int i = 0; i < closedQuads.Count; i++)
                {
                    Console.WriteLine($"\t{i + 1}. Create a closed quad with the four " +
                                      $"{closedQuads[i].First()} tiles in your hand.");
                }
                for (int i = 0; i < promotedQuads.Count; i++)
                {
                    Console.WriteLine($"\t{i + closedQuads.Count() + 1}. Create a promoted quad with the " +
                                      $"{promotedQuads[i].First()} tile in your hand.");
                }
                Console.WriteLine($"\tP: [P]ass.");

                var choice = TakeInputAsLowercase();
                if (choice == "p")
                {
                    return(null);
                }

                int.TryParse(choice, out int numericChoice);
                if (numericChoice > 0 && numericChoice < allQuads.Count + 1)
                {
                    return(allQuads[numericChoice - 1]);
                }
                WriteUnrecognizedInputText();
            }
        }