Ejemplo n.º 1
0
        private async Task computeHand(CommandContext ctx, string hand, string options)
        {
            var basicHand    = HandParser.GetSimpleHand(hand);
            var handEmoji    = HandParser.GetHandEmojiCodes(hand, ctx.Client);
            var optionsEmoji = options == "all"
                ? handEmoji
                : HandParser.GetHandEmojiCodes(options, ctx.Client);

            try
            {
                await ctx.Message.DeleteAsync();
            }
            catch
            {
                // do nothing
            }

            var    hand34      = C.one_line_string_to_34_array(basicHand);
            string suitOrder   = U.getSuitOrder(basicHand);
            var    shantenCalc = new ShantenCalculator();
            int    shanten     = -2;
            var    nbTiles     = hand34.Sum();

            if (nbTiles == 13 || nbTiles == 14)
            {
                shanten = shantenCalc.Calculate_shanten(hand34);
            }
            StringBuilder sb = new();

            sb.AppendLine($"<@!{ctx.User.Id}>: {GetHandMessage(handEmoji)}  {getShanten(shanten)}\n");
            var divider = new HandDivider();
            var results = divider.divide_hand(hand34);

            int i = 1;

            foreach (var result in results)
            {
                var hand136 = C.from_34_indices_to_136_arrays(result);
                var setsStr = hand136.Select(set => C.to_one_line_string(set));
                IEnumerable <string> orderedSetStr = new List <string>();
                foreach (var chr in suitOrder)
                {
                    orderedSetStr = orderedSetStr.Concat(setsStr.Where(x => x.Contains(chr)));
                }
                sb.AppendLine($"{i}:{string.Join(",", orderedSetStr.Select(x => $"{GetHandMessage(HandParser.GetHandEmojiCodes(x, ctx.Client))}"))}\n");
                i++;
            }
            var message = await ctx.Channel.SendMessageAsync(sb.ToString());

            {
                foreach (var emoji in optionsEmoji)
                {
                    await message.CreateReactionAsync(emoji);
                }
            }
        }
Ejemplo n.º 2
0
        //
        //         Method to convert one line string tiles format to the 136 array, like
        //         "123s456p789m11222z". 's' stands for sou, 'p' stands for pin,
        //         'm' stands for man and 'z' or 'h' stands for honor.
        //         You can pass r or 0 instead of 5 for it to become a red five from
        //         that suit. To prevent old usage without red,
        //         has_aka_dora has to be True for this to do that.
        //
        public static int[] one_line_string_to_136_array(string str, bool has_aka_dora = false)
        {
            var sou         = "";
            var pin         = "";
            var man         = "";
            var honors      = "";
            var split_start = 0;

            foreach (var _tup_1 in str.Select((_p_1, _p_2) => Tuple.Create(_p_2, _p_1)))
            {
                var index  = _tup_1.Item1;
                var i      = _tup_1.Item2;
                var length = index - split_start;
                var subStr = str.Substring(split_start, length);
                if (i == 'm')
                {
                    man        += subStr;
                    split_start = index + 1;
                }
                if (i == 'p')
                {
                    pin        += subStr;
                    split_start = index + 1;
                }
                if (i == 's')
                {
                    sou        += subStr;
                    split_start = index + 1;
                }
                if (i == 'z' || i == 'h')
                {
                    honors     += subStr;
                    split_start = index + 1;
                }
            }
            return(TilesConverter.string_to_136_array(sou, pin, man, honors, has_aka_dora));
        }
Ejemplo n.º 3
0
 public override string ToString()
 {
     return($"Type: {this.type}, Tiles: {TilesConverter.to_one_line_string(this.tiles)} {this.tiles}");
 }
Ejemplo n.º 4
0
        private async Task computeHandWithAgari(CommandContext ctx, string hand, string agari)
        {
            var    basicHand  = HandParser.GetSimpleHand(hand);
            var    basicAgari = HandParser.GetSimpleHand(agari);
            var    handEmoji  = HandParser.GetHandEmojiCodes(hand, ctx.Client);
            string suitOrder  = U.getSuitOrder(basicHand);

            var hand136  = C.one_line_string_to_136_array(basicHand);
            var agari136 = C.one_line_string_to_136_array(basicAgari)[0];

            StringBuilder sb = new();

            sb.AppendLine($"<@!{ctx.User.Id}>: {GetHandMessage(handEmoji)}\n");
            var config = new HandConfig();

            // TSUMO

            config.is_tsumo = true;
            var calculator   = new HandCalculator();
            var result       = calculator.estimate_hand_value(hand136.ToList(), agari136, config: config);
            var handShape136 = C.from_34_indices_to_136_arrays(result.hand);
            var setsStr      = handShape136.Select(set => C.to_one_line_string(set));
            IEnumerable <string> orderedSetStr = new List <string>();

            foreach (var chr in suitOrder)
            {
                orderedSetStr = orderedSetStr.Concat(setsStr.Where(x => x.Contains(chr)));
            }
            sb.AppendLine($"Tsumo:{string.Join(",", orderedSetStr.Select(x => $"{GetHandMessage(HandParser.GetHandEmojiCodes(x, ctx.Client))}"))}");

            sb.AppendLine($"{result.han}han {result.fu}fu");
            foreach (var yaku in result.yaku)
            {
                sb.AppendLine($"{yaku}");
            }
            if (result.cost != null)
            {
                foreach (var yaku in result.cost.Keys)
                {
                    sb.AppendLine($"{yaku}: {result.cost[yaku]}");
                }

                foreach (var detail in result.fu_details)
                {
                    sb.AppendLine($"{detail.Item2}: +{detail.Item1}fu");
                }
            }

            //RON

            config.is_tsumo = false;
            calculator      = new HandCalculator();
            result          = calculator.estimate_hand_value(hand136.ToList(), agari136, config: config);
            handShape136    = C.from_34_indices_to_136_arrays(result.hand);
            setsStr         = handShape136.Select(set => C.to_one_line_string(set));
            orderedSetStr   = new List <string>();
            foreach (var chr in suitOrder)
            {
                orderedSetStr = orderedSetStr.Concat(setsStr.Where(x => x.Contains(chr)));
            }
            sb.AppendLine();
            sb.AppendLine($"Ron:{string.Join(",", orderedSetStr.Select(x => $"{GetHandMessage(HandParser.GetHandEmojiCodes(x, ctx.Client))}"))}");

            sb.AppendLine($"{result.han}han {result.fu}fu");
            foreach (var yaku in result.yaku)
            {
                sb.AppendLine($"{yaku}");
            }

            if (result.cost != null)
            {
                foreach (var cost in result.cost.Keys)
                {
                    sb.AppendLine($"{cost}: {result.cost[cost]}");
                }
            }

            foreach (var detail in result.fu_details)
            {
                sb.AppendLine($"{detail.Item2}: +{detail.Item1}fu");
            }
            var message = await ctx.Channel.SendMessageAsync(sb.ToString());
        }