Ejemplo n.º 1
0
        private static bool IsRyuiso(HoraPattern hp)
        {
            var greenCount = 0;

            foreach (var tartsu in hp.TartsuList)
            {
                if (tartsu.TartsuType == MJUtil.TartsuType.ANSYUN ||
                    tartsu.TartsuType == MJUtil.TartsuType.MINSYUN)
                {
                    if (MJUtil.IsGreenInSyuntsu(tartsu.TartsuStartPaiSyu))
                    {
                        greenCount++;
                    }
                }
                else
                {
                    if (MJUtil.IsGreenPai(tartsu.TartsuStartPaiSyu))
                    {
                        greenCount++;
                    }
                }
            }

            return(greenCount == 5);
        }
Ejemplo n.º 2
0
        private static bool IsHonnitsu(HoraPattern hp)
        {
            var hasManzu = false;
            var hasPinzu = false;
            var hasSouzu = false;
            var hasJi    = false;

            foreach (var tartsu in hp.TartsuList)
            {
                if (MJUtil.IsJihaiPai(tartsu.TartsuStartPaiSyu))
                {
                    hasJi |= true;
                }
                else
                {
                    var div = tartsu.TartsuStartPaiSyu / MJUtil.LENGTH_SYU_NUMBERS;
                    hasManzu |= (div == 0);
                    hasPinzu |= (div == 1);
                    hasSouzu |= (div == 2);
                }
            }
            var isOneColor = (hasManzu && !hasPinzu && !hasSouzu) ||
                             (!hasManzu && hasPinzu && !hasSouzu) ||
                             (!hasManzu && !hasPinzu && hasSouzu);

            return(isOneColor && hasJi);
        }
Ejemplo n.º 3
0
        private static bool IsHonnitsu(int[] horaSyu)
        {
            var hasManzu = false;
            var hasPinzu = false;
            var hasSouzu = false;
            var hasJi    = false;

            foreach (var syu in horaSyu.Select((val, index) => new { val, index }))
            {
                if (syu.val == 0)
                {
                    continue;
                }
                if (MJUtil.IsJihaiPai(syu.index))
                {
                    hasJi |= true;
                    continue;
                }
                var div = syu.index / MJUtil.LENGTH_SYU_NUMBERS;
                hasManzu |= (div == 0);
                hasPinzu |= (div == 1);
                hasSouzu |= (div == 2);
            }
            var isOnecolor = (hasManzu && !hasPinzu && !hasSouzu) ||
                             (!hasManzu && hasPinzu && !hasSouzu) ||
                             (!hasManzu && !hasPinzu && hasSouzu);

            return(isOnecolor && hasJi);
        }
Ejemplo n.º 4
0
        private static bool IsChinnitsu(int[] horaSyu)
        {
            var hasManzu = false;
            var hasPinzu = false;
            var hasSouzu = false;

            foreach (var syu in horaSyu.Select((val, index) => new { val, index }))
            {
                if (syu.val == 0)
                {
                    continue;
                }
                if (MJUtil.IsJihaiPai(syu.index))
                {
                    return(false);
                }
                var div = syu.index / MJUtil.LENGTH_SYU_NUMBERS;
                hasManzu |= (div == 0);
                hasPinzu |= (div == 1);
                hasSouzu |= (div == 2);
            }
            return((hasManzu && !hasPinzu && !hasSouzu) ||
                   (!hasManzu && hasPinzu && !hasSouzu) ||
                   (!hasManzu && !hasPinzu && hasSouzu));
        }
Ejemplo n.º 5
0
        private static bool IsPinfu(HoraPattern hp, InfoForResult ifr)
        {
            int headSyu = hp.Head.TartsuStartPaiSyu;

            //頭が役牌でないか判定
            if (ifr.IsBafuu(headSyu) || ifr.IsJifuu(headSyu) || MJUtil.IsDragonPai(headSyu))
            {
                return(false);
            }

            //門前順子またはロン和了明順メンツではない場合ピンフではない
            foreach (var tartsu in hp.WithoutHeadTartsuList)
            {
                if (((tartsu.IsAnsyun()) || (tartsu.IsMinsyun() && tartsu.IsRonedTartsu)) == false)
                {
                    return(false);
                }
            }

            //リャンメン待ちか判定
            int lastAddedSyu = ifr.GetLastAddedSyu();

            foreach (var tartsu in hp.WithoutHeadTartsuList)
            {
                if ((tartsu.TartsuStartPaiSyu == lastAddedSyu) && (lastAddedSyu % 9 != 6) ||
                    (tartsu.TartsuStartPaiSyu == lastAddedSyu - 2) && (lastAddedSyu % 9 != 2))
                {
                    return(true);
                }
            }
            return(false);
        }
Ejemplo n.º 6
0
 private static bool IsHonroto(int[] horaSyu)
 {
     foreach (var syu in horaSyu.Select((val, index) => new { val, index }).Where(e => e.val > 0))
     {
         if (MJUtil.IsYaochuPai(syu.index) == false)
         {
             return(false);
         }
     }
     return(true);
 }
Ejemplo n.º 7
0
        private static bool IsChinroto(HoraPattern hp)
        {
            if (hp.TartsuList.Count(e => e.TartsuType == MJUtil.TartsuType.ANSYUN ||
                                    e.TartsuType == MJUtil.TartsuType.MINSYUN)
                > 0)
            {
                return(false);
            }

            return(hp.TartsuList.Count(e => MJUtil.IsRotoPai(e.TartsuStartPaiSyu)) == 5);
        }
Ejemplo n.º 8
0
 private static bool IsTsuiso(int[] horaSyu)
 {
     foreach (var syu in horaSyu.Select((val, index) => new { val, index }).Where(syu => syu.val > 0))
     {
         if (MJUtil.IsJihaiPai(syu.index) == false)
         {
             return(false);
         }
     }
     return(true);
 }
Ejemplo n.º 9
0
 public bool IsYaochuTartsu()
 {
     if (IsAnsyun() || IsMinsyun())
     {
         //1か7から始まる順子の場合true
         return((TartsuStartPaiSyu % 9) == 0 || (TartsuStartPaiSyu % 9) == 6);
     }
     else
     {
         return(MJUtil.IsYaochuPai(TartsuStartPaiSyu));
     }
 }
Ejemplo n.º 10
0
        public bool IsDora(int syu)
        {
            //リーチしてたら裏ドラも考慮
            var targetDoraOmote = MJUtil.GetDoraOmote(syu);

            if (IsReach)
            {
                return(uradoraMarkerList.Contains(targetDoraOmote) || doraMarkerList.Contains(targetDoraOmote));
            }

            //リーチしてない場合は表ドラだけ考慮
            return(doraMarkerList.Contains(targetDoraOmote));
        }
Ejemplo n.º 11
0
 private static bool IsYakuhai(HoraPattern hp, InfoForResult ifr)
 {
     foreach (var tartsu in hp.WithoutHeadTartsuList)
     {
         if (ifr.IsJifuu(tartsu.TartsuStartPaiSyu) ||
             ifr.IsBafuu(tartsu.TartsuStartPaiSyu) ||
             MJUtil.IsDragonPai(tartsu.TartsuStartPaiSyu)
             )
         {
             return(true);
         }
     }
     return(false);
 }
Ejemplo n.º 12
0
        private static bool IsHonroto(HoraPattern hp)
        {
            foreach (var tartsu in hp.TartsuList)
            {
                if (tartsu.TartsuType == MJUtil.TartsuType.ANSYUN || tartsu.TartsuType == MJUtil.TartsuType.MINSYUN)
                {
                    return(false);
                }

                if (MJUtil.IsYaochuPai(tartsu.TartsuStartPaiSyu) == false)
                {
                    return(false);
                }
            }
            return(true);
        }
Ejemplo n.º 13
0
        private static bool IsShosangen(HoraPattern hp)
        {
            if (MJUtil.IsDragonPai(hp.Head.TartsuStartPaiSyu) == false)
            {
                return(false);
            }

            var doragonCount = 0;

            foreach (var tartsu in hp.WithoutHeadTartsuList)
            {
                if (MJUtil.IsDragonPai(tartsu.TartsuStartPaiSyu))
                {
                    doragonCount++;
                }
            }

            //頭が三元牌かつ三元牌ターツが2つ以上ある場合
            return(doragonCount >= 2);
        }
Ejemplo n.º 14
0
 private static bool IsJunChanta(HoraPattern hp)
 {
     foreach (var tartsu in hp.TartsuList)
     {
         if (tartsu.TartsuType == MJUtil.TartsuType.ANSYUN || tartsu.TartsuType == MJUtil.TartsuType.MINSYUN)
         {
             if ((tartsu.TartsuStartPaiSyu % 9 == 0) || (tartsu.TartsuStartPaiSyu % 9 == 6))
             {
                 continue;
             }
         }
         else
         {
             if (MJUtil.IsYaochuPai(tartsu.TartsuStartPaiSyu))
             {
                 continue;
             }
         }
         return(false);
     }
     return(true);
 }
Ejemplo n.º 15
0
        private static int CalcYakuhaiNum(HoraPattern hp, InfoForResult ifr)
        {
            int yakuhaiNum = 0;

            //TODO
            foreach (var tartsu in hp.WithoutHeadTartsuList)
            {
                //ダブ東、ダブ南の場合があるので自風と場風は独立に判定する
                if (ifr.IsJifuu(tartsu.TartsuStartPaiSyu))
                {
                    yakuhaiNum++;
                }
                if (ifr.IsBafuu(tartsu.TartsuStartPaiSyu))
                {
                    yakuhaiNum++;
                }
                if (MJUtil.IsDragonPai(tartsu.TartsuStartPaiSyu))
                {
                    yakuhaiNum++;
                }
            }
            return(yakuhaiNum);
        }
Ejemplo n.º 16
0
 private static bool IsShosushi(HoraPattern hp)
 {
     return(MJUtil.IsWindPai(hp.Head.TartsuStartPaiSyu) &&
            hp.WithoutHeadTartsuList.Count(e => MJUtil.IsWindPai(e.TartsuStartPaiSyu)) == 3);
 }
Ejemplo n.º 17
0
 private static bool IsDaisangen(HoraPattern hp)
 {
     return(hp.WithoutHeadTartsuList.Count(e => MJUtil.IsDragonPai(e.TartsuStartPaiSyu)) == 3);
 }
Ejemplo n.º 18
0
 public Tartsu(MJUtil.TartsuType tt, int tartsuStartPaiSyu, bool isRoned)
 {
     this.TartsuType = tt;
     this.TartsuStartPaiSyu = tartsuStartPaiSyu;
     this.IsRonedTartsu = isRoned;
 }
Ejemplo n.º 19
0
 private static bool IsDaisushi(HoraPattern hp)
 {
     return(hp.WithoutHeadTartsuList.Count(e => MJUtil.IsWindPai(e.TartsuStartPaiSyu)) == 4);
 }
Ejemplo n.º 20
0
 private static bool IsTsuiso(HoraPattern hp)
 {
     return(hp.TartsuList.Count(e => MJUtil.IsJihaiPai(e.TartsuStartPaiSyu)) == 5);
 }
Ejemplo n.º 21
0
        private static int CalcFu(HoraPattern horaMentsu, Field field, InfoForResult ifpc)
        {
            int fuSum = 0;
            int futei = 20;

            fuSum += futei;

            //門前ロンの場合
            if (ifpc.IsMenzen && (!ifpc.IsTsumo))
            {
                fuSum += 10;
            }

            //頭が役牌の場合
            int headSyuId = horaMentsu.TartsuList.Where(e => e.IsHead()).First().TartsuStartPaiSyu;

            if (ifpc.IsBafuu(headSyuId))
            {
                fuSum += 2;
            }
            if (ifpc.IsJifuu(headSyuId))
            {
                fuSum += 2;
            }
            if (MJUtil.IsDragonPai(headSyuId))
            {
                fuSum += 2;
            }

            //ツモの場合
            if (ifpc.IsTsumo)
            {
                fuSum += 2;
            }


            int multiple;

            foreach (var tartsu in horaMentsu.TartsuList)
            {
                if (tartsu.IsYaochuTartsu())
                {
                    multiple = 2;
                }
                else
                {
                    multiple = 1;
                }

                switch (tartsu.TartsuType)
                {
                case MJUtil.TartsuType.MINKO:
                    fuSum += 2 * multiple;
                    continue;

                case MJUtil.TartsuType.ANKO:
                    fuSum += 4 * multiple;
                    continue;

                case MJUtil.TartsuType.MINKANTSU:
                    fuSum += 8 * multiple;
                    continue;

                case MJUtil.TartsuType.ANKANTSU:
                    fuSum += 16 * multiple;
                    continue;
                }
            }

            int lastAddedSyu = ifpc.GetLastAddedSyu();

            //待ちによる符加算
            //単騎待ちの場合
            if (horaMentsu.Head.IsRonedTartsu)
            {
                fuSum += 2;
            }
            else
            {
                //カンチャンorペンチャンの場合
                for (int i = 1; i < horaMentsu.TartsuList.Count; i++)
                {
                    if ((horaMentsu.TartsuList[i].IsAnsyun() || horaMentsu.TartsuList[i].IsMinsyun()) == false)
                    {
                        continue;
                    }
                    //順子前提
                    if (lastAddedSyu == horaMentsu.TartsuList[i].TartsuStartPaiSyu + 1)  //カンチャン
                    {
                        fuSum += 2;
                        break;
                    }
                    else if ((lastAddedSyu == horaMentsu.TartsuList[i].TartsuStartPaiSyu) && (lastAddedSyu % 9 == 6))    //7待ちの89ペンチャン
                    {
                        fuSum += 2;
                        break;
                    }
                    else if ((lastAddedSyu == horaMentsu.TartsuList[i].TartsuStartPaiSyu + 2) && (lastAddedSyu % 9 == 2))    //3待ちの12ペンチャン
                    {
                        fuSum += 2;
                        break;
                    }
                }
            }


            //喰い平和系の場合そのまま計算すると20符だが、ルール的にピンフ以外は最低30符のため2符足して30符に切り上げる
            if ((fuSum == 20) && (ifpc.IsMenzen == false))
            {
                fuSum += 2;
            }

            return((int)(Math.Ceiling(fuSum / 10.0) * 10));
        }
Ejemplo n.º 22
0
 public Tartsu(MJUtil.TartsuType tt, int tartsuStartPaiSyu)
 {
     this.TartsuType = tt;
     this.TartsuStartPaiSyu = tartsuStartPaiSyu;
 }