public static void Main(string[] args) { Table table = new Table(); table.Pot = 1; table.MaxBet = 5; foreach (string rule in rules) { Decision decision = new RuleInterpreter(0.01, 0.02).interpret(table, rule); Console.WriteLine(decision); } Console.ReadKey(); }
public void ProcessTable(Settings settings, Image tableImage, TableRenderer renderer, Table table, TableContainer container, RuleEvaluator evaluator, RuleInterpreter interpreter, Controller controller, Replayer replayer, RandomClicker clicker, List <TableControl> controls) { // hand visible? if (table.Hand.Count != 0) { // identify situation Situation situation = SituationEvaluator.evaluateSituation(tableImage, table, controls, settings.BigBlind); // wait for blinds activatd or not enough players or money reached if (!container.IsWaitingForBlind && situation.Street == StreetTypes.Preflop) { // override blinds? if (waitForBlinds) { Log.Info("table " + (container.Number + 1) + " override blinds"); WaitForBlind(controller, container); } // out of players? else if (table.IsOutOfPlayers) { Log.Info("table " + (container.Number + 1) + " ran out of players"); CloseTable(container, controller); return; } // reached money? else if (settings.CloseTableActivated && table.HasSeat && table.MyPlayer.HasMoney) { if (table.MyPlayer.Money > settings.CloseTableMoneyMax) { Log.Info("table " + (container.Number + 1) + " reached money limit " + table.MyPlayer.Money); CloseTable(container, controller); return; } } } // evaluate rule Rule rule = evaluator.findRule(situation.Street, situation.Hand, situation.Chance, situation.Opponents, situation.OpponentAction, situation.Position, table.MaxBet, table.Pot); // decision Decision decision = interpreter.interpret(table, rule.Decision); // render table Log.Debug("# rendering table"); if (renderer != null) { renderer.render(table, container.Layout, situation, rule, decision, controls); } // beep if (decision.DecisionType == Decision.Types.BET || decision.DecisionType == Decision.Types.CALL || decision.DecisionType == Decision.Types.RAISE) { if (situation.Hand != HandTypes.None) { Beep(settings); TextToSpeech.SayAsnc(settings, situation.Hand); } } // random click on table if (RandomBool(0.05) && settings.AutoClick) { Log.Debug("# auto click on table"); clicker.click(container.Layout); } // sit out if (!container.IsSittingOut && sitOutNextHand) { SitOut(controller, container); } // press buttons Log.Debug("# press controls"); Thread.Sleep(RandomInt(100, 500)); controller.Handle(decision, container.Layout, controls); // random mouse moves if (RandomBool(0.05) && settings.AutoMoveMouse) { Log.Debug("# auto move mouse"); Sleep(settings, RandomInt(100, 300)); AutoMoveMouse(controller.Mouse); } if (situation.Opponents > 2 && RandomBool(0.05) && settings.ReplayMouseMoves) { Log.Debug("# replay mouse"); Sleep(settings, RandomInt(100, 300)); replayer.ReplayRandomShort(); } } else { // render table Log.Debug("# rendering table"); renderer.render(table, container.Layout); } }
private void ProcessTables(Settings settings, bool resetMouse) { // screen Iterator <Image> screen = new ScreenImageIteratorFast(deviceControl); // evaluator List <Rule> rules = RulesReader.readRules(); RuleEvaluator evaluator = new RuleEvaluator(rules); RuleInterpreter interpreter = new RuleInterpreter(settings.SmallBlind, settings.BigBlind); if (settings.PreCheckRules) { DateTime startCheck = DateTime.Now; interpreter.precheck(rules); Log.Info("# prechecking rules took " + DateTime.Now.Subtract(startCheck).TotalMilliseconds + " ms"); } // controller double betSlideTextLimit = settings.PlayMoney ? 100 : 0.2; Mouse mouse = new HumanMouse(deviceControl, settings.FastMouse ? HumanMouse.Speed.Fast : HumanMouse.Speed.Normal); Keyboard keyboard = new Keyboard(deviceControl); Controller controller = new Controller(keyboard, mouse, betSlideTextLimit, tableIdentifier, new ScreenImageIterator(deviceControl)); // clicker RandomClicker clicker = new RandomClicker(new Point(deviceControl.DisplayWidth, 0), mouse); // replayer Replayer replayer = new Replayer(deviceControl); // table switcher TableSwitcher switcher = new TableSwitcher(mouse, deviceControl, settings.TaskbarColors); // reset mouse if (resetMouse) { deviceControl.ResetMouse(); } // loop while (screen.hasNext()) { // start Log.Debug("## iteration -> start ##"); DateTime start = DateTime.Now; // screenshot DateTime startScreen = DateTime.Now; Image unsafeScreenshot = screen.next(); Log.Debug("screenshot took " + DateTime.Now.Subtract(startScreen).TotalMilliseconds + " ms"); // tables foreach (TableContainer container in tableOpener.KnownTables) { // table image Log.Debug("# processing table " + (container.Number + 1)); Image unsafeTableImage = TableOpener.CropTable(unsafeScreenshot, container.Layout); // render table if (container.Renderer != null) { DateTime startRender = DateTime.Now; container.Renderer.clearImages(); container.Renderer.renderImage(unsafeTableImage, 0, 0); tableIdentifier.Renderer = container.Renderer; Log.Debug("rendering took " + DateTime.Now.Subtract(startRender).TotalMilliseconds + " ms"); } // table status bool isTableVisible = tableOpener.IsTableVisible(container, unsafeTableImage); bool areControlsActive = isTableVisible ? tableIdentifier.identifyMove(unsafeTableImage) : false; Log.Debug("# table" + container.Number + ": vis=" + isTableVisible + " buttons=" + areControlsActive); // HANDLE ERRORS: table window should not be visible, but it is if (isTableVisible) { // "you have been removed" if (!areControlsActive && YouHaveBeenRemovedVisible(container.Layout, unsafeTableImage)) { // close it switcher.action(); ErrorHandler.ReportExceptionWithImage(new Exception("You have been removed"), "handle errors", unsafeTableImage); keyboard.pressEnter(); controller.CloseTableWithEnter(container.Layout); container.Close(); // wait, otherwise table is visible on next screenshot Thread.Sleep(500); break; } // "I'm back" if (!sitOutNextHand && !areControlsActive && !container.IsWaitingForBlind && IsImBackVisible(container.Layout, unsafeTableImage)) { // close it switcher.action(); ErrorHandler.ReportExceptionWithImage(new Exception("I'm back visible"), "handle errors", unsafeTableImage); controller.CloseTableWithEnter(container.Layout); container.Close(); // wait, otherwise table is visible on next screenshot Thread.Sleep(500); break; } // "Post Blind" if (!container.IsWaitingForBlind && areControlsActive && IsPostBlindVisible(container.Layout, unsafeTableImage)) { // close it switcher.action(); ErrorHandler.ReportExceptionWithImage(new Exception("Post Blind visible"), "handle errors", unsafeTableImage); controller.CloseTableWithEnter(container.Layout); container.Close(); // wait, otherwise table is visible on next screenshot Thread.Sleep(500); break; } // "Check or Fold" if (areControlsActive && IsCheckOrFoldMsgBoxVisible(container.Layout, unsafeTableImage)) { // press check switcher.action(); ErrorHandler.ReportExceptionWithImage(new Exception("Check or Fold visible"), "handle errors", unsafeTableImage); keyboard.pressEnter(); // wait Thread.Sleep(500); break; } } // HANDLE TABLE: processing table and handling controls (if the corner image matches) if (isTableVisible && (areControlsActive || container.IsWaitingForBlind)) { // move mouse if required if (switcher.isSameContainer(container.Number) && !switcher.hasPrevIterationAction() && !areControlsActive) { // same table and nothing happend since previous iteration Sleep(settings, RandomInt(300, 500)); } else { // move mouse to safe location (screenshot) MoveMouseToSafePosition(controller.Mouse, container.Layout); Sleep(settings, RandomInt(50, 100)); } // take clean screenshot Image safeScreenshot = screen.next(); Image safeTableImage = TableOpener.CropTable(safeScreenshot, container.Layout); if (container.Renderer != null) { container.Renderer.clearImages(); container.Renderer.renderImage(safeTableImage, 0, 0); } // CLOSE TABLE: check if table has to be closed if (container.IsWaitingForBlind) { Log.Debug("table " + (container.Number + 1) + " checking for big blind indication"); // detect bool fastTableToClose = container.IsFastTable && IsImBackVisible(container.Layout, safeTableImage); bool slowTableToClose = container.IsSlowTable && IsPostBlindVisible(container.Layout, safeTableImage); // close it if (fastTableToClose || slowTableToClose) { // click on close and press enter CloseTable(container, controller); // wait, otherwise table is visible on next screenshot Thread.Sleep(500); // done with this table break; } } // HANDLE CONTROLS: identify controls, table, press butto´n if (areControlsActive) { Log.Info("table " + (container.Number + 1) + " handling controls"); // active container (-> UI) container.Active(); // identify controls List <TableControl> controls = new List <TableControl>(); try { controls = tableIdentifier.identifyControls(safeTableImage); } catch (Exception ex) { // error beep ErrorHandler.BeepError(); // press fold PressFold(container.Layout, controller); // report ErrorHandler.ReportTableException(ex, safeTableImage, "Identify controls"); continue; } // process table actions try { // identify table DateTime startIdentify = DateTime.Now; Log.Debug("table " + (container.Number + 1) + " identifying"); Table table = tableIdentifier.identifyTable(safeTableImage, container.Seat); Log.Debug("identify took " + DateTime.Now.Subtract(startIdentify).TotalMilliseconds + " ms"); // remember money if (table.HasSeat && table.MyPlayer.HasMoney) { container.Money = table.MyPlayer.Money; } // fire money changed event MoneyChanged(); // identify max bet table.MaxBet = GetMaxBet(controls); Log.Debug("max bet on table " + (container.Number + 1) + " is " + table.MaxBet); // press buttons Log.Debug("table " + (container.Number + 1) + " pressing buttons"); ProcessTable(settings, safeTableImage, container.Renderer, table, container, evaluator, interpreter, controller, replayer, clicker, controls); // done something switcher.action(); } catch (Exception ex) { // done something switcher.action(); // error beep ErrorHandler.BeepError(); // press fold PressCheckOrFold(controls, container.Layout, controller); // move mouse to taskbar MoveMouseToTaskBar(controller.Mouse); // report ErrorHandler.ReportTableException(ex, safeTableImage, "Identify table"); continue; } } } } // check table highlights switcher.check(settings.WindowSwitcherActivated); // sleep Thread.Sleep(RandomInt(200, 300)); // end double time = DateTime.Now.Subtract(start).TotalMilliseconds; Log.Debug("## iteration -> end -> " + time + " ms ##"); } }