from otree.api import * doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'expg_project' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 20 GUESS_MAX = 100 GUESS_MIN = 0 TEMP_NUM_ROUNDS = int(NUM_ROUNDS / 2) class Subsession(BaseSubsession): pass class Group(BaseGroup): success = models.BooleanField( initial=False ) combined_guesses = models.IntegerField() p1_guess = models.IntegerField() p2_guess = models.IntegerField() class Player(BasePlayer): guess = models.IntegerField( label="Choose a Number between 0 and 100", min = C.GUESS_MIN, max = C.GUESS_MAX ) reason = models.StringField( label="Why did you choose your number?" ) gender = models.StringField( choices=['Male', 'Female', "Other"], label='What is your gender?', widget=widgets.RadioSelect, ) genderguess = models.StringField( choices=['Male', 'Female', "Other"], label='What do you think, what gender your partner is?', widget=widgets.RadioSelect, ) # FUNCTIONS def guess_choices(group): choices = [] choice_numbers = 20 a = C.GUESS_MAX / choice_numbers for i in range(choice_numbers): i = i * a choices.append(int(C.GUESS_MAX-i)) return choices def set_payoffs(group): playerlist = group.get_players() player1 = playerlist[0] player2 = playerlist[1] group.combined_guesses = player1.guess + player2.guess group.p1_guess = player1.guess group.p2_guess = player2.guess if player1.guess + player2.guess <= C.GUESS_MAX: group.success = True player1.payoff += cu(player1.guess) player2.payoff += cu(player2.guess) def opponents_guesses(group): p1_guesses = [g.p1_guess for g in group.in_previous_rounds()] p2_guesses = [g.p2_guess for g in group.in_previous_rounds()] if group.round_number >= C.TEMP_NUM_ROUNDS+1: for i in [g.p1_guess for g in group.in_rounds(1,C.TEMP_NUM_ROUNDS)]: p1_guesses.remove(i) for i in [g.p2_guess for g in group.in_rounds(1,C.TEMP_NUM_ROUNDS)]: p2_guesses.remove(i) return { "p1_guesses": p1_guesses, "p2_guesses": p2_guesses } # PAGES class Guess(Page): form_model = "player" form_fields = ["guess"] @staticmethod def vars_for_template(player): group = player.group return dict(opponents_guesses(group)) class Introduction(Page): form_model = "player" form_fields = ["gender"] @staticmethod def is_displayed(player): return player.round_number == 1 class ResultsWaitPage(WaitPage): after_all_players_arrive = set_payoffs class Results(Page): form_model = "player" form_fields = ["reason"] class Gender(Page): form_model = "player" form_fields = ["genderguess"] @staticmethod def is_displayed(player): return player.round_number == C.NUM_ROUNDS class End(Page): @staticmethod def is_displayed(player): return player.round_number == C.NUM_ROUNDS @staticmethod def vars_for_template(player): score_game1 = sum([p.payoff for p in player.in_rounds(1,C.TEMP_NUM_ROUNDS)]) score_game2 = sum([p.payoff for p in player.in_rounds(C.TEMP_NUM_ROUNDS+1,C.NUM_ROUNDS)]) return { "score_game1": score_game1, "score_game2": score_game2 } page_sequence = [Introduction, Guess, ResultsWaitPage, Results, Gender, End]