Beispiel #1
0
    bool checkKokushi()
    {
        //牌の数を調べるための配列 (0番地は使用しない)
        int[] checkId =
        {
            Hai.ID_WAN_1, Hai.ID_WAN_9, Hai.ID_PIN_1, Hai.ID_PIN_9, Hai.ID_SOU_1, Hai.ID_SOU_9,
            Hai.ID_TON,   Hai.ID_NAN,   Hai.ID_SYA,   Hai.ID_PE,    Hai.ID_HAKU,  Hai.ID_HATSU, Hai.ID_CHUN
        };
        int[] countHai = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; //length = 13.

        //手牌のIDを検索する
        for (int i = 0; i < _counterArr.Count; i++)
        {
            for (int j = 0; j < checkId.Length; j++)
            {
                if (Hai.NumKindToID(_counterArr[i].numKind) == checkId[j])
                {
                    countHai[j] = _counterArr[i].count;
                }
            }
        }

        //条件を満たしていれば不成立
        bool atama = false;

        //国士無双が成立しているか調べる(手牌がすべて1.9字牌 すべての1,9字牌を持っている)
        for (int i = 0; i < countHai.Length; i++)
        {
            //0枚の牌があれば不成立
            if (countHai[i] == 0)
            {
                return(false);
            }

            if (countHai[i] > 2)
            {
                return(false);
            }

            if (countHai[i] == 2)
            {
                atama = true;
            }
        }

        return(atama);
    }
Beispiel #2
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);
    }