示例#1
0
        static public HupaiState check_dian_hu(ArrayList list, Int64 laizi, Int64 pai)
        {
            HupaiState   flag  = HupaiState.no_hu;
            int          count = 0;
            List <Int64> arr   = new List <Int64>();

            foreach (var item in list)
            {
                arr.Add((Int64)item);
            }

            log.log.trace(new System.Diagnostics.StackFrame(), service.timerservice.Tick, Json.Jsonparser.pack(list));
            if (CheckIsHuByAny(arr, laizi))
            {
                log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "CheckIsHuByAny");
                return(flag);
            }

            arr.Add(pai);
            for (int i = 0; i < arr.Count; i++)
            {
                if (laizi == arr[i])
                {
                    count++;
                }
            }
            if (count >= 2)
            {
                log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "count >= 2");
                return(flag);
            }
            arr.Sort();
            List <Int64> shen_yu = new List <Int64>();
            List <Int64> temp;
            List <Int64> temp2;

            if (count == 0)
            {
                for (int i = arr.Count - 1; i > 0;)
                {
                    temp = new List <Int64>(arr);
                    if (arr[i] == arr[i - 1])
                    {
                        temp.RemoveAt(i);
                        temp.RemoveAt(i - 1);
                        i -= 2;
                        if (checkHupaiTwo(temp))
                        {
                            flag = HupaiState.hard_hu;
                            return(flag);
                        }
                        temp2 = temp;
                        temp2.Reverse();
                        if (checkHupaiTwo(temp2))
                        {
                            flag = HupaiState.hard_hu;
                            return(flag);
                        }
                    }
                    else
                    {
                        i--;
                    }
                }
            }
            else
            {
                temp = new List <Int64>(arr);
                for (int i = arr.Count - 1; i > 0;)
                {
                    temp = new List <Int64>(arr);
                    if (arr[i] == arr[i - 1])
                    {
                        temp.RemoveAt(i);
                        temp.RemoveAt(i - 1);
                        i -= 2;
                        if (checkHupaiTwo(temp))
                        {
                            flag = HupaiState.hard_hu;
                            log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "一");
                            return(flag);
                        }
                        flag = checkHupaiTwoHavelaizi(temp, laizi);
                        if (flag != HupaiState.no_hu)
                        {
                            log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "二");
                            return(flag);
                        }

                        temp2 = temp;
                        temp2.Reverse();
                        flag = checkHupaiTwoHavelaizi(temp2, laizi);
                        if (flag != HupaiState.no_hu)
                        {
                            flag = HupaiState.soft_hu;
                            log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "三");
                            return(flag);
                        }
                    }
                    else
                    {
                        i--;
                    }
                }

                log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "{0}", pai);
                temp = new List <Int64>(arr);
                if (checkHupaiTwo(temp))
                {
                    log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "四");
                    flag = HupaiState.hard_hu;
                }
                flag = checkHupaiTwoHavelaizi(temp, laizi);
                if (flag == HupaiState.no_hu)
                {
                    flag = SubstitutePerCard(arr, laizi, GameCommon.PeopleNum.FourPeople);
                }
            }
            return(flag);
        }
示例#2
0
        static private HupaiState checkHupaiTwoHavelaizi(List <Int64> arr, Int64 laizi)
        {
            HupaiState   type    = HupaiState.no_hu;
            List <Int64> shengyu = new List <Int64>(arr);
            List <Int64> shengyuTwo;

            for (int i = shengyu.Count - 1; i >= 0; i--)
            {
                if (shengyu[i] == laizi)
                {
                    shengyu.RemoveAt(i);
                    break;
                }
            }
            shengyuTwo = new List <Int64>(shengyu);
            TakeOutThreeSame(shengyu);
            TakeOutShunzi(shengyu);


            if (shengyu.Count == 2)
            {
                if (shengyu[1] == shengyu[0])
                {
                    return(HupaiState.soft_hu);
                }
                else
                {
                    if (Math.Abs(shengyu[1] - shengyu[0]) == 1 || ChcekSandwich(shengyu[1], shengyu[0]))
                    {
                        if (CheckIsShunzi(shengyu[0], shengyu[1], laizi))
                        {
                            return(HupaiState.hard_hu);
                        }
                        else
                        {
                            return(HupaiState.soft_hu);
                        }
                    }
                }
            }
            if (shengyu.Count == 1)
            {
                return(HupaiState.soft_hu);
            }

            shengyu = shengyuTwo;
            TakeOutShunzi(shengyu);
            TakeOutThreeSame(shengyu);
            if (shengyu.Count == 2)
            {
                if (shengyu[1] == shengyu[0])
                {
                    return(HupaiState.soft_hu);
                }
                else
                {
                    if (Math.Abs(shengyu[1] - shengyu[0]) == 1 || ChcekSandwich(shengyu[1], shengyu[0]))
                    {
                        if (CheckIsShunzi(shengyu[0], shengyu[1], laizi))
                        {
                            return(HupaiState.hard_hu);
                        }
                        else
                        {
                            return(HupaiState.soft_hu);
                        }
                    }
                }
            }
            if (shengyu.Count == 1)
            {
                return(HupaiState.soft_hu);
            }

            return(type);
        }
示例#3
0
        static private HupaiState SubstitutePerCard(List <Int64> arr, Int64 lai, GameCommon.PeopleNum num)
        {
            HupaiState   flag  = HupaiState.no_hu;
            List <Int64> temp1 = new List <Int64>(arr);

            temp1.Remove(lai);
            int circular_num;

            if (num == GameCommon.PeopleNum.FourPeople)
            {
                circular_num = (int)GameCommon.mjCards.T_9;
            }
            else
            {
                circular_num = (int)GameCommon.mjCards.B_9;
            }
            for (int j = 1; j <= circular_num; j++)
            {
                if (j % 10 != 0)
                {
                    temp1.Add(j);
                    temp1.Sort();
                    for (int i = arr.Count - 1; i > 0;)
                    {
                        List <Int64> temp = new List <Int64>(temp1);
                        if (temp1[i] == temp1[i - 1])
                        {
                            temp.RemoveAt(i);
                            temp.RemoveAt(i - 1);
                            i -= 2;
                            if (checkHupaiTwo(temp))
                            {
                                if (j == lai)
                                {
                                    flag = HupaiState.hard_hu;
                                    log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "五");
                                    return(flag);
                                }
                                else
                                {
                                    flag = HupaiState.soft_hu;
                                    log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "六");
                                    return(flag);
                                }
                            }
                            temp.Reverse();
                            if (checkHupaiTwo(temp))
                            {
                                if (j == lai)
                                {
                                    flag = HupaiState.hard_hu;
                                    log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "七");
                                    return(flag);
                                }
                                else
                                {
                                    flag = HupaiState.soft_hu;
                                    log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "八");
                                    return(flag);
                                }
                            }
                        }
                        else
                        {
                            i--;
                        }
                    }
                    temp1.Remove(j);
                }
            }
            return(flag);
        }
示例#4
0
    private static HupaiState checkHupaiTwoHavelaizi(List <Int64> arr, Int64 laizi)
    {
        HupaiState   type    = HupaiState.no_hu;
        List <Int64> shengyu = new List <Int64>(arr);

        shengyu.Remove(laizi);
        for (int i = shengyu.Count - 1; i >= 2;)
        {
            if (shengyu[i] == arr[i - 1] && shengyu[i] == shengyu[i - 2])
            {
                shengyu.RemoveAt(i);
                shengyu.RemoveAt(i - 1);
                shengyu.RemoveAt(i - 2);
                i -= 3;
            }
            else
            {
                i--;
            }
        }

        bool flag;

        for (int i = shengyu.Count - 1; i >= 2;)
        {
            flag = false;
            if (shengyu[i] == shengyu[i - 1] + 1)
            {
                for (int k = 0; k < i - 1; k++)
                {
                    if (shengyu[i - 1] == shengyu[k] + 1)
                    {
                        shengyu.RemoveAt(i);
                        shengyu.RemoveAt(i - 1);
                        shengyu.RemoveAt(k);
                        i    = shengyu.Count - 1;
                        flag = true;
                        break;
                    }
                }
                if (!flag)
                {
                    i--;
                }
            }
            else
            {
                i--;
            }
        }

        if (shengyu.Count == 2)
        {
            if (shengyu[1] == shengyu[0])
            {
                return(HupaiState.soft_hu);
            }
            else
            {
                if (Math.Abs(shengyu[1] - shengyu[0]) == 1 || ChcekSandwich(shengyu[1], shengyu[0]))
                {
                    if (CheckIsShunzi(shengyu[0], shengyu[1], laizi))
                    {
                        return(HupaiState.hard_hu);
                    }
                    else
                    {
                        return(HupaiState.soft_hu);
                    }
                }
            }
        }
        return(type);
    }
示例#5
0
    public static HupaiState IsHupai(List <Int64> list, Int64 laizi, Int64 mopai)
    {
        HupaiState   flag  = HupaiState.no_hu;
        int          count = 0;
        List <Int64> arr   = new List <Int64>(list);

        if (CheckIsHuByAny(list, laizi))
        {
            return(flag);
        }
        arr.Add(mopai);
        for (int i = 0; i < arr.Count; i++)
        {
            if (laizi == arr[i])
            {
                count++;
            }
        }
        if (count >= 2)
        {
            return(flag);
        }
        arr.Sort();
        List <Int64> shen_yu = new List <Int64>();
        List <Int64> temp;

        if (count == 0)
        {
            for (int i = arr.Count - 1; i > 0;)
            {
                temp = new List <Int64>(arr);
                if (arr[i] == arr[i - 1])
                {
                    temp.RemoveAt(i);
                    temp.RemoveAt(i - 1);
                    i -= 2;
                    if (checkHupaiTwo(temp))
                    {
                        flag = HupaiState.hard_hu;
                        return(flag);
                    }
                }
                else
                {
                    i--;
                }
            }
        }
        else
        {
            temp = new List <Int64>(arr);
            for (int i = arr.Count - 1; i > 0;)
            {
                temp = new List <Int64>(arr);
                if (arr[i] == arr[i - 1])
                {
                    temp.RemoveAt(i);
                    temp.RemoveAt(i - 1);
                    i   -= 2;
                    flag = checkHupaiTwoHavelaizi(temp, laizi);
                    if (flag != HupaiState.no_hu)
                    {
                        return(flag);
                    }
                }
                else
                {
                    i--;
                }
            }

            //赖子必须被配成对子——!
            if (mopai == laizi)
            {
                return(checkHupaiTwoHavelaizi(temp, laizi));
            }
            else
            {
                return(flag);
            }
        }
        return(flag);
    }
示例#6
0
        public static void onRobot(mj_huanghuang_table _table, Int64 site)
        {
            if (!_table.site[site].is_robot)
            {
                return;
            }

            if (_table._hh_state == hh_state.peng)
            {
                if (site != _table.processer)
                {
                    return;
                }

                for (int i = 0; i < 2; i++)
                {
                    _table.player_cards[_table.processer].Remove(_table.processer_card);
                }
                _table.player_peng[_table.processer].Add(_table.processer_card);

                _table.broadcast("mj_huanghuang", "pengpai", _table.processer, _table.processer_card);
                _table.card_righter = _table.processer;
                _table.broadcast("mj_huanghuang", "right", _table.card_righter);

                _table.processer_card = 0;
                _table.play_state     = false;

                robotPlay(_table, site);
            }
            else if (_table._hh_state == hh_state.gang)
            {
                if (site != _table.processer)
                {
                    return;
                }

                if (_table.processer == _table.card_righter)
                {
                    return;
                }

                if (_table.site[_table.processer].is_robot)
                {
                    _table.card_righter = _table.next_card_righter;
                    log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "CheckAndProcessRobotProcess guo");
                    _table.draw();
                }
            }
            else if (_table._hh_state == hh_state.dian_hu)
            {
                if (site != _table.processer)
                {
                    return;
                }

                HupaiState state = mj_huanghuang_check.check_dian_hu(_table.player_cards[_table.processer], _table.laizi, _table.processer_card);
                if (state == HupaiState.no_hu)
                {
                    log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "can not hu");
                    return;
                }

                _table.last_card();

                int rate = 1;
                if (state == HupaiState.hard_hu)
                {
                    rate *= 2;
                }

                Hashtable score = new Hashtable();

                Int64 tmp_score = (Int64)_table.site[_table.play_carder].player_info["base"] * (Int64)_table.site[_table.processer].player_info["base"] * _table.score * rate;
                _table.site[_table.play_carder].player_info["score"] = (Int64)_table.site[_table.play_carder].player_info["score"] - tmp_score;
                _table.site[_table.processer].player_info["score"]   = (Int64)_table.site[_table.processer].player_info["score"] + tmp_score;

                score[_table.site[_table.play_carder].player_info["unionid"]] = 0 - tmp_score;
                score[_table.site[_table.processer].player_info["unionid"]]   = tmp_score;

                if (_table.payRule == (Int64)GameCommon.PayRule.MatchPay)
                {
                    foreach (DictionaryEntry k_v in score)
                    {
                        hub.hub.hubs.call_hub("lobby", "match", "wind_up", hub.hub.name, k_v.Key, k_v.Value);
                    }
                }

                _table.broadcast("mj_huanghuang", "hupai", _table.player_cards[_table.processer], _table.processer_card, _table.processer);

                ArrayList other_pai = new ArrayList();
                Int64     _player   = (Int64)_table.GetNextSite((GameCommon.mjSite)_table.processer);
                while (_player != _table.processer)
                {
                    Hashtable pai_info = new Hashtable();
                    pai_info.Add("player", _player);
                    pai_info.Add("pai", _table.player_cards[_player]);
                    other_pai.Add(pai_info);

                    _player = (Int64)_table.GetNextSite((GameCommon.mjSite)_player);
                }
                _table.broadcast("mj_huanghuang", "otherpai", other_pai);

                _table.broadcast("mj_huanghuang", "huscore", score);

                _table.is_hu          = true;
                _table.hu_player      = _table.processer;
                _table.card_righter   = _table.processer;
                _table.processer_card = 0;
                _table.end_game();
            }
            else if (_table._hh_state == hh_state.hu)
            {
                if (site != _table.card_righter)
                {
                    return;
                }

                if (site != _table.processer)
                {
                    return;
                }

                HupaiState state = mj_huanghuang_check.check_hu(_table.player_cards[_table.card_righter], _table.laizi, _table.processer_card);
                if (state == HupaiState.no_hu)
                {
                    log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "can not hu");
                    return;
                }

                _table.last_card();

                int rate = 1;
                if (state == HupaiState.hard_hu)
                {
                    rate *= 2;
                }

                Hashtable score  = new Hashtable();
                Int64     player = (Int64)_table.GetNextSite((GameCommon.mjSite)_table.card_righter);
                while (player != _table.card_righter)
                {
                    Int64 tmp_score = (Int64)_table.site[player].player_info["base"] * (Int64)_table.site[_table.card_righter].player_info["base"] * _table.score * rate;
                    _table.site[player].player_info["score"] = (Int64)_table.site[player].player_info["score"] - tmp_score;
                    _table.site[_table.card_righter].player_info["score"] = (Int64)_table.site[_table.card_righter].player_info["score"] + tmp_score;

                    score[_table.site[player].player_info["unionid"]] = 0 - tmp_score;
                    if (score[_table.site[_table.card_righter].player_info["unionid"]] == null)
                    {
                        score[_table.site[_table.card_righter].player_info["unionid"]] = (Int64)0;
                    }
                    score[_table.site[_table.card_righter].player_info["unionid"]] = (Int64)score[_table.site[_table.card_righter].player_info["unionid"]] + tmp_score;

                    player = (Int64)_table.GetNextSite((GameCommon.mjSite)player);
                }
                log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "end score :{0}", Json.Jsonparser.pack((Hashtable)score));

                if (_table.payRule == (Int64)GameCommon.PayRule.MatchPay)
                {
                    foreach (DictionaryEntry k_v in score)
                    {
                        hub.hub.hubs.call_hub("lobby", "match", "wind_up", hub.hub.name, k_v.Key, k_v.Value);
                    }
                }

                _table.broadcast("mj_huanghuang", "hupai", _table.player_cards[_table.card_righter], _table.processer_card, _table.card_righter);

                ArrayList other_pai = new ArrayList();
                Int64     _player   = (Int64)_table.GetNextSite((GameCommon.mjSite)_table.card_righter);
                while (_player != _table.card_righter)
                {
                    Hashtable pai_info = new Hashtable();
                    pai_info.Add("player", _player);
                    pai_info.Add("pai", _table.player_cards[_player]);
                    other_pai.Add(pai_info);

                    _player = (Int64)_table.GetNextSite((GameCommon.mjSite)_player);
                }
                _table.broadcast("mj_huanghuang", "otherpai", other_pai);

                _table.broadcast("mj_huanghuang", "huscore", score);

                _table.is_hu          = true;
                _table.hu_player      = _table.card_righter;
                _table.processer_card = 0;
                _table.end_game();
            }
            else
            {
                robotPlay(_table, site);
            }
        }
示例#7
0
        public void hu(Int64 room_id, Int64 pai)
        {
            log.log.trace(new System.Diagnostics.StackFrame(), service.timerservice.Tick, "begin hu");

            mj_huanghuang_table _table = server.tables.get_mj_huanghuang_table(room_id);

            var client_uuid = hub.hub.gates.current_client_uuid;
            var _proxy      = _table.get_player_proxy(client_uuid);

            if (_proxy == null)
            {
                log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "player proxy is null");
                return;
            }
            if (_table.is_hu)
            {
                return;
            }

            if ((Int64)_proxy.player_info["site"] == _table.card_righter)
            {
                log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "check hu {0}", pai);
                HupaiState state = mj_huanghuang_check.check_hu(_table.player_cards[_table.card_righter], _table.laizi, pai);
                if (state == HupaiState.no_hu)
                {
                    log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "can not hu");
                    return;
                }

                _table.last_card();

                log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "begin score");
                int rate = 1;
                log.log.trace(new System.Diagnostics.StackFrame(), service.timerservice.Tick, "rate{0}", rate);
                if (state == HupaiState.hard_hu)
                {
                    rate *= 2;
                    log.log.trace(new System.Diagnostics.StackFrame(), service.timerservice.Tick, "hard_hu rate{0}", rate);
                }

                Hashtable score  = new Hashtable();
                Int64     player = (Int64)_table.GetNextSite((GameCommon.mjSite)_table.card_righter);
                while (player != _table.card_righter)
                {
                    log.log.trace(new System.Diagnostics.StackFrame(), service.timerservice.Tick, "rate{0} player{1} card_righter{2}", rate, (Int64)_table.site[player].player_info["base"], (Int64)_table.site[_table.card_righter].player_info["base"]);

                    Int64 tmp_score = (Int64)_table.site[player].player_info["base"] * (Int64)_table.site[_table.card_righter].player_info["base"] * _table.score * rate;
                    _table.site[player].player_info["score"] = (Int64)_table.site[player].player_info["score"] - tmp_score;
                    _table.site[_table.card_righter].player_info["score"] = (Int64)_table.site[_table.card_righter].player_info["score"] + tmp_score;

                    score[_table.site[player].player_info["unionid"]] = 0 - tmp_score;
                    if (score[_table.site[_table.card_righter].player_info["unionid"]] == null)
                    {
                        score[_table.site[_table.card_righter].player_info["unionid"]] = (Int64)0;
                    }
                    score[_table.site[_table.card_righter].player_info["unionid"]] = (Int64)score[_table.site[_table.card_righter].player_info["unionid"]] + tmp_score;

                    player = (Int64)_table.GetNextSite((GameCommon.mjSite)player);
                }
                log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "end score :{0}", Json.Jsonparser.pack((Hashtable)score));

                if (_table.payRule == (Int64)GameCommon.PayRule.MatchPay)
                {
                    foreach (DictionaryEntry k_v in score)
                    {
                        hub.hub.hubs.call_hub("lobby", "match", "wind_up", hub.hub.name, k_v.Key, k_v.Value);
                    }
                }

                _table.broadcast("mj_huanghuang", "hupai", _table.player_cards[_table.card_righter], pai, _table.card_righter);

                ArrayList other_pai = new ArrayList();
                Int64     _player   = (Int64)_table.GetNextSite((GameCommon.mjSite)_table.card_righter);
                while (_player != _table.card_righter)
                {
                    Hashtable pai_info = new Hashtable();
                    pai_info.Add("player", _player);
                    pai_info.Add("pai", _table.player_cards[_player]);
                    other_pai.Add(pai_info);

                    _player = (Int64)_table.GetNextSite((GameCommon.mjSite)_player);
                }
                _table.broadcast("mj_huanghuang", "otherpai", other_pai);

                _table.broadcast("mj_huanghuang", "huscore", score);

                _table.is_hu          = true;
                _table.hu_player      = _table.card_righter;
                _table.processer_card = 0;
                _table.end_game();
            }
            else if ((Int64)_proxy.player_info["site"] == _table.processer)
            {
                log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "check hu {0}", pai);
                HupaiState state = mj_huanghuang_check.check_dian_hu(_table.player_cards[_table.processer], _table.laizi, pai);
                if (state == HupaiState.no_hu)
                {
                    log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "can not hu");
                    return;
                }

                _table.last_card();

                log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "begin score");
                int rate = 1;
                log.log.trace(new System.Diagnostics.StackFrame(), service.timerservice.Tick, "rate{0}", rate);
                if (state == HupaiState.hard_hu)
                {
                    rate *= 2;
                    log.log.trace(new System.Diagnostics.StackFrame(), service.timerservice.Tick, "hard_hu rate{0}", rate);
                }

                Hashtable score = new Hashtable();

                Int64 tmp_score = (Int64)_table.site[_table.play_carder].player_info["base"] * (Int64)_table.site[_table.processer].player_info["base"] * _table.score * rate;
                _table.site[_table.play_carder].player_info["score"] = (Int64)_table.site[_table.play_carder].player_info["score"] - tmp_score;
                _table.site[_table.processer].player_info["score"]   = (Int64)_table.site[_table.processer].player_info["score"] + tmp_score;

                score[_table.site[_table.play_carder].player_info["unionid"]] = 0 - tmp_score;
                score[_table.site[_table.processer].player_info["unionid"]]   = tmp_score;

                log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "end score :{0}", Json.Jsonparser.pack((Hashtable)score));

                if (_table.payRule == (Int64)GameCommon.PayRule.MatchPay)
                {
                    foreach (DictionaryEntry k_v in score)
                    {
                        hub.hub.hubs.call_hub("lobby", "match", "wind_up", hub.hub.name, k_v.Key, k_v.Value);
                    }
                }

                _table.broadcast("mj_huanghuang", "hupai", _table.player_cards[_table.processer], pai, _table.processer);

                ArrayList other_pai = new ArrayList();
                Int64     _player   = (Int64)_table.GetNextSite((GameCommon.mjSite)_table.processer);
                while (_player != _table.processer)
                {
                    Hashtable pai_info = new Hashtable();
                    pai_info.Add("player", _player);
                    pai_info.Add("pai", _table.player_cards[_player]);
                    other_pai.Add(pai_info);

                    _player = (Int64)_table.GetNextSite((GameCommon.mjSite)_player);
                }
                _table.broadcast("mj_huanghuang", "otherpai", other_pai);

                _table.broadcast("mj_huanghuang", "huscore", score);

                _table.is_hu          = true;
                _table.hu_player      = _table.processer;
                _table.card_righter   = _table.processer;
                _table.processer_card = 0;
                _table.end_game();
            }

            log.log.trace(new System.Diagnostics.StackFrame(), service.timerservice.Tick, "end hu");
        }
        public void draw()
        {
            log.log.trace(new System.Diagnostics.StackFrame(), service.timerservice.Tick, "begin draw");

            log.log.trace(new System.Diagnostics.StackFrame(), service.timerservice.Tick, "card_righter cards count:{0}", player_cards[card_righter].Count);

            if (cards.Count == 0)
            {
                broadcast("mj_huanghuang", "liu_ju");

                ArrayList other_pai = new ArrayList();
                Int64     _player   = card_righter;
                do
                {
                    Hashtable pai_info = new Hashtable();
                    pai_info.Add("player", _player);
                    pai_info.Add("pai", player_cards[_player]);
                    other_pai.Add(pai_info);

                    _player = (Int64)GetNextSite((GameCommon.mjSite)_player);
                } while (_player != card_righter);

                broadcast("mj_huanghuang", "otherpai", other_pai);

                end_game();

                return;
            }

            foreach (Int64 card in player_cards[card_righter])
            {
                processer = (Int64)GetEndSite();
                if (mj_huanghuang_check.check_gang(player_cards[card_righter], player_peng[card_righter], laizipi, card, false, false))
                {
                    log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "gang");
                    processer_card = card;
                    processer      = card_righter;
                    _hh_state      = hh_state.gang;
                    break;
                }
            }

            Int64 c = 0;

            if (!is_robot_room)
            {
                c = draw_normal();
            }
            else
            {
                c = draw_laiyou();
            }
            player_cards[card_righter].Add(c);
            mopai = c;
            log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "摸牌:{0}", mopai);

            if (mj_huanghuang_check.check_gang(player_cards[card_righter], player_peng[card_righter], laizipi, c, true, false))
            {
                log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "gang");
                processer_card = c;
                processer      = card_righter;
                _hh_state      = hh_state.gang;
            }

            HupaiState state = mj_huanghuang_check.check_hu(player_cards[card_righter], laizi, mopai);

            if (state != HupaiState.no_hu)
            {
                log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "hu");
                processer_card = c;
                processer      = card_righter;
                _hh_state      = hh_state.hu;
            }

            if (!site[card_righter].is_robot)
            {
                hub.hub.gates.call_client(site[card_righter].uuid, "mj_huanghuang", "draw", c);
            }

            log.log.trace(new System.Diagnostics.StackFrame(), service.timerservice.Tick, "draw_pai:{0}, cards count:{1}", card_righter, player_cards[card_righter].Count);
            broadcast("mj_huanghuang", "draw_pai", card_righter);

            mopai_state = true;
            play_state  = false;

            log.log.trace(new System.Diagnostics.StackFrame(true), service.timerservice.Tick, "right:{0}", card_righter);
            if (site[card_righter].is_robot)
            {
                if (_hh_state != hh_state.hu)
                {
                    _hh_state = hh_state.none;
                }
                robotUtil.onRobot(this, card_righter);
            }
            else
            {
                if (processer == card_righter)
                {
                    //broadcast("mj_huanghuang", "processer", processer);
                }
                broadcast("mj_huanghuang", "right", card_righter);
            }

            log.log.trace(new System.Diagnostics.StackFrame(), service.timerservice.Tick, "end draw");
        }