/// <summary> /// Run the simulatiuon with a list of player and a sorter with all the cards /// </summary> /// <param name="players"></param> /// <param name="sorter"></param> public IEnumerable <Player> Run(IEnumerable <Player> players, IEnumerable <Hand[]> sorter) { // local function to determine who is the winner of each game Player EachGameWinner(Hand[] hands) { // each player receives a hand var game = players.Select((p, i) => { p.Hand = hands[i]; return(p); }); // evaluate hand rank on individual player by using HandCategoriserChain with Chain of Responsibility Pattern game = game.Select(p => { p.Hand = _handEvaluator.Evaluate(p.Hand); return(p); }); // evaluate the winner return(_winnerEvaluator.ShowWinner(game)); } var sorterArray = sorter as Hand[][] ?? sorter.ToArray(); // sorter gives hands to each game which will return a winner or null when it is tie. var winners = sorterArray.Select(EachGameWinner) .Where(w => w != null); // winning count on total and individual player var totalGameHasWinner = winners.Sum(w => { w.WinCount++; return(1); }); // total number of tie if it is required var tie = sorterArray.Length - totalGameHasWinner; return(players); }
public void Should_GetCorrectWinnerBySorting_With_TestWinnerData(string hand1, string hand2, int expectedWinner) { var player1 = new Player("1") { Hand = _handEvaluator.Evaluate(hand1.Split(" ").StringToHand()) }; var player2 = new Player("2") { Hand = _handEvaluator.Evaluate(hand2.Split(" ").StringToHand()) }; var players = new[] { player1, player2 }; var winnerPlayer = _winnerEvaluator.ShowWinner(players); var winner = winnerPlayer?.Name ?? "0"; Assert.Equal($"{expectedWinner}", winner); }