Симулятор ставок по мартингейлу

Sep 16 2020

Скрипт имитирует стратегию ставок Мартингейл, заключающуюся в размещении фиксированной суммы до тех пор, пока не произойдет проигрыш, после чего игрок удваивает ставку, чтобы компенсировать проигрыш. Это продолжается до тех пор, пока не произойдет выигрыш. После выигрыша ставка сбрасывается до первоначального значения. Я установил шансы, имитирующие блэкджек (шанс выигрыша 49%). Для простоты сумма выигрыша или проигрыша в раунде равна ставке. Симуляция заканчивается, когда указанное количество раундов истекло, размер следующей ставки больше, чем текущие доступные средства, доступные средства достигают 0 или достигнута желаемая прибыль.

Я новичок в Python и программировании в целом, поэтому буду благодарен за любые отзывы.

import random


class MartGame:
    def __init__(self, bet=25, starting_funds=5000, goal_profit=1000, round_n=0, rng_v=0.00,
                 wins=0, losses=0, loss_run=0, win_run=0):
        self.bet = bet
        self.starting_funds = starting_funds
        self.goal_profit = goal_profit
        self.round_n = round_n
        self.rng_v = rng_v
        self.wins = wins
        self.losses = losses
        self.los_run = loss_run
        self.win_run = win_run
        self.original_bet = bet
        self.current_funds = self.starting_funds

    def rng(self):
        """Generates random number"""
        self.rng_v = random.random()

    def winloss_generator(self):
        """Generates win/loss condition"""
        if self.rng_v <= .49:
            return 'win'
        else:
            return 'loss'

    def increase_winloss(self):
        """Increases wins or losses variable based on winloss_generator output"""
        if self.winloss_generator() == 'win':
            self.wins += 1
            return 'win'
        elif self.winloss_generator() == 'loss':
            self.losses += 1
            return 'loss'
        else:
            print('error')

    def increase_round(self):
        """Increases round number by 1"""
        self.round_n += 1

    def change_current_funds(self):
        """Increases or decreases current_funds based on winloss_generator output"""
        if self.winloss_generator() == 'win':
            self.current_funds += self.bet
        elif self.winloss_generator() == 'loss':
            self.current_funds -= self.bet
        else:
            print('error')

    def change_bet(self):
        """If outcome is a win, bet is reset to original value. If outcome is a loss bet is doubled"""
        if self.winloss_generator() == 'win':
            self.bet = self.original_bet
        elif self.winloss_generator() == 'loss':
            self.bet = self.bet * 2

    def running_profit(self):
        """Returns running profit"""
        return self.current_funds - self.starting_funds

    def current_funds(self):
        """Returns running total of funds"""
        return self.current_funds

    def print_current_record(self):
        """Prints current win/loss record to screen"""
        print('Current Record: ', self.wins, 'wins, ', self.losses, 'losses')

    def print_winloss(self):
        """Prints win/loss condition to screen"""
        print(self.winloss_generator())

    def print_profit(self):
        """Prints running profit to screen"""
        print(self.running_profit(), 'running_profit'.upper())

    def print_running_total(self):
        """Prints running total to the screen"""
        print(self.current_funds, 'current funds'.upper())

    def print_round(self):
        """Prints current round"""
        print('Round:', self.round_n)

    def print_current_bet(self):
        """Prints current bet"""
        print('Bet:', self.bet)

    def run(self, rounds, each=False):
        """Runs simulation for specified number of rounds. 'each' argument indicates
        whether each round should be displayed. False will only display the final results"""
        while self.running_profit() < self.goal_profit and \
                self.round_n < rounds and self.current_funds > 0 \
                and self.current_funds > self.bet:
            self.increase_round()
            self.rng()
            self.winloss_generator()
            self.increase_winloss()
            self.change_current_funds()
            if each is True:
                self.print_round()
                self.print_current_bet()
                self.print_winloss()
                self.print_running_total()
                self.print_profit()
                self.print_current_record()
                print()
            self.change_bet()
        print()
        self.end_script()

    def end_script(self):
        """Prints final outcome of the simulation and summary of the results"""
        if self.running_profit() == self.goal_profit:
            print('YOU WIN!')
        else:
            print('YOU LOSE')
        print("Total Rounds:", self.round_n)
        print('Win/Loss Record: ', self.wins, 'Wins', self.losses, 'Losses')
        print('Ending Funds:', self.current_funds)
        print('Goal Profit:', self.goal_profit)
        print("Ending Profit:", self.running_profit())


inst = MartGame(25, 5000, 1000)

inst.run(1000, True)
```

Ответы

2 user985366 Sep 16 2020 at 03:51

Классы полезны, когда вы хотите создать более одного объекта из одного класса или создавать и уничтожать объекты во время работы. В этом случае у вас есть только один объект.

Это не та программа, где вам нужен урок. Если бы вы не использовали класс, вы могли бы иметь точно такую ​​же программу, но удалить все self.в своем коде, что сделает его короче и проще для чтения и записи.

Все это тоже не нужно (если вы не используете класс), поскольку переменные будут просто глобальными внутри скрипта или локальными внутри вашей main()функции, если она у вас есть.

    self.bet = bet
    self.starting_funds = starting_funds
    self.goal_profit = goal_profit
    self.round_n = round_n
    self.rng_v = rng_v
    self.wins = wins
    self.losses = losses
    self.los_run = loss_run
    self.win_run = win_run
    self.original_bet = bet
    self.current_funds = self.starting_funds

Функция ниже также бессмысленна, независимо от того, используете ли вы класс или нет. Он используется только в одном месте кода, поэтому он сэкономит строки кода и умственные способности разработчика, чтобы просто увеличить переменную непосредственно в этом одном месте, а не делать это через функцию.

def increase_round(self):
    """Increases round number by 1"""
    self.round_n += 1

Функция ниже еще более бесполезна. Он даже не вызывается, поскольку вы (правильно) ссылаетесь на переменную непосредственно там, где она используется. У него то же имя, что и у переменной current_funds, что может привести к проблемам.

def current_funds(self):
    """Returns running total of funds"""
    return self.current_funds

Ниже выглядит странно. Почему бы тебе просто не распечатать 'RUNNING_PROFIT'?

'running_profit'.upper()