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)); }
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); }
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"); }
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}"); } }
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(); }