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); }
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); }
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); }
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); }
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); }
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); } }
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"); }