Beispiel #1
0
        /// <summary>
        /// タンヤオ分析要求の受信処理を実行します。
        /// </summary>
        /// <returns>タンヤオ分析応答</returns>
        /// <param name="request">タンヤオ分析要求</param>
        public AnalyzeYakuResponse Receive(AnalyzeYakuRequest request)
        {
            var response = DiProvider.GetContainer().GetInstance <AnalyzeYakuResponse>();

            response.Yaku = Yaku.AllSimples;
            var context = request.WinHandsContext;

            // 雀頭
            if (!IsAllSimpleRange(context.Head.GetNumber()))
            {
                return(response);
            }
            // 順子(シュンツ)
            if (context.Chows.Count() > 0)
            {
                var isValidChows = context.Chows
                                   .All(t => IsAllSimpleRangeForChows(t.GetNumber()));
                if (!isValidChows)
                {
                    return(response);
                }
            }
            // 刻子(コーツ)と槓子(カンツ)
            if (context.PungsAndKongs.Count() > 0)
            {
                var isValidPungs = context.PungsAndKongs
                                   .All(t => IsAllSimpleRange(t.GetNumber()));
                if (!isValidPungs)
                {
                    return(response);
                }
            }
            response.HasCompleted = true;
            return(response);
        }
        /// <summary>
        /// 平和(ピンフ)分析要求の受信処理を実行します。
        /// </summary>
        /// <returns>平和(ピンフ)分析応答</returns>
        /// <param name="request">平和(ピンフ)分析要求</param>
        public AnalyzeYakuResponse Receive(AnalyzeYakuRequest request)
        {
            var response = DiProvider.GetContainer().GetInstance <AnalyzeYakuResponse>();
            var room     = request.Room;

            response.Yaku = Yaku.AllSequenceHand;
            var context = request.WinHandsContext;

            // 4面子が順子(連番で揃えた面子)
            if (!(context.Chows.Count() >= 4 && context.PungsAndKongs.Count() <= 0))
            {
                return(response);
            }

            // 頭は役牌(三元牌、場風牌、自風牌)以外
            var windKind = context.Head.GetKind();

            if (Tile.IsDragons(context.Head) ||
                EqualsWind(windKind, room.Round) ||
                EqualsWind(windKind, request.WinWind))
            {
                return(response);
            }

            // 和了牌の待ち方は両面待ち
            var win         = request.WinTile;
            var isBothSides = context.Chows.Any(chow => chow.GetKind() == win.GetKind() && (chow.GetNumber() + 1) == win.GetNumber());

            if (!isBothSides)
            {
                return(response);
            }
            response.HasCompleted = true;
            return(response);
        }
        /// <summary>
        /// 七対子(チートイツ)分析要求の受信処理を実行します。
        /// </summary>
        /// <returns>七対子(チートイツ)分析応答</returns>
        /// <param name="request">七対子(チートイツ)分析要求</param>
        public AnalyzeYakuResponse Receive(AnalyzeYakuRequest request)
        {
            var response = DiProvider.GetContainer().GetInstance <AnalyzeYakuResponse>();
            var room     = request.Room;

            response.Yaku = Yaku.SevenPairs;
            var context = request.WinHandsContext;

            // 対子が7つある
            response.HasCompleted = context.Pairs.Count() == 7;
            return(response);
        }
Beispiel #4
0
        /// <summary>
        /// 一盃口(イーペイコー)分析要求の受信処理を実行します。
        /// </summary>
        /// <returns>一盃口(イーペイコー)分析応答</returns>
        /// <param name="request">一盃口(イーペイコー)分析要求</param>
        public AnalyzeYakuResponse Receive(AnalyzeYakuRequest request)
        {
            var response = DiProvider.GetContainer().GetInstance <AnalyzeYakuResponse>();
            var room     = request.Room;

            response.Yaku = Yaku.TwoIdenticalSequences;
            var context = request.WinHandsContext;
            // 同じ順子(連番で揃えた面子)が2つある
            var exists = context.Chows
                         .GroupBy(c => new { kind = c.GetKind(), num = c.GetNumber() })
                         .Select(c => new { Count = c.Count() })
                         .Any(c => c.Count == 2);

            response.HasCompleted = exists;
            return(response);
        }