Beispiel #1
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);
        }
Beispiel #2
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);
 }
Beispiel #3
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);
        }
Beispiel #4
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;
 }
Beispiel #5
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;
 }
Beispiel #6
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;
        }
Beispiel #7
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);
        }
Beispiel #8
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));
        }