Пример #1
0
        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));
        }
Пример #2
0
        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));
        }
Пример #3
0
        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;
        }
Пример #4
0
        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)));
        }
Пример #5
0
        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))));
        }
Пример #6
0
        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);
            }
        }
Пример #7
0
        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));
        }
Пример #8
0
        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);
        }
Пример #9
0
        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);
        }