コード例 #1
0
        public void Four_players_should_have_scores_cancel_out()
        {
            var strategy = new SimpleRoundStrategy();
            var sets     = Dealer.Deal().ToArray();

            var calculator = new TaiwaneseScoreCalculator(new PokerStrengthStrategy());
            var scores     = calculator.GetScores(sets.Select(strategy.GetBestRound).ToList());

            Assert.Equal(0, scores.Sum(kv => kv.Value));
        }
コード例 #2
0
        public void Two_players_should_have_scores_cancel_out()
        {
            var strategy = new SimpleRoundStrategy();
            var sets     = Dealer.Deal().Take(2).ToArray();

            var roundA = strategy.GetBestRound(sets[0]);
            var roundB = strategy.GetBestRound(sets[1]);

            var calculator = new TaiwaneseScoreCalculator(new PokerStrengthStrategy());

            calculator.GetScore(roundA, roundB, out int scoreA, out var scoreB);

            Assert.Equal(scoreA, -scoreB);
            Assert.Equal(0, scoreA + scoreB);
        }
コード例 #3
0
        public void Simulation(string modelPath)
        {
            var mlStrategy     = new RegressionMlStrategy(modelPath);
            var simpleStrategy = new SimpleRoundStrategy();
            var scoreKeeper    = new TaiwaneseScoreCalculator(simpleStrategy.GameHandsManager.StrengthArbiter);

            string line;

            do
            {
                var sets = Dealer.Deal().ToList();

                var round1 = mlStrategy.GetBestRound(sets[0]);
                var round0 = simpleStrategy.GetBestRound(sets[0]);
                var round2 = simpleStrategy.GetBestRound(sets[1]);
                var round3 = simpleStrategy.GetBestRound(sets[2]);
                var round4 = simpleStrategy.GetBestRound(sets[3]);

                var rounds = new[] { round1, round2, round3, round4 };
                var result = scoreKeeper.GetScores(rounds).ToList();

                for (var i = 0; i < 4; i++)
                {
                    System.Console.WriteLine($"{result[i].Key}\n{result[i].Value}");
                }

                System.Console.WriteLine("---------------------------");
                rounds = new[] { round0, round2, round3, round4 };
                result = scoreKeeper.GetScores(rounds).ToList();

                for (var i = 0; i < 4; i++)
                {
                    System.Console.WriteLine($"{result[i].Key}\n{result[i].Value}");
                }

                line = System.Console.ReadLine();
                System.Console.Clear();
            } while (line != "q");
        }
コード例 #4
0
        public void Go(string outFileName, int recordNeeded = 1_000_000)
        {
            var count       = 0;
            var strategy    = new SimpleRoundStrategy();
            var scoreKeeper = new TaiwaneseScoreCalculator(strategy.GameHandsManager.StrengthArbiter);
            var timer       = new Stopwatch();

            timer.Start();
            Writer = new StreamWriter(outFileName, true);

            var gamesNeeded = Math.Max(1, (int)Math.Round(recordNeeded / 4.0 / Math.Pow(BestRoundsToTake, 4)) + 1);

            Parallel.For(0, gamesNeeded, _ =>
            {
                var players      = Dealer.Deal().ToList();
                var playerRounds = players.Select(p => strategy.GetBestRounds(p, BestRoundsToTake).ToList()).ToList();
                for (var p1 = 0; p1 < playerRounds[0].Count; p1++)
                {
                    for (var p2 = 0; p2 < playerRounds[1].Count; p2++)
                    {
                        for (var p3 = 0; p3 < playerRounds[2].Count; p3++)
                        {
                            for (var p4 = 0; p4 < playerRounds[3].Count; p4++)
                            {
                                //var result = scoreKeeper.GetScores(new[] {playerRounds[0][p1], playerRounds[1][p2], playerRounds[2][p3], playerRounds[3][p4]}.ToList()).ToList();
                                var result = scoreKeeper.GetScoresWithRoundWeight(new[] { playerRounds[0][p1], playerRounds[1][p2], playerRounds[2][p3], playerRounds[3][p4] }.ToList()).ToList();
                                lock (this)
                                {
                                    for (var i = 0; i < result.Count; i++)
                                    {
                                        OutputResult(Writer, result, i, new int[] { p1, p2, p3, p4 });
                                    }
                                    count += 4;
                                    if (count % 10_000 == 0)
                                    {
                                        Console.WriteLine($"count {count}, time: {timer.Elapsed}");
                                    }
                                }
コード例 #5
0
        public void SimulationComparison(IEnumerable <IRoundStrategy> player)
        {
            var scoreCalculator = new TaiwaneseScoreCalculator(new PokerHandBuilderManager().StrengthArbiter);

            var scoreKeeper = new [] { new SimpleRoundStrategy() }.Concat(player).Select(s => new ScoreKeeper {
                Strategy = s
            }).ToList();

            int rA = 0, rB = 0;

            for (var k = 0; k < 100; k++)
            {
                foreach (var s in scoreKeeper)
                {
                    s.TempScore = new int[4];
                }

                var gameCount = 0;
                while (gameCount < 20)
                {
                    var sets   = Dealer.Deal().ToList();
                    var round2 = scoreKeeper[0].Strategy.GetBestRound(sets[1]);
                    var round3 = scoreKeeper[0].Strategy.GetBestRound(sets[2]);
                    var round4 = scoreKeeper[0].Strategy.GetBestRound(sets[3]);

                    foreach (var role in scoreKeeper)
                    {
                        var round  = role.Strategy.GetBestRound(sets[0]);
                        var result = scoreCalculator.GetScores(new[] { round, round2, round3, round4 }).Select(r => r.Value).ToList();
                        for (var i = 0; i < 4; i++)
                        {
                            role.TempScore[i] += result[i];
                        }
                    }

                    //var typeA = new[] {round0, round2, round3, round4};
                    //var typeB = new[] {round1, round2, round3, round4};

                    //var result = scoreCalculator.GetScores(typeA).ToList();
                    //for (var i = 0; i < 4; i++)
                    //  gameResultA[i] += result[i].Value;

                    //result = scoreCalculator.GetScores(typeB).ToList();
                    //for (var i = 0; i < 4; i++)
                    //  gameResultB[i] += result[i].Value;

                    gameCount++;
                }

                foreach (var role in scoreKeeper)
                {
                    role.TotalScore += role.TempScore[0];
                }

                foreach (var role in scoreKeeper)
                {
                    System.Console.WriteLine($"{role.Strategy.GetType().Name.Substring(0, 5)} {role.TotalScore - scoreKeeper[0].TotalScore,4} {role.TotalScore,5} {role.TempScore[0],4} {role.TempScore[1],4} {role.TempScore[2],4} {role.TempScore[3],4}");
                }

                System.Console.WriteLine("-------------------");
            }

            System.Console.ReadLine();
        }