鞍山麻将基本胡牌算法

鞍山麻将基本胡牌算法
鞍山麻将基本胡牌算法using System.Collections.Generic;using System.Linq;using static WebFirst.Api.Game.RoomData;namespace WebFirst.Api.Game.anShanMJ{public class PlayRules{public static int getFanShuPingHu() { var rtn 0; return rtn; } public static int getFanShuQingYiSe(anShan_GuiZe guiZe) { var rtn guiZe.fengDing; return rtn; } public static int getFanShuQuanShun(anShan_GuiZe guize) { var rtn 1; return rtn; } public static bool IsCanHU(Listint mah, int ID, UserActor am, out int fanshu, out ListFanModel listfanmodel, anShanMJRoom anShanRoom) { Listint pais new Listint(mah); listfanmodel new ListFanModel(); fanshu 0; pais.Add(ID); //先排序 pais.Sort(); return IsCanHU(pais, am, out fanshu, out listfanmodel, anShanRoom); } private static bool HuPaiPanDin(Listint mahs, ref bool yaojiu, ref bool quanjiang, ref bool isYouKeZi, ref int keZiCount) { if (mahs.Count 0) { return true; } Listint fs mahs.FindAll(delegate (int a) { return mahs[0] a; }); //组成克子 if (fs.Count 3) { if (!yaojiu) { if ((mahs[0] % 10 1 || mahs[0] % 10 9) mahs[0] 30)//如果已经是 幺九 才判断当前牌是否是 幺九 { yaojiu true; } } /* if (quanjiang) { if (mahs[0] % 10 ! 2 mahs[0] % 10 ! 5 mahs[0] % 10 ! 8) { quanjiang false; } }*/ if (!isYouKeZi) { isYouKeZi true; } mahs.Remove(mahs[0]); mahs.Remove(mahs[0]); mahs.Remove(mahs[0]); keZiCount; return HuPaiPanDin(mahs, ref yaojiu, ref quanjiang, ref isYouKeZi, ref keZiCount); } else { //组成顺子 // quanjiang false; if (mahs.Contains(mahs[0] 1) mahs.Contains(mahs[0] 2)) { if (!yaojiu)//如果已经是 幺九 才判断当前牌是否是 幺九 { if ((mahs[0] % 10 1 || (mahs[0] 2) % 10 9) mahs[0] 30) { yaojiu true; } } mahs.Remove(mahs[0] 2); mahs.Remove(mahs[0] 1); mahs.Remove(mahs[0]); return HuPaiPanDin(mahs, ref yaojiu, ref quanjiang, ref isYouKeZi, ref keZiCount); } return false; } } public static bool IsCanHU(Listint mah, UserActor tempuser, out int fanshu, out ListFanModel listfanmodel, anShanMJRoom anShanRoom) { Listint pais new Listint(mah); pais.Sort(); var yaojiu true; var quanjiang true; bool isYouKeZi false; listfanmodel new ListFanModel(); fanshu 0; { FanModel fanModel1 new FanModel(); fanModel1.fanshu 0; fanshu fanModel1.fanshu;//穷胡番数 fanModel1.fanname 平胡; listfanmodel.Add(fanModel1); } var listUserPgPai tempuser._ListUserPengGang.Where(d d.zhigangtype 0 || d.zhigangtype 1 || d.zhigangtype 3 || d.zhigangtype 6).SelectMany(d d.listpenggangpai).ToList();if (listUserPgPai.Count 0) { var fmodelMenQing new FanModel(); fmodelMenQing.fanshu 1; fanshu fmodelMenQing.fanshu;// fmodelMenQing.fanname 站立; listfanmodel.Add(fmodelMenQing); } var listUserPgPaiAll tempuser._ListUserPengGang.Where(d d.zhigangtype 0 || d.zhigangtype 1 || d.zhigangtype 3 || d.zhigangtype 6 || d.zhigangtype 9).SelectMany(d d.listpenggangpai).ToList();if (tempuser._ListPai.Count(d anShanRoom._listHunZi.Contains(d)) 0 listUserPgPaiAll.Count(d anShanRoom._listHunZi.Contains(d)) 0){FanModel fanModel1 new FanModel(); fanModel1.fanshu 1; fanshu fanModel1.fanshu;//穷胡番数 fanModel1.fanname 穷胡; listfanmodel.Add(fanModel1); } var listallpai new Listint(); var listallgen new Listint(); var listPengGangDian tempuser._ListPengGang.Distinct().ToList(); for (int i 0; i listPengGangDian.Count; i) { var listTempPengGang tempuser._ListPengGang.Where(x x listPengGangDian[i]).ToList(); if (listTempPengGang.Count 3)//只有碰的加上手牌 够4个才算四归一杠出去的不算 { listallpai.AddRange(listTempPengGang); } } listallpai.AddRange(pais.ToList()); var isShangQiangTou false; for (int i 0; i listallpai.Count; i) { if (listallpai.Count(d d listallpai[i]) 4) { if (listallgen.Count(d d listallpai[i]) 0) { listallgen.Add(listallpai[i]); } } else if (listallpai[i] anShanRoom._hunZi listallpai.Count(d d listallpai[i]) 3) { isShangQiangTou true; /*if (listallgen.Count(d d listallpai[i]) 0) { listallgen.Add(listallpai[i]); }*/ } } if (listallgen.Count 0) { fanshu listallgen.Count;//名楼番数 var fmodelminglou new FanModel(); fmodelminglou.fanshu listallgen.Count; fmodelminglou.fanname 四归一; listfanmodel.Add(fmodelminglou); } if (isShangQiangTou) { fanshu 1;//名楼番数 var fmodelminglou new FanModel(); fmodelminglou.fanshu 1; fmodelminglou.fanname 上墙头; listfanmodel.Add(fmodelminglou); } var shiSanPais new Listint { 1, 9, 11, 19, 21, 29, 31, 33, 35, 37, 41, 43, 45 }; if (pais.All(d shiSanPais.Any(x d x)) listUserPgPai.All(d shiSanPais.Any(x d x))) { FanModel fanModel2 new FanModel(); fanModel2.fanshu 1; fanshu fanModel2.fanshu;//穷胡番数 fanModel2.fanname 十三幺; listfanmodel.Add(fanModel2); return true; } var listAllPai listUserPgPai.ToList(); listAllPai.AddRange(tempuser._ListPai); var isQuanZiPai true; if (shiSanPais.Count(d !listAllPai.Contains(d)) 0) { isQuanZiPai false; } if (isQuanZiPai) { FanModel fanModel2 new FanModel(); fanModel2.fanshu 1; fanshu fanModel2.fanshu;//穷胡番数 fanModel2.fanname 十三幺; listfanmodel.Add(fanModel2); return true; } /* if (pais.Count(d listHunZi.Contains(d)) 0 listUserPgPai.Count(d listHunZi.Contains(d)) 0) {*/ if (tempuser.wxId anShanRoom.zhuangjiawxid) { var fanModelZhuang new FanModel(); fanModelZhuang.fanshu 1; fanshu fanModelZhuang.fanshu;//穷胡番数 fanModelZhuang.fanname 庄家; listfanmodel.Add(fanModelZhuang); } /* }*/ if (tempuser._isGangMo) { var fmodelminglou new FanModel(); fmodelminglou.fanshu 1; fanshu fmodelminglou.fanshu;//杠上花番数 fmodelminglou.fanname 杠上花;//杠上花 2番 穷胡 1番 listfanmodel.Add(fmodelminglou); } //清一色 #region 清一色 var listpaitype new Listint(); var listPGPai tempuser._ListUserPengGang.Where(d d.zhigangtype 0 || d.zhigangtype 1 || d.zhigangtype 3 || d.zhigangtype 6 || d.zhigangtype 9).SelectMany(d d.listpenggangpai).ToList(); for (int i 0; i listPGPai.Count; i) { if (listPGPai[i] 0 listPGPai[i] 10) { listpaitype.Add(1); } else if (listPGPai[i] 10 listPGPai[i] 20) { listpaitype.Add(2); } else if (listPGPai[i] 20 listPGPai[i] 30) { listpaitype.Add(3); } else if (listPGPai[i] 30) { //字牌 listpaitype.Add(4); } } for (int i 0; i mah.Count; i) { if (mah[i] 10) { listpaitype.Add(1); } else if (mah[i] 10 mah[i] 20) { listpaitype.Add(2); } else if (mah[i] 20 mah[i] 30) { listpaitype.Add(3); } else if (mah[i] 30) { listpaitype.Add(4); } } if (listpaitype.Distinct().Count() 1) {//清一色加2番 var fmodeljingou new FanModel(); fmodeljingou.fanshu 1; fanshu fmodeljingou.fanshu; fmodeljingou.fanname 清一色; listfanmodel.Add(fmodeljingou); } /* else if (listpaitype.Distinct().Count() 2 listpaitype.Contains(4)) { var fmodeljingou new FanModel(); fmodeljingou.fanshu 1; fanshu fmodeljingou.fanshu; fmodeljingou.fanname 混一色; listfanmodel.Add(fmodeljingou); }*/ #endregion #region 三叉 var linshipais pais.ToList(); /* var keZiCount 0; var linshipaisDis linshipais.Distinct().ToList(); for (int i 0; i linshipaisDis.Count; i) { Listint dslinshi linshipais.FindAll(delegate (int d) { return linshipaisDis[i] d; }); if (dslinshi.Count 3) { keZiCount; } }*/ var listPg tempuser._ListUserPengGang.Where(d d.zhigangtype 0 || d.zhigangtype 1 || d.zhigangtype 3 || d.zhigangtype 6 || d.zhigangtype 9).ToList(); #endregion var renresult false; var listYaoJiu new Listint() { 1, 9, 11, 19, 21, 29, 31, 33, 35, 37, 41, 43, 45 }; //只有两张牌 #region 手把一 if (pais.Count 2) { if (listPg.Count(d d.zhigangtype 0 || d.zhigangtype 1 || d.zhigangtype 3 || d.zhigangtype 9) 4) { var fmodeljingou new FanModel(); fmodeljingou.fanshu 1; fanshu fmodeljingou.fanshu; fmodeljingou.fanname 飘胡; listfanmodel.Add(fmodeljingou); } if (listPg.Count(d d.zhigangtype 0 || d.zhigangtype 1 || d.zhigangtype 3 || d.zhigangtype 9) 3) { var fmodeljingou new FanModel(); fmodeljingou.fanshu 1; fanshu fmodeljingou.fanshu; fmodeljingou.fanname 三叉; listfanmodel.Add(fmodeljingou); } if ((listPg.Count(d d.zhigangtype 6) 0) (listpaitype.Distinct().Count(d d 4) 2) || listpaitype.Distinct().Count() 2) { return renresult; } if (tempuser._ListUserPengGang.Count(d d.zhigangtype 9) 0) { var fmodeljingou new FanModel(); fmodeljingou.fanshu anShanMJRoom.getFanShuDaDiaoChe(); fanshu fmodeljingou.fanshu; fmodeljingou.fanname 手把一; listfanmodel.Add(fmodeljingou); } if (pais[0] 30 (pais[0] % 10 2 || pais[0] % 10 8)) { var fmodeljingou new FanModel(); fmodeljingou.fanshu 1; fanshu fmodeljingou.fanshu; fmodeljingou.fanname 二八将; listfanmodel.Add(fmodeljingou); } var listKeZiZFB tempuser._ListUserPengGang.Where(d (d.zhigangtype 0 || d.zhigangtype 1 || d.zhigangtype 3) (d.pai 41 d.pai 45)).ToList(); if (listKeZiZFB.Count 0) { var fmodeljingou new FanModel(); fmodeljingou.fanshu listKeZiZFB.Count; fanshu fmodeljingou.fanshu; fmodeljingou.fanname 大哥大; listfanmodel.Add(fmodeljingou); } return pais[0] pais[1]; } #endregion var qiduidian 0; //先给七对胡拿出来 if (XueZhanMjRoom.isqidui(pais, out qiduidian)) { #region 七对 var isLongQiDui false; /* for (int i 0; i pais.Count; i) { if (pais.Count(d d pais[i]) 4) { isLongQiDui true; } }*/ if (isLongQiDui) { var fmodel new FanModel(); fmodel.fanshu new XueZhanMjRoom().getFanShuLongQiDui(); fanshu fmodel.fanshu; fmodel.fanname 龙七对; listfanmodel.Add(fmodel); listfanmodel.RemoveAll(d d.fanname.Contains(四归一)); fanshu listfanmodel.Sum(d d.fanshu); } else { var fmodel new FanModel(); fmodel.fanshu new XueZhanMjRoom().getFanShuQiDui(); fanshu fmodel.fanshu; fmodel.fanname 七对; listfanmodel.Add(fmodel); } renresult true; return renresult; #endregion } #region 其他牌型胡牌 //先排序 pais.Sort(); //依据牌的顺序从左到右依次分出将牌 for (int i 0; i pais.Count; i) { Listint paiT new Listint(pais); Listint ds pais.FindAll(delegate (int d) { return pais[i] d; }); //判断是否能做将牌 if (ds.Count 2) { quanjiang false; yaojiu false; //移除两张将牌 paiT.Remove(pais[i]); paiT.Remove(pais[i]); //避免重复运算 将光标移到其他牌上 i ds.Count - 1; if ((pais[i] % 10 1 || pais[i] % 10 9) pais[i] 30) { yaojiu true; } if ((pais[i] % 10 2 || pais[i] % 10 8) pais[i] 30) { quanjiang true; } var keZiCount 0; if (HuPaiPanDin(paiT, ref yaojiu, ref quanjiang, ref isYouKeZi, ref keZiCount)) { if (listPg.Count(d d.zhigangtype 0 || d.zhigangtype 1 || d.zhigangtype 3 || d.zhigangtype 9) keZiCount 4) { var fmodeljingou new FanModel(); fmodeljingou.fanshu 1; fanshu fmodeljingou.fanshu; fmodeljingou.fanname 飘胡; listfanmodel.Add(fmodeljingou); } if (listPg.Count(d d.zhigangtype 0 || d.zhigangtype 1 || d.zhigangtype 3 || d.zhigangtype 9) keZiCount 3) { var fmodeljingou new FanModel(); fmodeljingou.fanshu 1; fanshu fmodeljingou.fanshu; fmodeljingou.fanname 三叉; listfanmodel.Add(fmodeljingou); } if (tempuser._ListPai.Count 2) { if ((listpaitype.Distinct().Count(d d 4) 2) listfanmodel.Count(d d.fanname.Contains(飘胡)) 0) { return false; } } renresult true; if (quanjiang) { var fmodeljingou new FanModel(); fmodeljingou.fanshu 1; fanshu fmodeljingou.fanshu; fmodeljingou.fanname 二八将; listfanmodel.Add(fmodeljingou); } var listKeZiZFB tempuser._ListUserPengGang.Where(d (d.zhigangtype 0 || d.zhigangtype 1 || d.zhigangtype 3) (d.pai 41 d.pai 45)).ToList(); var listZFBDian new Listint { 41, 43, 45 }; var shouPaiZFBCount 0; foreach (var item in listZFBDian) { var curDianCount tempuser._ListPai.Count(d d item); if (curDianCount 3) { shouPaiZFBCount 1; } } if (listKeZiZFB.Count shouPaiZFBCount 0) { var fmodeljingou new FanModel(); fmodeljingou.fanshu listKeZiZFB.Count shouPaiZFBCount; fanshu fmodeljingou.fanshu; fmodeljingou.fanname 大哥大; listfanmodel.Add(fmodeljingou); } var isZhongFaBaiDui false; if (listZFBDian.Contains(pais[i])) { isZhongFaBaiDui true; } var isYaoJiu false; if (pais.Count(d listYaoJiu.Contains(d)) 0 || listPGPai.Count(d listYaoJiu.Contains(d)) 0) { isYaoJiu true; } if (tempuser._ListUserPengGang.Count(d d.zhigangtype 9) 0) { isYaoJiu true; isYouKeZi true; } if (listfanmodel.Count(d d.fanname.Contains(飘胡) || d.fanname.Contains(清一色)) 0 (!isYaoJiu || listpaitype.Distinct().Count(d d 4) 2 || (!isYouKeZi !isZhongFaBaiDui tempuser._ListUserPengGang.Count(d d.zhigangtype 0 || d.zhigangtype 1 || d.zhigangtype 3 || d.zhigangtype 9) 0))) { renresult false; } return renresult; } } } return renresult; #endregion } }}