from otree.api import * class Constants(BaseConstants): name_in_url = 'Harvard' players_per_group = 5 num_rounds = 1 jackpot = 100 guess_max = 100 rules = 'Harvard/rules.html' class Subsession(BaseSubsession): pass def set_payoffs(group): players = group.get_players() guesses = [p.guess for p in players] half_avg = (1 / 2) * sum(guesses) / len(players) group.half_avg = round(half_avg, 2) group.best_guess = min(guesses, key=lambda guess: abs(guess - group.half_avg)) winners = [p for p in players if p.guess == group.best_guess] group.num_winners = len(winners) for p in winners: p.is_winner = True p.payoff = Constants.jackpot / group.num_winners def half_history(group): return [g.half_avg for g in group.in_previous_rounds()] class Group(BaseGroup): half_avg = models.FloatField() best_guess = models.IntegerField() num_winners = models.IntegerField() class Player(BasePlayer): guess = models.IntegerField(label='Выберите число от 0 до 100', max=Constants.guess_max, min=0) is_winner = models.BooleanField(initial=False) name = models.StringField(label="Ваше имя:") gr = models.StringField(label="Ваша группа:") class Intro(Page): form_model = 'player' form_fields = ['name', 'gr'] @staticmethod def is_displayed(player): return player.round_number == 1 class Choice(Page): form_model = 'player' form_fields = ['guess'] @staticmethod def vars_for_template(player): group = player.group return dict(half_history=half_history(group)) class ResultsWaitPage(WaitPage): after_all_players_arrive = 'set_payoffs' class Results(Page): form_model = 'player' @staticmethod def vars_for_template(player): group = player.group sorted_guesses = sorted(p.guess for p in group.get_players()) return dict(sorted_guesses=sorted_guesses) page_sequence = [Intro, Choice, ResultsWaitPage, Results]