public static void testGang() { string init = "1万,2万,2万,2万,3万,4万,4筒,4筒"; string guiStr = "1万"; List <int> cards = MaJiangDef.stringToCards(init); List <int> gui = MaJiangDef.stringToCards(guiStr); int[] remain = new int[43] { 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1 }; bool canGang = gangAI(cards, gui, MaJiangDef.stringToCard("2万"), 1.0d); bool canDynamicPeng = AICommonDynamic.gangAI(cards, gui, MaJiangDef.stringToCard("2万"), 1.0d, remain); if (canGang != canDynamicPeng) { Console.WriteLine("[testGang] test failed ! "); } cards = new List <int> { 6, 8, 9, 11, 12, 13, 19, 20, 21, 25, 25 }; gui = new List <int> { 23 }; canGang = gangAI(cards, gui, 21, 1.0d); canDynamicPeng = AICommonDynamic.gangAI(cards, gui, 21, 1.0d, remain); Console.WriteLine(string.Format("[testGang] canGang = {0}", canGang)); }
public static void testPeng() { string init = "1万,2万,2万,1条,1条,2筒,4筒,4筒"; string guiStr = "1万"; List <int> cards = MaJiangDef.stringToCards(init); List <int> gui = MaJiangDef.stringToCards(guiStr); int[] remain = new int[43] { 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1 }; bool canPeng = pengAI(cards, gui, MaJiangDef.stringToCard("2万"), 0.0d); bool canDynamicPeng = AICommonDynamic.pengAI(cards, gui, MaJiangDef.stringToCard("2万"), 0.0d, remain); if (canPeng != canDynamicPeng) { Console.WriteLine("[testPeng] test failed ! "); } Console.WriteLine(string.Format("[testPeng] canPeng = {0}", canPeng)); }
public static void testOut() { string init = "1万,2万,2万,1条,1条,东"; string guiStr = "1万"; List <int> cards = MaJiangDef.stringToCards(init); List <int> gui = MaJiangDef.stringToCards(guiStr); int[] remain = new int[43] { 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1 }; List <int> bannedCards = new List <int>(); int outRet; int outDynamicRet; //outRet = outAI(cards, gui, remain, bannedCards); //outDynamicRet = AICommonDynamic.outAI(cards, gui, remain, bannedCards); //if (outRet != outDynamicRet) // Console.WriteLine("[testOut] test failed ! "); //Console.WriteLine(MaJiangDef.cardToString(outRet)); cards = new List <int> { 8, 13, 18, 18, 18, 20, 24, 24, 27, 27, 29, 29, 30, 31 }; gui = new List <int> { 11 }; //outRet = outAI(cards, gui, remain, bannedCards); outDynamicRet = AICommonDynamic.outAI(cards, gui, remain, bannedCards); int a = 1; }
public static void testHu() { string init = "1万,1万"; string gui = "1万"; List <int> cards = MaJiangDef.stringToCards(init); Console.WriteLine(HuUtil.isHu(cards, MaJiangDef.stringToCard(gui))); }
public static void testTing() { string init = "1万,1万,1筒,3筒,2筒,2条,3条,4条,东,东"; string gui = "1筒"; List <int> cards = MaJiangDef.stringToCards(init); Console.WriteLine(MaJiangDef.cardsToString(HuUtil.isTing(cards, MaJiangDef.stringToCard(gui)))); Console.WriteLine(MaJiangDef.cardsToString(HuUtil.isTingExtra(cards, MaJiangDef.stringToCards(gui)))); }
private static void testHu() { List <int> total = new List <int>(); for (int i = MaJiangDef.WAN1; i <= MaJiangDef.JIAN_BAI; i++) { total.Add(i); total.Add(i); total.Add(i); total.Add(i); } //Collections.shuffle(total); List <int> cards = new List <int>(); for (int i = 0; i < 14; i++) { int tmp = total[0]; total.RemoveAt(0); cards.Add(tmp); } cards.Sort(); Console.WriteLine("before " + MaJiangDef.cardsToString(cards)); List <int> gui = new List <int>(); int step = 0; int[] remain = new int[43] { 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1 }; List <int> bannedCards = new List <int>(); while (total.Count != 0) { if (HuUtil.isHuExtra(cards, gui, 0)) { cards.Sort(); Console.WriteLine("after " + MaJiangDef.cardsToString(cards)); Console.WriteLine("step " + step); break; } step++; int outRet = outAI(cards, gui, remain, bannedCards); cards.Remove((int)outRet); int tmp = total[0]; total.RemoveAt(0); cards.Add(tmp); } }
public static void testChi() { string init = "1万,2万,2万,1条,1条,1筒,2筒,4筒,4筒,5筒"; string guiStr = "1万"; List <int> cards = MaJiangDef.stringToCards(init); List <int> gui = MaJiangDef.stringToCards(guiStr); int[] remain = new int[43] { 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1 }; bool canChi = chiAI(cards, gui, MaJiangDef.stringToCard("3筒"), MaJiangDef.stringToCard("2筒"), MaJiangDef.stringToCard("4筒")); bool canDynamicChi = AICommonDynamic.chiAI(cards, gui, MaJiangDef.stringToCard("3筒"), MaJiangDef.stringToCard("2筒"), MaJiangDef.stringToCard("4筒"), remain); if (canChi != canDynamicChi) { Console.WriteLine("[testChi] test failed 1 ! "); } Console.WriteLine(string.Format("[testChi] canPeng = {0}", canChi)); List <int> chiCards = chiAI(cards, gui, MaJiangDef.stringToCard("3筒")); List <int> dynamicChiCards = AICommonDynamic.chiAI(cards, gui, MaJiangDef.stringToCard("3筒"), remain); if (chiCards.Count != dynamicChiCards.Count) { Console.WriteLine("[testChi] test failed 3 ! "); } for (int i = 0; i < chiCards.Count; ++i) { if (chiCards[i] != dynamicChiCards[i]) { Console.WriteLine("[testChi] test failed 2 ! "); } } Console.WriteLine(MaJiangDef.cardsToString(chiCards)); }
public static List <int> isTingCard(List <int> cards, int guiNum) { long wan_key = 0; long tong_key = 0; long tiao_key = 0; long feng_key = 0; long jian_key = 0; for (int i = MaJiangDef.WAN1; i <= MaJiangDef.WAN9; i++) { int num = cards[i - 1]; wan_key = wan_key * 10 + num; } for (int i = MaJiangDef.TONG1; i <= MaJiangDef.TONG9; i++) { int num = cards[i - 1]; tong_key = tong_key * 10 + num; } for (int i = MaJiangDef.TIAO1; i <= MaJiangDef.TIAO9; i++) { int num = cards[i - 1]; tiao_key = tiao_key * 10 + num; } for (int i = MaJiangDef.FENG_DONG; i <= MaJiangDef.FENG_BEI; i++) { int num = cards[i - 1]; feng_key = feng_key * 10 + num; } for (int i = MaJiangDef.JIAN_ZHONG; i <= MaJiangDef.JIAN_BAI; i++) { int num = cards[i - 1]; jian_key = jian_key * 10 + num; } List <int> tmpType = new List <int>(); List <List <HuTableInfo> > tmpTing = new List <List <HuTableInfo> >(); List <List <HuTableInfo> > tmp = new List <List <HuTableInfo> >(); List <HuTableInfo> wanHuTableInfo = new List <HuTableInfo>(); if (HuTable.table.ContainsKey(wan_key)) { wanHuTableInfo = HuTable.table[wan_key]; } else { return(new List <int>()); } tmpTing.Add(wanHuTableInfo); if (wan_key != 0) { tmpType.Add(MaJiangDef.TYPE_WAN); tmp.Add(wanHuTableInfo); } List <HuTableInfo> tongHuTableInfo = new List <HuTableInfo>(); if (HuTable.table.ContainsKey(tong_key)) { tongHuTableInfo = HuTable.table[tong_key]; } else { return(new List <int>()); } tmpTing.Add(tongHuTableInfo); if (tong_key != 0) { tmpType.Add(MaJiangDef.TYPE_TONG); tmp.Add(tongHuTableInfo); } List <HuTableInfo> tiaoHuTableInfo = new List <HuTableInfo>(); if (HuTable.table.ContainsKey(tiao_key)) { tiaoHuTableInfo = HuTable.table[tiao_key]; } else { return(new List <int>()); } tmpTing.Add(tiaoHuTableInfo); if (tiao_key != 0) { tmpType.Add(MaJiangDef.TYPE_TIAO); tmp.Add(tiaoHuTableInfo); } List <HuTableInfo> fengHuTableInfo = new List <HuTableInfo>(); if (HuTable.table.ContainsKey(feng_key)) { fengHuTableInfo = HuTable.table[feng_key]; } else { return(new List <int>()); } tmpTing.Add(fengHuTableInfo); if (feng_key != 0) { tmpType.Add(MaJiangDef.TYPE_FENG); tmp.Add(fengHuTableInfo); } List <HuTableInfo> jianHuTableInfo = new List <HuTableInfo>(); if (HuTable.table.ContainsKey(jian_key)) { jianHuTableInfo = HuTable.table[jian_key]; } else { return(new List <int>()); } tmpTing.Add(jianHuTableInfo); if (jian_key != 0) { tmpType.Add(MaJiangDef.TYPE_JIAN); tmp.Add(jianHuTableInfo); } List <int> ret = new List <int>(); for (int type = MaJiangDef.TYPE_WAN; type <= MaJiangDef.TYPE_JIAN; type++) { List <HuTableInfo> huTableInfos = tmpTing[type - 1]; int[] cache = new int[9]; foreach (HuTableInfo huTableInfo in huTableInfos) { if (huTableInfo.hupai != null && huTableInfo.needGui <= guiNum) { bool cached = true; for (int j = 0; j < huTableInfo.hupai.Length; j++) { if (huTableInfo.hupai[j] > 0 && cache[j] == 0) { cached = false; break; } } if (!cached && isTingHuTableInfo(tmpType, tmp, 0, guiNum - huTableInfo.needGui, huTableInfo.jiang, type)) { for (int j = 0; j < huTableInfo.hupai.Length; j++) { if (huTableInfo.hupai[j] > 0) { if (cache[j] == 0) { ret.Add(MaJiangDef.toCard(type, j)); } cache[j]++; } } } } } } return(ret); }
public static List <int> chiAI(List <int> input, List <int> guiCard, int card) { List <int> ret = new List <int>(); if (guiCard.Contains(card)) { return(ret); } double score = calc(input, guiCard); double scoreNewMax = 0; int card1 = 0; int card2 = 0; if (getHasCount(input, card - 2) > 0 && getHasCount(input, card - 1) > 0 && MaJiangDef.type(card) == MaJiangDef.type(card - 2) && MaJiangDef.type(card) == MaJiangDef.type(card - 1)) { List <int> tmp = new List <int>(input); tmp.Remove((int)(card - 2)); tmp.Remove((int)(card - 1)); double scoreNew = calc(tmp, guiCard); if (scoreNew > scoreNewMax) { scoreNewMax = scoreNew; card1 = card - 2; card2 = card - 1; } } if (getHasCount(input, card - 1) > 0 && getHasCount(input, card + 1) > 0 && MaJiangDef.type(card) == MaJiangDef.type(card - 1) && MaJiangDef.type(card) == MaJiangDef.type(card + 1)) { List <int> tmp = new List <int>(input); tmp.Remove((int)(card - 1)); tmp.Remove((int)(card + 1)); double scoreNew = calc(tmp, guiCard); if (scoreNew > scoreNewMax) { scoreNewMax = scoreNew; card1 = card - 1; card2 = card + 1; } } if (getHasCount(input, card + 1) > 0 && getHasCount(input, card + 2) > 0 && MaJiangDef.type(card) == MaJiangDef.type(card + 1) && MaJiangDef.type(card) == MaJiangDef.type(card + 2)) { List <int> tmp = new List <int>(input); tmp.Remove((int)(card + 1)); tmp.Remove((int)(card + 2)); double scoreNew = calc(tmp, guiCard); if (scoreNew > scoreNewMax) { scoreNewMax = scoreNew; card1 = card + 1; card2 = card + 2; } } if (scoreNewMax > score) { ret.Add(card1); ret.Add(card2); } return(ret); }