Esempio n. 1
0
        public BuyList Clone()
        {
            BuyList clone = new BuyList();
            clone.OpeningBuy1 = this.OpeningBuy1;
            clone.OpeningBuy2 = this.OpeningBuy2;
            clone.List = new List<BuyListItem>();
            for (int i = 0; i < this.List.Count; i++)
            {
                clone.List.Add(new BuyListItem(this.List[i].Card, this.List[i].Count));
            }

            clone.ColonyBuyThreshold = this.ColonyBuyThreshold;
            clone.ProvinceBuyThreshold = this.ProvinceBuyThreshold;
            clone.DuchyBuyThreshold = this.DuchyBuyThreshold;
            clone.EstateBuyThreshold = this.EstateBuyThreshold;
            return clone;
        }
Esempio n. 2
0
        public static void TournamentTest()
        {
            Randomizer.SetRandomSeed(123456789);
            CardModel[] cards = new CardModel[]
            {
                new Chapel(),
                new ShantyTown(),
                new Militia(),
                new Moneylender(),
                new City(),
                new Mint(),
                new Goons(),
                new Hoard(),
                new Nobles(),
                new Expand()
            };
            cards = new CardModel[]
            {
                new Pawn(),
                new Village(),
                new Swindler(),
                new Tournament(),
                new Watchtower(),
                new City(),
                new Duke(),
                new Festival(),
                new Mint(),
                new TradingPost()
            };

            /*
            CardSet cardSet = new TheGoodLife();
            IEnumerable<CardModel> cards = cardSet.CardCollection;

            new Contraband(),
            new CountingHouse(),
            new Hoard(),
            new Monument(),
            new Mountebank(),
            new Bureaucrat(),
            new Cellar(),
            new Chancellor(),
            new Gardens(),
            new Village()
             * */
            //Kingdom kingdom = new Kingdom(cards, null, 2, CardUseType.Use, CardUseType.DoNotUse, StartingHandType.FourThreeSplit);
            Kingdom kingdom = new Kingdom(cards, null, null, GameSets.Any, 2, CardUseType.DoNotUse, CardUseType.DoNotUse, StartingHandType.FourThreeSplit);

            GameModel model = new GameModel();
            using (model.TextLog.SuppressLogging())
            {
                List<BuyList> lists = new List<BuyList>();
                BuyList list = new BuyList();

                list.ProvinceBuyThreshold = 5;
                list.DuchyBuyThreshold = 5;
                list.EstateBuyThreshold = 2;
                list.OpeningBuy1 = typeof(Steward);
                list.OpeningBuy2 = typeof(Steward);
                list.List.Add(new BuyListItem(typeof(Platinum), 1));
                list.List.Add(new BuyListItem(typeof(Colony), 99));
                list.List.Add(new BuyListItem(typeof(Platinum), 99));
                list.List.Add(new BuyListItem(typeof(Mint), 1));
                list.List.Add(new BuyListItem(typeof(Province), 99));
                list.List.Add(new BuyListItem(typeof(Gold), 1));
                list.List.Add(new BuyListItem(typeof(Gold), 99));
                list.List.Add(new BuyListItem(typeof(Silver), 99));
                lists.Add(list);

                list = new BuyList();
                list.ProvinceBuyThreshold = 5;
                list.DuchyBuyThreshold = 5;
                list.EstateBuyThreshold = 2;
                list.OpeningBuy1 = typeof(Steward);
                list.OpeningBuy2 = typeof(Tournament);

                list.List.Add(new BuyListItem(typeof(Platinum), 1));
                list.List.Add(new BuyListItem(typeof(Mint), 1));
                list.List.Add(new BuyListItem(typeof(Tournament), 3));
                list.List.Add(new BuyListItem(typeof(Colony), 99));
                list.List.Add(new BuyListItem(typeof(Platinum), 99));
                list.List.Add(new BuyListItem(typeof(Gold), 1));
                list.List.Add(new BuyListItem(typeof(Province), 99));
                list.List.Add(new BuyListItem(typeof(Gold), 99));
                list.List.Add(new BuyListItem(typeof(Silver), 99));
                lists.Add(list);

                /*
                list.ProvinceBuyThreshold = 2;
                list.DuchyBuyThreshold = 2;
                list.EstateBuyThreshold = 1;
                list.List.Add(new BuyListItem(typeof(Colony), 99));
                list.List.Add(new BuyListItem(typeof(Platinum), 99));
                list.List.Add(new BuyListItem(typeof(Goons), 1));
                list.List.Add(new BuyListItem(typeof(Nobles), 8));
                list.List.Add(new BuyListItem(typeof(Gold), 99));
                list.List.Add(new BuyListItem(typeof(City), 10));
                list.List.Add(new BuyListItem(typeof(Militia), 1));
                list.List.Add(new BuyListItem(typeof(Silver), 1));
                list.List.Add(new BuyListItem(typeof(Chapel), 1));
                list.List.Add(new BuyListItem(typeof(ShantyTown), 7));
                list.List.Add(new BuyListItem(typeof(Silver), 99));
                lists.Add(list);

                list = new BuyList();
                list.ProvinceBuyThreshold = 3;
                list.DuchyBuyThreshold = 2;
                list.EstateBuyThreshold = 0;
                list.List.Add(new BuyListItem(typeof(Militia), 1));
                list.List.Add(new BuyListItem(typeof(Chapel), 1));
                list.List.Add(new BuyListItem(typeof(Goons), 1));
                list.List.Add(new BuyListItem(typeof(City), 8));
                list.List.Add(new BuyListItem(typeof(Nobles), 8));
                list.List.Add(new BuyListItem(typeof(Colony), 99));
                list.List.Add(new BuyListItem(typeof(Expand), 8));

                list.List.Add(new BuyListItem(typeof(Goons), 1));
                list.List.Add(new BuyListItem(typeof(City), 1));
                list.List.Add(new BuyListItem(typeof(Goons), 4));
                list.List.Add(new BuyListItem(typeof(Platinum), 8));
                list.List.Add(new BuyListItem(typeof(City), 1));
                list.List.Add(new BuyListItem(typeof(Goons), 4));
                list.List.Add(new BuyListItem(typeof(Platinum), 99));
                list.List.Add(new BuyListItem(typeof(Province), 99));
                list.List.Add(new BuyListItem(typeof(Gold), 1));
                list.List.Add(new BuyListItem(typeof(Gold), 99));
                list.List.Add(new BuyListItem(typeof(Silver), 99));
                lists.Add(list);
                 * */
                /*
                list = new BuyList();
                list.DuchyBuyThreshold = 5;
                list.EstateBuyThreshold = 3;
                list.List.Add(new BuyListItem(typeof(Platinum), 99));
                list.List.Add(new BuyListItem(typeof(Nobles), 8));
                list.List.Add(new BuyListItem(typeof(Gold), 99));
                list.List.Add(new BuyListItem(typeof(City), 10));
                list.List.Add(new BuyListItem(typeof(Militia), 2));
                list.List.Add(new BuyListItem(typeof(Chapel), 1));
                list.List.Add(new BuyListItem(typeof(ShantyTown), 8));
                list.List.Add(new BuyListItem(typeof(Silver), 99));
                lists.Add(list);

                list = new BuyList();
                list.DuchyBuyThreshold = 5;
                list.EstateBuyThreshold = 3;
                list.List.Add(new BuyListItem(typeof(Platinum), 99));
                list.List.Add(new BuyListItem(typeof(Goons), 1));
                list.List.Add(new BuyListItem(typeof(Nobles), 8));
                list.List.Add(new BuyListItem(typeof(Gold), 99));
                list.List.Add(new BuyListItem(typeof(City), 10));
                list.List.Add(new BuyListItem(typeof(Chapel), 1));
                list.List.Add(new BuyListItem(typeof(Silver), 99));
                lists.Add(list);

                list = new BuyList();

                list.ColonyBuyThreshold = 8;
                list.ProvinceBuyThreshold = 2;
                list.DuchyBuyThreshold = 2;
                list.EstateBuyThreshold = 1;
                list.List.Add(new BuyListItem(typeof(Colony), 12));
                list.List.Add(new BuyListItem(typeof(Platinum), 99));
                list.List.Add(new BuyListItem(typeof(Hoard), 1));
                list.List.Add(new BuyListItem(typeof(Nobles), 8));
                list.List.Add(new BuyListItem(typeof(Gold), 99));
                list.List.Add(new BuyListItem(typeof(City), 10));
                list.List.Add(new BuyListItem(typeof(Chapel), 1));
                list.List.Add(new BuyListItem(typeof(Silver), 99));
                lists.Add(list);

                list = new BuyList();
                list.ColonyBuyThreshold = 0;
                list.ProvinceBuyThreshold = 0;
                list.DuchyBuyThreshold = 0;
                list.EstateBuyThreshold = 0;
                list.List.Add(new BuyListItem(typeof(Militia), 1));
                list.List.Add(new BuyListItem(typeof(Chapel), 1));
                list.List.Add(new BuyListItem(typeof(Gold), 3));
                list.List.Add(new BuyListItem(typeof(City), 10));
                list.List.Add(new BuyListItem(typeof(Goons), 10));
                list.List.Add(new BuyListItem(typeof(Silver), 4));
                list.List.Add(new BuyListItem(typeof(Hoard), 2));
                list.List.Add(new BuyListItem(typeof(Nobles), 8));
                list.List.Add(new BuyListItem(typeof(Gold), 99));
                lists.Add(list);
                */

                int[] wins = new int[lists.Count];
                int[] losses = new int[lists.Count];
                int[] games = new int[lists.Count];
                BuyList[] listsArray = new BuyList[wins.Length];
                for (int i = 0; i < lists.Count; i++)
                {
                    listsArray[i] = lists[i];
                }

                for (int i = 0; i < 100; i++)
                {
                    for (int j = 0; j < lists.Count; j++)
                    {
                        for (int k = j + 1; k < lists.Count; k++)
                        {
                            int res = PlayGame(kingdom, listsArray[j], listsArray[k]);
                            if (res == -1)
                            {
                                wins[j]++;
                                losses[k]++;
                            }
                            else if (res == 1)
                            {
                                losses[j]++;
                                wins[k]++;
                            }

                            res = PlayGame(kingdom, listsArray[k], listsArray[j]);
                            if (res == -1)
                            {
                                wins[k]++;
                                losses[j]++;
                            }
                            else if (res == 1)
                            {
                                losses[k]++;
                                wins[j]++;
                            }
                            games[j] += 2;
                            games[k] += 2;
                        }
                    }
                }

                for (int i = 0; i < listsArray.Length; i++)
                {
                    Console.WriteLine(wins[i].ToString() + "/" + losses[i].ToString() + "/" + games[i].ToString());
                    Console.WriteLine(listsArray[i]);
                }
            }
        }
Esempio n. 3
0
        public static BuyList[] PlayRound(Kingdom kingdom, List<BuyList> lists)
        {
            Console.WriteLine("Playing round with " + lists.Count + "players");
            int[] wins = new int[lists.Count];
            BuyList[] listsArray = new BuyList[wins.Length];
            for (int i = 0; i < lists.Count;i++)
            {
                listsArray[i] = lists[i];
            }

            for (int i = 0; i < listsArray.Length; i++)
            {
                for (int j = i+1; j< listsArray.Length; j ++)
                {
                    for (int k = 0; k < 15; k++)
                    {
                        int res = PlayGame(kingdom, listsArray[i], listsArray[j]);
                        if (res == -1)
                        {
                            wins[i]++;
                            wins[j]--;
                        }
                        else if (res == 1)
                        {
                            wins[i]--;
                            wins[j]++;
                        }

                        res = PlayGame(kingdom, listsArray[j], listsArray[i]);
                        if (res == -1)
                        {
                            wins[j]++;
                            wins[i]--;
                        }
                        else if (res == 1)
                        {
                            wins[j]--;
                            wins[i]++;
                        }
                    }
                }
            }
            //Array.Sort(wins, listsArray);
            for (int i = 0; i < listsArray.Length;i++)
            {
                Console.WriteLine(listsArray[i].List[3].Card.Name);
                Console.WriteLine(wins[i] + " wins");
                Console.WriteLine(listsArray[i].List[3].Card.Name);
                Console.WriteLine(listsArray[i].ToString());
            }
            return listsArray;
        }
Esempio n. 4
0
        public static int PlayGame(Kingdom kingdom, BuyList a, BuyList b)
        {
            GameModel model = new GameModel();
            BuyListAIStrategy player1 = new BuyListAIStrategy(model);
            BuyListAIStrategy player2 = new BuyListAIStrategy(model);
            player1.BuyList = a;
            player2.BuyList = b;
            Player p1 = new Player("player1", player1, model);
            Player p2 = new Player("player2", player2, model);
            model.Players.Add(p1);
            model.Players.Add(p2);

            model.InitializeGameState(kingdom, 0);

            model.PlayGame(100);

            if(!model.GameOver || model.Result.Winners.Count == 2)
            {
                return 0;
            }
            else if (model.Result.ResultMap[p1].Won)
            {
                return -1;
            }
            else
            {
                return 1;
            }
        }
Esempio n. 5
0
        public static void PerfTest()
        {
            Randomizer.SetRandomSeed(123456789);
            int games = 0;
            DateTime start = DateTime.Now;
            CardSetsModel cardSets = new CardSetsModel(GameSets.Any);
            foreach (CardSetGroup group in cardSets.CardSetGroups)
            {
                foreach(CardSetViewModel cardSet in group.CardSets)
                {
                    for (int k = 0; k < 800; k++)
                    {
                        games++;
                        GameModel model = new GameModel();
                        using (model.TextLog.SuppressLogging())
                        {
                            BuyList list = new BuyList();
                            list.DuchyBuyThreshold = 5;
                            list.EstateBuyThreshold = 3;
                            list.List.Add(new BuyListItem(typeof(Gold), 99));
                            foreach (CardModel card in cardSet.CardSet.CardCollection)
                            {
                                list.List.Add(new BuyListItem(card.GetType(), 1));
                            }
                            list.List.Add(new BuyListItem(typeof(Silver), 99));

                            BuyListAIStrategy player1 = new BuyListAIStrategy(model);
                            player1.BuyList = list;
                            BuyListAIStrategy player2 = new BuyListAIStrategy(model);
                            player2.BuyList = list;
                            Player p1 = new Player("player1", player1, model);
                            Player p2 = new Player("player2", player2, model);
                            model.Players.Add(p1);
                            model.Players.Add(p2);

                            Kingdom kingdom = new Kingdom(cardSet.CardSet.CardCollection, null, GameSets.Any, 2);
                            model.InitializeGameState(kingdom);
                            model.PlayGame(100);
                        }
                    }
                }
            }
            TimeSpan elapsed = DateTime.Now - start;
            Console.WriteLine("total time = " + elapsed.TotalSeconds);
            Console.WriteLine("Total games = " + games);
            Console.WriteLine("games / sec = " + (games / elapsed.TotalSeconds));
        }
Esempio n. 6
0
        public static void MonteCarloTreeSearchTest2()
        {
            CardModel[] cards = new CardModel[]
            {
                new Steward(),
                new DeathCart(),
                new Spy(),
                new Counterfeit(),
                new IllGottenGains(),
                new Laboratory(),
                new RoyalSeal(),
                new Stables(),
                new Venture(),
                new HuntingGrounds()
            };
            GameModel gameModel = new GameModel();
            Kingdom kingdom = new Kingdom(cards, null, null, GameSets.Any, 2, CardUseType.DoNotUse, CardUseType.DoNotUse, StartingHandType.FourThreeSplit);

            BuyList bigMoney = new BuyList();
            bigMoney.List.Add(new BuyListItem(typeof(IllGottenGains), 1));
            bigMoney.List.Add(new BuyListItem(typeof(Province), 8));
            bigMoney.List.Add(new BuyListItem(typeof(Gold), 99));
            bigMoney.List.Add(new BuyListItem(typeof(Silver), 99));
            bigMoney.ProvinceBuyThreshold = 5;
            bigMoney.DuchyBuyThreshold = 5;
            bigMoney.EstateBuyThreshold = 2;

            BuyListAIStrategy player1 = new BuyListAIStrategy(gameModel);
            BuyListAIStrategy player2 = new BuyListAIStrategy(gameModel);
            player1.BuyList = bigMoney.Clone();
            player2.BuyList = bigMoney.Clone();

            Player p1 = new Player("player1", player1, gameModel);
            Player p2 = new Player("player2", player2, gameModel);
            gameModel.Players.Add(p1);
            gameModel.Players.Add(p2);
            player1.FinalizeBuyList();
            player2.FinalizeBuyList();
            gameModel.InitializeGameState(kingdom, 0);
            p1.Hand.Clear();
            p2.Hand.Clear();
            for (int i = 0; i < 5; i++)
            {
                p1.Deck.Draw();
                p2.Deck.Draw();
            }
            for (int i = 0; i < 6; i++)
            {
                gameModel.PileMap[typeof(Province)].DrawCard();
                gameModel.PileMap[typeof(IllGottenGains)].DrawCard();
            }
            // skip opening book logic
            gameModel.HandlePlayerAction(new PlayerAction(ActionType.EndTurn));
            gameModel.HandlePlayerAction(new PlayerAction(ActionType.EndTurn));
            gameModel.HandlePlayerAction(new PlayerAction(ActionType.EndTurn));
            gameModel.HandlePlayerAction(new PlayerAction(ActionType.EndTurn));

            //human had 18 points, computer had 21 points
            // computer had 8 coins worth of stuff in hand
            // human had 5 coins worth of stuff in hand
            // 2 provinces left
            //6 duchys left
            // 8 estates left
            // 4 curses & ill gotten gains left
            // computer bought ill gotten gains, then reshuffled.
            p1.Hand.Add(new Copper());
            p1.Hand.Add(new Silver());
            p1.Hand.Add(new Gold());
            p1.Hand.Add(new Silver());
            p1.Hand.Add(new Estate());

            List<CardModel> d1 = new List<CardModel>();
            for (int i = 0; i < 6; i++) d1.Add(new Copper());
            for (int i = 0; i < 6; i++) d1.Add(new Curse());
            d1.Add(new Duchy());
            d1.Add(new Duchy());
            for (int i = 0; i < 3; i++) d1.Add(new Province());
            for (int i = 0; i < 2; i++) d1.Add(new Estate());
            for (int i = 0; i < 5; i++) d1.Add(new Silver());
            d1.Add(new HuntingGrounds());
            d1.Add(new Venture());
            d1.Add(new Venture());
            p1.Discard.AddRange(d1);

            List<CardModel> d2 = new List<CardModel>();
            for (int i = 0; i < 7; i++) d2.Add(new Copper());
            for (int i = 0; i < 5; i++) d2.Add(new IllGottenGains());
            for (int i = 0; i < 2; i++) d2.Add(new Province());

            d2.Add(new Silver());
            d2.Add(new Steward());
            d2.Add(new Steward());

            p2.Hand.Add(new Copper());
            p2.Hand.Add(new Copper());
            p2.Hand.Add(new Copper());
            p2.Hand.Add(new IllGottenGains());
            p2.Hand.Add(new Province());
            p2.Deck.Populate(d2);
            gameModel.HandlePlayerAction(new PlayerAction(ActionType.EnterBuyPhase));
            gameModel.HandlePlayerAction(new PlayerAction(ActionType.PlayBasicTreasures));

            MonteCarloTreeSearch search = new MonteCarloTreeSearch(gameModel, bigMoney.Clone(), false, 320);
            search.DoMCTS();
            DominionTreeNode node = search.Root;
            DominionTreeNode bestChild = null;
            DominionTreeNode defaultChild = null;
            foreach (DominionTreeNode child in node.Children.OrderByDescending(c => c.TotalValue / c.VisitCount))
            {
                Console.WriteLine(child.Action.ToString() + " " + child.TotalValue + " / " + child.VisitCount + " " + (child.TotalValue / child.VisitCount));
                if (bestChild == null || (child.TotalValue / child.VisitCount) > (bestChild.TotalValue / bestChild.VisitCount))
                {
                    bestChild = child;
                }
                if (child.Action.Pile != null && child.Action.Pile.Card is Province)
                {
                    defaultChild = child;
                }
            }

            PlayerAction defaultAction = defaultChild.Action;
            PlayerAction searchedAction = bestChild.Action;
            if (!defaultAction.Equals(searchedAction))
            {
                Console.WriteLine("difference!!!!!");

                MonteCarloTreeSearch refinedSearch = new MonteCarloTreeSearch(gameModel, bigMoney.Clone(), true, 310);
                refinedSearch.Root.Expand();
                for (int i = refinedSearch.Root.Children.Count - 1; i >= 0; i--)
                {
                    if (!(refinedSearch.Root.Children[i].Action.Equals(defaultAction) || refinedSearch.Root.Children[i].Action.Equals(searchedAction)))
                    {
                        refinedSearch.Root.Children.RemoveAt(i);
                    }
                }
                refinedSearch.DoMCTS();
                DominionTreeNode defaultActionChild = null, searchedActionChild = null;
                foreach (DominionTreeNode child in refinedSearch.Root.Children)
                {
                    if (child.Action.Equals(defaultAction))
                    {
                        defaultActionChild = child;
                    }
                    else if (child.Action.Equals(searchedAction))
                    {
                        searchedActionChild = child;
                    }
                    else
                    {
                        Debug.Assert(false);
                    }
                }
                double defaultWinRate = defaultActionChild.TotalValue / defaultActionChild.VisitCount;
                double searchedWinRate = searchedActionChild.TotalValue / searchedActionChild.VisitCount;

                foreach (DominionTreeNode child in refinedSearch.Root.Children.OrderByDescending(c => c.TotalValue / c.VisitCount))
                {
                    Console.WriteLine(child.Action.ToString() + " " + child.TotalValue + " / " + child.VisitCount + " " + (child.TotalValue / child.VisitCount));
                }
            }
        }
Esempio n. 7
0
        public static void MonteCarloTreeSearchTest()
        {
            CardModel[] cards = new CardModel[]
            {
                new Chapel(),
                new ShantyTown(),
                new Militia(),
                new Moneylender(),
                new City(),
                new Mint(),
                new Goons(),
                new Hoard(),
                new Nobles(),
                new Expand()
            };
            GameModel gameModel = new GameModel();
            Kingdom kingdom = new Kingdom(cards, null, null, GameSets.Any, 2, CardUseType.DoNotUse, CardUseType.DoNotUse, StartingHandType.FourThreeSplit);

            BuyList bigMoney = new BuyList();
            bigMoney.List.Add(new BuyListItem(typeof(Province), 8));
            bigMoney.List.Add(new BuyListItem(typeof(Gold), 99));
            bigMoney.List.Add(new BuyListItem(typeof(Silver), 99));

            BuyListAIStrategy player1 = new BuyListAIStrategy(gameModel);
            BuyListAIStrategy player2 = new BuyListAIStrategy(gameModel);
            player1.BuyList = bigMoney.Clone();
            player2.BuyList = bigMoney.Clone();
            Player p1 = new Player("player1", player1, gameModel);
            Player p2 = new Player("player2", player2, gameModel);
            gameModel.Players.Add(p1);
            gameModel.Players.Add(p2);
            gameModel.InitializeGameState(kingdom);
            p1.Hand.Clear();
            p2.Hand.Clear();
            for (int i = 0; i < 5; i++)
            {
                p1.Deck.Draw();
                p2.Deck.Draw();
            }
            for (int i = 0; i < 6; i++)
            {
                gameModel.PileMap[typeof(Province)].DrawCard();
            }
            // skip opening book logic
            gameModel.HandlePlayerAction(new PlayerAction(ActionType.EndTurn));
            gameModel.HandlePlayerAction(new PlayerAction(ActionType.EndTurn));
            gameModel.HandlePlayerAction(new PlayerAction(ActionType.EndTurn));
            gameModel.HandlePlayerAction(new PlayerAction(ActionType.EndTurn));
            p1.Hand.Add(new Gold());
            p1.Hand.Add(new Gold());
            p1.Hand.Add(new Gold());
            p1.Hand.Add(new Gold());
            p1.Hand.Add(new Gold());
            p2.Hand.Add(new Gold());
            p2.Hand.Add(new Gold());
            p2.Hand.Add(new Gold());
            p2.Hand.Add(new Gold());
            p2.Hand.Add(new Estate());
            List<CardModel> d1 = new List<CardModel>();
            for(int i=0;i<5;i++) d1.Add(new Gold());
            List<CardModel> d2 = new List<CardModel>();
            for(int i=0;i<5;i++) d2.Add(new Gold());
            p1.Deck.Populate(d1);
            p2.Deck.Populate(d2);
            gameModel.HandlePlayerAction(new PlayerAction(ActionType.EnterBuyPhase));
            gameModel.HandlePlayerAction(new PlayerAction(ActionType.PlayBasicTreasures));
            MonteCarloTreeSearch search = new MonteCarloTreeSearch(gameModel, bigMoney, true, 320);
            search.DoMCTS();
            DominionTreeNode node = search.Root;
            PlayerAction action = node.BestChild.Action;
            Debug.Assert(action.Pile.Name != "Province");
        }
Esempio n. 8
0
        public static void MonteCarloTreeSearchCompareAITest()
        {
            DateTime start = DateTime.Now;
            /*
            CardModel[] cards = new CardModel[]
            {
                new Chapel(),
                new ShantyTown(),
                new Militia(),
                new Moneylender(),
                new City(),
                new Mint(),
                new Goons(),
                new Hoard(),
                new Nobles(),
                new Expand()
            };

            BuyList buyList = new BuyList();
            buyList.OpeningBuy1 = typeof(Chapel);
            buyList.OpeningBuy2 = typeof(Silver);
            buyList.List.Add(new BuyListItem(typeof(Goons), 2));
            buyList.List.Add(new BuyListItem(typeof(City), 5));
            buyList.List.Add(new BuyListItem(typeof(Goons), 1));
            buyList.List.Add(new BuyListItem(typeof(Nobles), 4));
            buyList.List.Add(new BuyListItem(typeof(Militia), 1));
            buyList.List.Add(new BuyListItem(typeof(Nobles), 2));
            buyList.List.Add(new BuyListItem(typeof(City), 4));
            buyList.List.Add(new BuyListItem(typeof(Province), 8));
            buyList.List.Add(new BuyListItem(typeof(Nobles), 2));
            buyList.List.Add(new BuyListItem(typeof(Goons), 3));
            buyList.List.Add(new BuyListItem(typeof(Hoard), 5));
            buyList.List.Add(new BuyListItem(typeof(Gold), 99));
            buyList.List.Add(new BuyListItem(typeof(Silver), 99));
            */
            //Kingdom kingdom = new Kingdom(cards, null, GameSets.Any, 2, CardUseType.DoNotUse, CardUseType.DoNotUse, StartingHandType.FourThreeSplit);

            /*
            IList<CardModel> cards = new List<CardModel>(new BigMoney().CardCollection);
            BuyList buyList = new BuyList();
            buyList.OpeningBuy1 = typeof(Chancellor);
            buyList.OpeningBuy2 = typeof(Silver);
            buyList.List.Add(new BuyListItem(typeof(Gold), 1));
            buyList.List.Add(new BuyListItem(typeof(Laboratory), 2));
            buyList.List.Add(new BuyListItem(typeof(Province), 99));
            buyList.List.Add(new BuyListItem(typeof(Gold), 99));
            buyList.List.Add(new BuyListItem(typeof(Moneylender), 1));
            buyList.List.Add(new BuyListItem(typeof(Laboratory), 8));
            buyList.List.Add(new BuyListItem(typeof(Silver), 99));
            */

            IList<CardModel> cards = new List<CardModel>(new PoolsToolsAndFools().CardCollection);
            BuyList buyList = new BuyList();
            buyList.OpeningBuy1 = typeof(Silver);
            buyList.OpeningBuy2 = typeof(Silver);
            buyList.List.Add(new BuyListItem(typeof(ScryingPool), 2));
            buyList.List.Add(new BuyListItem(typeof(Golem), 8));
            buyList.List.Add(new BuyListItem(typeof(Nobles), 1));
            buyList.List.Add(new BuyListItem(typeof(Province), 99));
            buyList.List.Add(new BuyListItem(typeof(Gold), 3));
            buyList.List.Add(new BuyListItem(typeof(Nobles), 8));
            buyList.List.Add(new BuyListItem(typeof(Gold), 99));
            buyList.List.Add(new BuyListItem(typeof(ScryingPool), 2));
            buyList.List.Add(new BuyListItem(typeof(Silver), 99));
            buyList.List.Add(new BuyListItem(typeof(Potion), 1));
            buyList.List.Add(new BuyListItem(typeof(ScryingPool), 6));

            Kingdom kingdom = new Kingdom(cards, null, null, GameSets.Any, 2, CardUseType.DoNotUse, CardUseType.DoNotUse, StartingHandType.FourThreeSplit);

            /*
            BuyListTrainer trainer = new BuyListTrainer(kingdom, true);
            BuyListTrainer.GamesPerMatchup = 5;
            BuyListTrainer.MaxChallengerCount = 60;
            BuyListTrainer.MaxLeaderCount = 5;
            List<BuyListEntry> best = trainer.Train(20);
            Console.WriteLine("Trained");
            BuyList buyList2 = best.Last().BuyList;
            Console.WriteLine(buyList2.ToString());
            return;
            */
            int wins = 0;
            int games = 0;
            for (int p = 0; p < 256; p++)
            {
                GameModel gameModel = new GameModel();
                BuyListAIStrategy player1 = new BuyListAIStrategy(gameModel);
                player1.BuyList = buyList.Clone();
                player1.UseSearch = true;
                player1.SearchThreshold = 0.05;
                player1.SearchNodes = 320;
                player1.SearchConfirm = true;
                player1.SearchKeepsHandInfo = false;
                BuyListAIStrategy player2 = new BuyListAIStrategy(gameModel);
                player2.BuyList = buyList.Clone();
                Player p1 = new Player("player1", player1, gameModel);
                Player p2 = new Player("player2", player2, gameModel);
                gameModel.Players.Add(p1);
                gameModel.Players.Add(p2);
                gameModel.InitializeGameState(kingdom, p % 2);
                gameModel.PlayGame(200);
                //Console.WriteLine(gameModel.TextLog.Text);
                if (gameModel.Result.Winners.Contains(p1) && !gameModel.Result.Winners.Contains(p2))
                {
                    Console.WriteLine("won");
                    wins++;
                    games++;
                }
                else if(gameModel.Result.Winners.Contains(p2) && !gameModel.Result.Winners.Contains(p1))
                {
                    Console.WriteLine("lost");
                    games++;
                }

            }
            double ratio = wins / (double)games;
            Console.WriteLine(ratio);
            DateTime end = DateTime.Now;
            Console.WriteLine((end - start).TotalSeconds + " seconds");
        }
Esempio n. 9
0
        public static void TrainerCompareAITest()
        {
            DateTime start = DateTime.Now;

            Kingdom kingdom = new Kingdom(new BigMoney().CardCollection, null, null, GameSets.Any, 2, CardUseType.DoNotUse, CardUseType.DoNotUse, StartingHandType.FourThreeSplit);
            /*
            BuyListTrainer trainer = new BuyListTrainer(kingdom, true);
            BuyListTrainer.GamesPerMatchup = 5;
            BuyListTrainer.MaxChallengerCount = 60;
            BuyListTrainer.MaxLeaderCount = 5;
            List<BuyListEntry> best = trainer.Train(20);
            Console.WriteLine("Trained");
            BuyList buyList1 = best.Last().BuyList;
            Console.WriteLine(buyList1.ToString(true));

            List<BuyListEntry> best2 = trainer.TrainThresholds();
            BuyList buyList2 = best2.Last().BuyList;
            Console.WriteLine(buyList2.ToString(true));
            */

            BuyList buyList1 = new BuyList();
            buyList1.OpeningBuy1 = typeof(Silver);
            buyList1.OpeningBuy2 = typeof(Moneylender);
            buyList1.List.Add(new BuyListItem(typeof(Adventurer), 1));
            buyList1.List.Add(new BuyListItem(typeof(Gold), 2));
            buyList1.List.Add(new BuyListItem(typeof(Province), 99));
            buyList1.List.Add(new BuyListItem(typeof(Adventurer), 2));
            buyList1.List.Add(new BuyListItem(typeof(Gold), 99));
            buyList1.List.Add(new BuyListItem(typeof(Laboratory), 6));
            buyList1.List.Add(new BuyListItem(typeof(Moneylender), 1));
            buyList1.List.Add(new BuyListItem(typeof(Silver), 99));

            BuyList buyList2 = buyList1.Clone();
            buyList2.EstateBuyThreshold = 2;
            buyList2.DuchyBuyThreshold = 5;
            buyList2.ProvinceBuyThreshold = 7;
            buyList2.ColonyBuyThreshold = 0;

            int wins = 0;
            int games = 0;
            for (int p = 0; p < 25600; p++)
            {
                GameModel gameModel = new GameModel();
                BuyListAIStrategy player1 = new BuyListAIStrategy(gameModel);
                player1.BuyList = buyList1.Clone();

                BuyListAIStrategy player2 = new BuyListAIStrategy(gameModel);
                player2.BuyList = buyList2.Clone();

                Player p1 = new Player("player1", player1, gameModel);
                Player p2 = new Player("player2", player2, gameModel);
                gameModel.Players.Add(p1);
                gameModel.Players.Add(p2);
                gameModel.InitializeGameState(kingdom, p % 2);
                gameModel.PlayGame(200);
                //Console.WriteLine(gameModel.TextLog.Text);
                if (gameModel.Result.Winners.Contains(p1) && !gameModel.Result.Winners.Contains(p2))
                {
                    wins++;
                    games++;
                }
                else if (gameModel.Result.Winners.Contains(p2) && !gameModel.Result.Winners.Contains(p1))
                {
                    games++;
                }

            }
            double ratio = wins / (double)games;
            Console.WriteLine(ratio);
        }
Esempio n. 10
0
        public static void TournamentTest2()
        {
            Randomizer.SetRandomSeed(123456789);
            CardModel[] cards = new CardModel[]
            {
                new Familiar(),
                new Wharf(),
                new FishingVillage(),
                new Smugglers(),
                new Warehouse(),
                new NomadCamp(),
                new Laboratory(),
                new Rabble(),
                new Nobles(),
                new KingsCourt()
            };
            Kingdom kingdom = new Kingdom(cards, null, null, GameSets.Any, 2, CardUseType.DoNotUse, CardUseType.DoNotUse, StartingHandType.FourThreeSplit);

            GameModel model = new GameModel();
            using (model.TextLog.SuppressLogging())
            {
                List<BuyList> lists = new List<BuyList>();
                BuyList list = new BuyList();

                list.ProvinceBuyThreshold = 5;
                list.DuchyBuyThreshold = 5;
                list.EstateBuyThreshold = 2;
                list.OpeningBuy1 = typeof(FishingVillage);
                list.OpeningBuy2 = typeof(FishingVillage);
                list.List.Add(new BuyListItem(typeof(Wharf), 4));
                list.List.Add(new BuyListItem(typeof(Gold), 1));
                list.List.Add(new BuyListItem(typeof(Province), 99));
                list.List.Add(new BuyListItem(typeof(Gold), 99));
                list.List.Add(new BuyListItem(typeof(Silver), 99));
                lists.Add(list);

                list = new BuyList();
                list.ProvinceBuyThreshold = 5;
                list.DuchyBuyThreshold = 5;
                list.EstateBuyThreshold = 2;
                list.OpeningBuy1 = typeof(Silver);
                list.OpeningBuy2 = typeof(Potion);
                list.List.Add(new BuyListItem(typeof(Familiar), 3));
                list.List.Add(new BuyListItem(typeof(Gold), 1));
                list.List.Add(new BuyListItem(typeof(Province), 99));
                list.List.Add(new BuyListItem(typeof(Gold), 99));
                list.List.Add(new BuyListItem(typeof(Silver), 99));
                lists.Add(list);

                int[] wins = new int[lists.Count];
                int[] losses = new int[lists.Count];
                int[] games = new int[lists.Count];
                BuyList[] listsArray = new BuyList[wins.Length];
                for (int i = 0; i < lists.Count; i++)
                {
                    listsArray[i] = lists[i];
                }

                for (int i = 0; i < 100; i++)
                {
                    for (int j = 0; j < lists.Count; j++)
                    {
                        for (int k = j + 1; k < lists.Count; k++)
                        {
                            int res = PlayGame(kingdom, listsArray[j], listsArray[k]);
                            if (res == -1)
                            {
                                wins[j]++;
                                losses[k]++;
                            }
                            else if (res == 1)
                            {
                                losses[j]++;
                                wins[k]++;
                            }

                            res = PlayGame(kingdom, listsArray[k], listsArray[j]);
                            if (res == -1)
                            {
                                wins[k]++;
                                losses[j]++;
                            }
                            else if (res == 1)
                            {
                                losses[k]++;
                                wins[j]++;
                            }
                            games[j] += 2;
                            games[k] += 2;
                        }
                    }
                }

                for (int i = 0; i < listsArray.Length; i++)
                {
                    Console.WriteLine(wins[i].ToString() + "/" + losses[i].ToString() + "/" + games[i].ToString());
                    Console.WriteLine(listsArray[i]);
                }
            }
        }