Example #1
0
        /// <summary>
        /// 手牌が国士無双かどうか
        /// </summary>
        /// <returns>国士無双か</returns>
        bool IsKokushi()
        {
            // 幺九牌のリスト
            int[] yaotiles = { 1, 9, 11, 19, 21, 29, 31, 32, 33, 34, 35, 36, 37 };

            HandTiles tmp_tiletypes = new HandTiles(this);

            for (int i = 0; i < yaotiles.Length; i++)
            {
                if (tmp_tiletypes[yaotiles[i]] >= 1)
                {
                    tmp_tiletypes[yaotiles[i]]--;
                }
                else
                {
                    return(false);
                }
            }

            for (int i = 0; i < yaotiles.Length; i++)
            {
                if (tmp_tiletypes[yaotiles[i]] >= 1)
                {
                    return(true);
                }
            }

            return(false);
        }
Example #2
0
        /// <summary>
        /// 他のクラスを元に作成する
        /// </summary>
        /// <param name="t">元になるクラス</param>
        public HandTiles(HandTiles t)
        {
            for (int i = 0; i < t.tiletypes.Length; i++)
            {
                tiletypes[i] = t.tiletypes[i];
            }

            LastTile = t.LastTile;
        }
Example #3
0
        /// <summary>
        /// あがれる手牌か
        /// </summary>
        /// <returns>あがれるか</returns>
        public bool IsWinningHand()
        {
            HandTiles tmp_tiletypes = new HandTiles(this);

            if (IsZeroAllTiles())
            {
                return(false);
            }

            // 七対子判定
            for (int i = 1; i < 38; i++)
            {
                if (tmp_tiletypes[i] >= 2)
                {
                    tmp_tiletypes[i] -= 2;
                    i--;
                }
            }
            if (tmp_tiletypes.IsZeroAllTiles())
            {
                return(true);
            }

            // 国士無双判定
            tmp_tiletypes = new HandTiles(this);
            if (tmp_tiletypes.IsKokushi())
            {
                return(true);
            }

            for (int i = 1; i < 38; i++)
            {
                // 初期化
                tmp_tiletypes = new HandTiles(this);

                // 頭雀を含むか
                if (tmp_tiletypes[i] >= 2)
                {
                    tmp_tiletypes[i] -= 2;

                    for (int j = 1; j < 38; j++)
                    {
                        // 刻子を含むか
                        if (tmp_tiletypes[j] >= 3)
                        {
                            tmp_tiletypes[j] -= 3;

                            j = 1;
                        }
                    }

                    for (int j = 1; j < 38; j++)
                    {
                        // 順子を含むか
                        if (tmp_tiletypes.ContainsChow((TileNames)j))
                        {
                            tmp_tiletypes[j]--;
                            tmp_tiletypes[j + 1]--;
                            tmp_tiletypes[j + 2]--;

                            j = 1;
                        }
                    }

                    if (tmp_tiletypes.IsZeroAllTiles())
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }