示例#1
0
    /*
     * // 流局满贯 //
     * public static void SetNagashiMangan(AgariInfo agariInfo)
     * {
     * agariInfo.han = 5;
     * agariInfo.fu = 30;
     * agariInfo.scoreInfo = GetScoreInfo(5, 30);
     *
     * agariInfo.hanteiYakus = new YakuHelper.YakuHandler[]
     * {
     *  new YakuHelper.CheckNagashimangan(null)
     * };
     * }
     */

    // 符を計算します
    public static int CalculateHu(Tehai tehai, Hai addHai, HaiCombi combi, AgariParam param, Yaku yaku)
    {
        int countHu = 20;

        //頭の牌を取得
        Hai atamaHai = new Hai(Hai.NumKindToID(combi.atamaNumKind));

        // 3元牌なら2符追加
        if (atamaHai.Kind == Hai.KIND_SANGEN)
        {
            countHu += 2;
        }

        // 場風なら2符追加
        if ((atamaHai.ID - Hai.ID_TON) == (int)param.getBakaze())
        {
            countHu += 2;
        }

        // 自風なら2符追加
        if ((atamaHai.ID - Hai.ID_TON) == (int)param.getJikaze())
        {
            countHu += 2;
        }

        //平和が成立する場合は、待ちによる2符追加よりも優先される
        if (yaku.checkPinfu() == false)
        {
            // 単騎待ちの場合2符追加
            if (addHai.NumKind == combi.atamaNumKind)
            {
                countHu += 2;
            }

            // 嵌張待ちの場合2符追加
            // 数牌の2~8かどうか判定
            if (addHai.IsYaochuu == false)
            {
                for (int i = 0; i < combi.shunCount; i++)
                {
                    if ((addHai.NumKind - 1) == combi.shunNumKinds[i])
                    {
                        countHu += 2;
                    }
                }
            }

            // 辺張待ち(3)の場合2符追加
            if (addHai.IsYaochuu == false && addHai.Num == Hai.NUM_3)
            {
                for (int i = 0; i < combi.shunCount; i++)
                {
                    if ((addHai.NumKind - 2) == combi.shunNumKinds[i])
                    {
                        countHu += 2;
                    }
                }
            }

            // 辺張待ち(7)の場合2符追加
            if (addHai.IsYaochuu == false && addHai.Num == Hai.NUM_7)
            {
                for (int i = 0; i < combi.shunCount; i++)
                {
                    if (addHai.NumKind == combi.shunNumKinds[i])
                    {
                        countHu += 2;
                    }
                }
            }
        }

        // 暗刻による加点
        Hai checkHai = null;

        for (int i = 0; i < combi.kouCount; i++)
        {
            checkHai = new Hai(Hai.NumKindToID(combi.kouNumKinds[i]));

            // 牌が字牌もしくは1,9
            if (checkHai.IsYaochuu == true)
            {
                countHu += 8;
            }
            else
            {
                countHu += 4;
            }
        }


        Fuuro[] fuuros = tehai.getFuuros();

        for (int i = 0; i < fuuros.Length; i++)
        {
            switch (fuuros[i].Type)
            {
            case EFuuroType.MinKou:
            {
                // 牌が字牌もしくは1,9
                if (fuuros[i].Hais[0].IsYaochuu == true)
                {
                    countHu += 4;
                }
                else
                {
                    countHu += 2;
                }
            }
            break;

            case EFuuroType.KaKan:
            case EFuuroType.DaiMinKan:
            {
                // 牌が字牌もしくは1,9
                if (fuuros[i].Hais[0].IsYaochuu == true)
                {
                    countHu += 16;
                }
                else
                {
                    countHu += 8;
                }
            }
            break;

            case EFuuroType.AnKan:
            {
                // 牌が字牌もしくは1,9
                if (fuuros[i].Hais[0].IsYaochuu == true)
                {
                    countHu += 32;
                }
                else
                {
                    countHu += 16;
                }
            }
            break;
            }
        }

        // ツモ上がりで平和が成立していなければ2譜追加
        if (param.getYakuFlag(EYakuFlagType.TSUMO) == true)
        {
            if (yaku.checkPinfu() == false)
            {
                countHu += 2;
            }
        }

        // 面前ロン上がりの場合は10符追加
        if (param.getYakuFlag(EYakuFlagType.TSUMO) == false)
        {
            if (yaku.isNaki == false)
            {
                countHu += 10;
            }
        }

        // 一の位がある場合は、切り上げ
        if (countHu % 10 != 0)  // 23 -> 30.
        {
            countHu = countHu - (countHu % 10) + 10;
        }

        return(countHu);
    }