private void MarkGrid(PostflopPlayerSummary villainSummary, StatusInRoundEnum villainStatus, GridGradeOnBoardEnum gridGrade, RangeGrid grid) { /* * if (villainStatus == StatusInRoundEnum.Raised) * { * if (gridGrade == GridGradeOnBoardEnum.EliteWhenSuited) * { * grid.InRange = PlayerRangeGridStatusEnum.IncludedIfSuitedWithBoard; * } * if (gridGrade == GridGradeOnBoardEnum.Trash) * { * grid.InRange = PlayerRangeGridStatusEnum.Excluded; * } * } * * if (villainStatus == StatusInRoundEnum.Checked) * { * if (villainSummary.InRoundRole != InRoundRole.OopCaller) * { * if (gridGrade == GridGradeOnBoardEnum.Elite) * { * grid.InRange = PlayerRangeGridStatusEnum.Excluded; * } * if (gridGrade == GridGradeOnBoardEnum.EliteWhenSuited) * { * grid.InRange = PlayerRangeGridStatusEnum.IncludedIfOffSuitWithBoard; * } * } * } */ }
private PlayerRange EstimateFlopRange(PostflopStatusSummary statusSummary, PostflopPlayerSummary villainSummary) { var preflopRange = EstimateRange(statusSummary.BigBlindSize, villainSummary.PreflopDecisions, villainSummary.Position); var boardModel = new BoardModel(statusSummary.BoardStatus); foreach (var grid in preflopRange.GetAliveGrids()) { var gridGrade = boardModel.GetGridGrade(grid.Grid); MarkGrid(villainSummary, GetPlayerStatusInRound(), gridGrade, grid.Grid); } return(preflopRange); }
public PlayerRange EstimateRange(PostflopStatusSummary statusSummary, PostflopPlayerSummary villainSummary) { //todo: estimate the current Range based on //position //betting history //board //hero cards switch (statusSummary.BoardStatus.BoardStage) { default: throw new NotImplementedException(); } }
private static PostflopPlayerSummary GetPostflopPlayerSummary(Round round, Player player) { var playerSummary = new PostflopPlayerSummary { Name = player.Name, Position = player.Position, Holes = new HoldingHoles(round.Hole1, round.Hole2), ChipsBet = player.ChipsBetAlready, IsMe = round.IsMe(player), IsAlive = player.IsAlive, PreflopDecisions = round.PreflopMoves.Where(m => m.Player.Equals(player)).Select(m => m.Decision).ToList(), FlopDecisions = round.FlopMoves.Where(m => m.Player.Equals(player)).Select(m => m.Decision).ToList(), TurnDecisions = round.TurnMoves.Where(m => m.Player.Equals(player)).Select(m => m.Decision).ToList(), RiverDecisions = round.RiverMoves.Where(m => m.Player.Equals(player)).Select(m => m.Decision).ToList(), StackSize = player.StackSize, Tag = "" }; return(playerSummary); }
private Decision MakeDecisionAgainstSingleVillain(PostflopStatusSummary statusSummary, PostflopPlayerSummary villain) { var boardStatus = statusSummary.BoardStatus; var heroHoles = statusSummary.Me.Holes; var villainRange = _rangeEstimator.EstimateRange(statusSummary, villain); var heroRange = GetVillainGuessOnHeroRange(statusSummary.Me); var rawBoardSpectrum = _boardSpectrumMaker.MakeSpectrum(boardStatus); var villainBoardSpectrum = _boardSpectrumFilter.FilterAgainstRange(rawBoardSpectrum, villainRange); var heroBoardSpectrum = _boardSpectrumFilter.FilterAgainstRange(rawBoardSpectrum, heroRange); var heroEquityAgainstVillainRange = villainBoardSpectrum.GetEquity(heroHoles); var villainHolesCombos = villainRange.GetAliveGrids().SelectMany(g => g.Grid.EnumerateAllCombos()); foreach (var villainHoles in villainHolesCombos) { var villainEquityAgainstHeroRange = heroBoardSpectrum.GetEquity(villainHoles); var fightResult = villainBoardSpectrum.Fight(heroHoles, villainHoles); var bettingDecisionEnum = MakeBettingDecisionBasedOnEquitiesComparison(heroEquityAgainstVillainRange, villainEquityAgainstHeroRange, fightResult); //todo accumulate them to make the final decision } throw new NotImplementedException(); }
/// <summary> /// The hero's range guessed by villain /// for a dumb implementation, return a full Range /// or, return a position-based range. /// </summary> /// <returns></returns> private PlayerRange GetVillainGuessOnHeroRange(PostflopPlayerSummary hero) { throw new NotImplementedException(); }