from otree.api import * doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'two_PBC' players_per_group = 2 num_rounds = 2 win_payoff = cu(10) lose_payoff = cu(0) proportion = 0.9 class Subsession(BaseSubsession): pass class Group(BaseGroup): target_number = models.FloatField(initial=0) class Player(BasePlayer): number = models.IntegerField( choices=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], widget=widgets.RadioSelect ) diff = models.FloatField() is_winner = models.BooleanField(initial=0) temp_payoff = models.CurrencyField() def creating_session(subsession: Subsession): import random session = subsession.session if subsession.round_number == 1: paying_round = random.randint(1, Constants.num_rounds) session.vars['paying_round'] = paying_round subsession.group_randomly() def set_winner(group: Group): import random players = group.get_players() subsession = group.subsession session = group.session diff_list = [] for p in players: group.target_number += p.number group.target_number = group.target_number*Constants.proportion/Constants.players_per_group for p in players: p.diff = abs(p.number - group.target_number) diff_list.append(p.diff) lowest_diff = min(diff_list) tie = [] for p in players: if p.diff == lowest_diff: tie.append(p.id_in_group) winner = tie[random.randint(0, len(tie)-1)] group.get_player_by_id(winner).is_winner = 1 for p in players: if p.is_winner == 1: p.temp_payoff = Constants.win_payoff else: p.temp_payoff = cu(0) if subsession.round_number == session.vars['paying_round']: p.payoff = p.temp_payoff else: p.payoff = cu(0) # PAGES class Choose(Page): form_model = 'player' form_fields = ['number'] class ResultsWaitPage(WaitPage): after_all_players_arrive = set_winner class Results(Page): def vars_for_template(player: Player): others = player.get_others_in_group() other_number = "" count = 1 for p in others: other_number += str(p.number) if len(others) != count: other_number += ", " count += 1 return dict(other_number = other_number) page_sequence = [Choose, ResultsWaitPage, Results]