from otree.api import * import random doc = """ Part 3a """ class C(BaseConstants): NAME_IN_URL = 'Part3a' PLAYERS_PER_GROUP = None NUM_ROUNDS = 2 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): threshold = models.IntegerField() threshold_check = models.BooleanField() skip_remaining_rounds = models.BooleanField( initial = False ) number3 = models.IntegerField() number3_previous = models.IntegerField(initial=0) sum_claims = models.IntegerField() sum_previous = models.IntegerField() potential_payoff3 = models.IntegerField() payoff_value3 = models.IntegerField() def production_sum(player): if player.round_number == 1: if player.threshold_check == False: player.sum_claims = player.number3 player.sum_previous = 0 player.potential_payoff3 = player.number3 player.payoff_value3 = player.number3 else: player.sum_claims = 0 player.sum_previous = 0 player.potential_payoff3= 0 player.payoff_value3 = 0 else: if player.threshold_check == False: player.sum_claims = player.in_previous_rounds()[-1].sum_claims + player.number3 player.sum_previous = player.in_previous_rounds()[-1].sum_claims player.potential_payoff3 = player.in_previous_rounds()[-1].sum_claims + player.number3 player.payoff_value3 = player.in_previous_rounds()[-1].payoff_value3 + player.number3 else: player.sum_claims = player.in_previous_rounds()[-1].sum_claims player.sum_previous = player.in_previous_rounds()[-1].sum_claims player.potential_payoff3 = player.in_previous_rounds()[-1].sum_claims player.payoff_value3 = player.in_previous_rounds()[-1].payoff_value3 return { 'sum_claim': player.sum_claims, 'sum_prev': player.sum_previous, 'payoff3': player.potential_payoff3, 'value3': player.payoff_value3 } def threshold_computation(player): if player.round_number == 1: player.threshold = random.randint(0,100) player.number3_previous = 0 else: player.threshold = player.in_previous_rounds()[0].threshold player.number3_previous = player.in_previous_rounds()[-1].number3 return { 'threshold_value': player.threshold, 'previous_number': player.number3_previous } def threshold_exceeded(player): if player.number3 > player.threshold: player.threshold_check = True player.skip_remaining_rounds = True else: player.threshold_check = False player.skip_remaining_rounds = False return { 'threshold_checker': player.threshold_check } # PAGES class Start(Page): @staticmethod def is_displayed(player): return player.round_number == 1 @staticmethod def before_next_page(player, timeout_happened): player.participant.vars['threshold_value'] = threshold_computation(player) class Decision(Page): form_model= "player" form_fields = ["number3"] @staticmethod def before_next_page(player, timeout_happened): player.participant.vars['chosen_number'] = player.number3 player.participant.vars['threshold_checker'] = threshold_exceeded(player) @staticmethod def vars_for_template(player): player.participant.vars['threshold_value','previous_number'] = threshold_computation(player) class Result(Page): @staticmethod def is_displayed(player): return player.threshold_check == False @staticmethod def vars_for_template(player): player.participant.vars['sum_claim','sum_prev','payoff3','value3'] = production_sum(player) @staticmethod def app_after_this_page(player, upcoming_apps): if player.round_number == 2: return upcoming_apps[1] @staticmethod def before_next_page(player, timeout_happened): player.participant.vars['mypayoff3'] = player.potential_payoff3 player.participant.vars['payoff_value3'] = player.payoff_value3 player.participant.vars['number3.2'] = player.number3 player.participant.vars['number3.1'] = player.number3_previous class Result2(Page): @staticmethod def is_displayed(player): return player.threshold_check == True @staticmethod def vars_for_template(player): player.participant.vars['sum_claim','sum_prev','payoff3','value3'] = production_sum(player) @staticmethod def app_after_this_page(player, upcoming_apps): return upcoming_apps[1] @staticmethod def before_next_page(player, timeout_happened): player.participant.vars['mypayoff3'] = player.potential_payoff3 player.participant.vars['payoff_value3'] = player.payoff_value3 player.participant.vars['number3.2'] = 0 player.participant.vars['number3.1'] = player.number3_previous page_sequence = [Start, Decision, Result, Result2]