예제 #1
0
    public int GetAgariScore(Tehai tehai, Hai addHai, EKaze jikaze, AgariParam param = null)
    {
        if (param == null)
        {
            param = AgariParam;
            param.ResetDoraHais();
        }

        param.setBakaze(getBaKaze());
        param.setJikaze(jikaze);

        param.ResetYakuFlags(); // should reset params or create a new.

        if (m_activePlayer.IsReach)
        {
            if (m_activePlayer.IsDoubleReach)
            {
                param.setYakuFlag(EYakuFlagType.DOUBLE_REACH, true);
            }
            else
            {
                param.setYakuFlag(EYakuFlagType.REACH, true);
            }
        }

        if (m_isTsumo)
        {
            param.setYakuFlag(EYakuFlagType.TSUMO, true);

            if (m_isTenhou)
            {
                param.setYakuFlag(EYakuFlagType.TENHOU, true);
            }
            else if (m_isChihou)
            {
                param.setYakuFlag(EYakuFlagType.TIHOU, true);
            }
        }
        else if (m_isRenhou)
        {
            if (getPlayerIndex(jikaze) != OyaIndex)    // only ko can Renhou.
            {
                param.setYakuFlag(EYakuFlagType.RENHOU, true);
            }
        }

        if (m_isTsumo && m_isRinshan)
        {
            param.setYakuFlag(EYakuFlagType.RINSYAN, true);
        }

        if (m_isChanKan)
        {
            param.setYakuFlag(EYakuFlagType.CHANKAN, true);
        }

        if (m_isLast)
        {
            if (m_isTsumo)
            {
                param.setYakuFlag(EYakuFlagType.HAITEI, true);
            }
            else
            {
                param.setYakuFlag(EYakuFlagType.HOUTEI, true);
            }
        }

        if (m_activePlayer.IsIppatsu)
        {
            param.setYakuFlag(EYakuFlagType.IPPATU, true);
        }

        if (GameSettings.UseKuitan)
        {
            param.setYakuFlag(EYakuFlagType.KUITAN, true);
        }

        return(AgariScoreManager.GetAgariScore(tehai, addHai, param, ref m_combis, ref m_agariInfo));
    }
예제 #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);
    }
예제 #3
0
    public static int GetAgariScore(Tehai tehai, Hai addHai, AgariParam param, ref HaiCombi[] combis, ref AgariInfo agariInfo)
    {
        formatWorker.setCounterFormat(tehai, addHai);

        // あがりの組み合わせを取得します
        int combisCount = formatWorker.calculateCombisCount(combis);

        //Debug.Log ("GetAgariScore() combisCount="+combisCount);
        combis = formatWorker.getCombis();

        /*
         * /// 1. check Chiitoitsu(七对子)
         * if( formatWorker.isChiitoitsu() )
         * {
         * Yaku yaku = Yaku.NewYaku_Chiitoitsu(tehai, addHai, param);
         *
         * agariInfo.han = yaku.getHan();
         * agariInfo.fu = 25;
         * agariInfo.hanteiYakus = yaku.getHanteiYakus();
         *
         * agariInfo.scoreInfo = GetScoreInfo(agariInfo.han, agariInfo.fu);
         *
         * return agariInfo.scoreInfo.koAgari;
         * }
         */
        /*
         * /// 2. check Kokushi(国士无双)
         * if( formatWorker.isKokushi() )
         * {
         * Yaku yaku = Yaku.NewYaku_Kokushi(tehai, addHai, param);
         *
         * if( yaku.isKokushi )
         * {
         * agariInfo.han = 13;
         * agariInfo.fu = 20;
         * agariInfo.hanteiYakus = yaku.getHanteiYakus();
         *
         * agariInfo.scoreInfo = GetScoreInfo(agariInfo.han, agariInfo.fu);
         *
         * return agariInfo.scoreInfo.koAgari;
         * }
         *
         * return 0;
         * }
         */
        //return combisCount;

        /// 3. check common combi yaku.
        if (combisCount <= 0)
        {
            return(0);
        }

        int[] hanSuuArr = new int[combisCount];         // 役 計算台數
        //int[] huSuuArr  = new int[combisCount]; // 符
        //int[] scoreArr = new int[combisCount]; // 点数(子のロン上がり)

        int maxAgariScore = 0; // 最大の点数

        for (int i = 0; i < combisCount; i++)
        {
            Yaku yaku = Yaku.NewYaku_Common(tehai, addHai, combis[i], param);
            hanSuuArr[i] = yaku.calculateHanSuu();//計算台數
            //maxAgariScore += hanSuuArr[i];
            //huSuuArr[i] = CalculateHu(tehai, addHai, combis[i], param, yaku);

            //Score scoreInfo = GetScoreInfo(hanSuuArr[i], huSuuArr[i]);

            //scoreArr[i] = scoreInfo.koAgari;

            if (hanSuuArr[i] > maxAgariScore)
            {
                agariInfo.han = hanSuuArr[i];
                //agariInfo.fu = huSuuArr[i];
                agariInfo.hanteiYakus = yaku.getHanteiYakus();

                //agariInfo.scoreInfo = scoreInfo;

                maxAgariScore = hanSuuArr[i];
            }
        }
        //agariInfo.han = maxAgariScore;
        //agariInfo.fu = 0;
        //agariInfo.scoreInfo = GetScoreInfo(5, 30);

        //agariInfo.hanteiYakus = yaku.getHanteiYakus();
        // 最大値を探す
        //maxAgariScore = 0;

        //for(int i = 0; i < combisCount; i++)
        //{
        //    if( scoreArr[i] > maxAgariScore )
        //        maxAgariScore = scoreArr[i];
        //}
        //return maxAgariScore;
        return(combisCount);
    }
    public static int GetAgariScore(Tehai tehai, Hai addHai, AgariParam param, ref HaiCombi[] combis, ref AgariInfo agariInfo)
    {
        formatWorker.setCounterFormat(tehai, addHai);

        // あがりの組み合わせを取得します
        int combisCount = formatWorker.calculateCombisCount(combis);

        combis = formatWorker.getCombis();

        /// 1. check Chiitoitsu(七对子)
        if (formatWorker.isChiitoitsu())
        {
            Yaku yaku = Yaku.NewYaku_Chiitoitsu(tehai, addHai, param);

            agariInfo.han         = yaku.getHan();
            agariInfo.fu          = 25;
            agariInfo.hanteiYakus = yaku.getHanteiYakus();

            agariInfo.scoreInfo = GetScoreInfo(agariInfo.han, agariInfo.fu);

            return(agariInfo.scoreInfo.koAgari);
        }

        /// 2. check Kokushi(国士无双)
        if (formatWorker.isKokushi())
        {
            Yaku yaku = Yaku.NewYaku_Kokushi(tehai, addHai, param);

            if (yaku.isKokushi)
            {
                agariInfo.han         = 13;
                agariInfo.fu          = 20;
                agariInfo.hanteiYakus = yaku.getHanteiYakus();

                agariInfo.scoreInfo = GetScoreInfo(agariInfo.han, agariInfo.fu);

                return(agariInfo.scoreInfo.koAgari);
            }

            return(0);
        }


        /// 3. check common combi yaku.
        if (combisCount <= 0)
        {
            return(0);
        }

        int[] hanSuuArr = new int[combisCount]; // 役
        int[] huSuuArr  = new int[combisCount]; // 符
        int[] scoreArr  = new int[combisCount]; // 点数(子のロン上がり)

        int maxAgariScore = 0;                  // 最大の点数

        for (int i = 0; i < combisCount; i++)
        {
            Yaku yaku = Yaku.NewYaku_Common(tehai, addHai, combis[i], param);
            hanSuuArr[i] = yaku.calculateHanSuu();
            huSuuArr[i]  = CalculateHu(tehai, addHai, combis[i], param, yaku);

            Score scoreInfo = GetScoreInfo(hanSuuArr[i], huSuuArr[i]);

            scoreArr[i] = scoreInfo.koAgari;

            if (scoreArr[i] > maxAgariScore)
            {
                agariInfo.han         = hanSuuArr[i];
                agariInfo.fu          = huSuuArr[i];
                agariInfo.hanteiYakus = yaku.getHanteiYakus();

                agariInfo.scoreInfo = scoreInfo;

                maxAgariScore = scoreArr[i];
            }
        }


        // 最大値を探す
        maxAgariScore = 0;

        for (int i = 0; i < combisCount; i++)
        {
            if (scoreArr[i] > maxAgariScore)
            {
                maxAgariScore = scoreArr[i];
            }
        }

        return(maxAgariScore);
    }