Ejemplo n.º 1
0
 private static bool IsDaisangen(HoraPattern hp)
 {
     return(hp.WithoutHeadTartsuList.Count(e => MJUtil.IsDragonPai(e.TartsuStartPaiSyu)) == 3);
 }
Ejemplo n.º 2
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));
        }