from otree.api import * import random doc = """ Part 2a """ class C(BaseConstants): NAME_IN_URL = 'Part2a' 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 ) number2 = models.IntegerField() number2_previous = models.IntegerField(initial=0) sum_claims = models.IntegerField() sum_previous = models.IntegerField() potential_payoff2 =models.IntegerField() payoff_value2= models.IntegerField() def production_sum(player): if player.round_number == 1: if player.threshold_check == False: player.sum_claims = player.number2 player.sum_previous = 0 player.potential_payoff2 = player.number2 player.payoff_value2= player.number2 else: player.sum_claims = 0 player.sum_previous = 0 player.potential_payoff2 = 0 player.payoff_value2=0 else: if player.threshold_check == False: player.sum_claims = player.in_previous_rounds()[-1].sum_claims + player.number2 player.sum_previous = player.in_previous_rounds()[-1].sum_claims player.potential_payoff2 = player.in_previous_rounds()[-1].sum_claims + player.number2 player.payoff_value2= player.in_previous_rounds()[-1].payoff_value2 + player.number2 else: player.sum_claims = player.in_previous_rounds()[-1].sum_claims player.sum_previous = player.in_previous_rounds()[-1].sum_claims player.potential_payoff2 = player.in_previous_rounds()[-1].sum_claims player.payoff_value2= player.in_previous_rounds()[-1].payoff_value2 return { 'sum_claim': player.sum_claims, 'sum_prev': player.sum_previous, 'payoff2': player.potential_payoff2, 'value2': player.payoff_value2 } def threshold_computation(player): if player.round_number == 1: player.threshold = random.randint(0,100) player.number2_previous = 0 else: player.threshold = player.in_previous_rounds()[0].threshold player.number2_previous = player.in_previous_rounds()[-1].number2 return { 'threshold_value': player.threshold, 'previous_number': player.number2_previous } def threshold_exceeded(player): if player.number2 > 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 = ["number2"] @staticmethod def before_next_page(player, timeout_happened): player.participant.vars['chosen_number'] = player.number2 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','payoff2','value2'] = production_sum(player) @staticmethod def before_next_page(player, timeout_happened): player.participant.vars['mypayoff2'] = player.potential_payoff2 player.participant.vars['payoff_value2'] = player.payoff_value2 player.participant.vars['number2.2'] = player.number2 player.participant.vars['number2.1'] = player.number2_previous @staticmethod def app_after_this_page(player, upcoming_apps): if player.round_number == 2: return upcoming_apps[3] 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','payoff2','value2'] = production_sum(player) @staticmethod def before_next_page(player, timeout_happened): player.participant.vars['mypayoff2'] = player.potential_payoff2 player.participant.vars['payoff_value2'] = player.payoff_value2 player.participant.vars['number2.2'] = 0 player.participant.vars['number2.1'] = player.number2_previous @staticmethod def app_after_this_page(player, upcoming_apps): return upcoming_apps[3] page_sequence = [Start, Decision, Result, Result2]