from otree.api import * import random doc = """ Part 1a """ class C(BaseConstants): NAME_IN_URL = 'Part1a' 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 ) number1 = models.IntegerField() number1_previous = models.IntegerField(initial=0) sum_claims = models.IntegerField() sum_previous = models.IntegerField() potential_payoff1 =models.IntegerField() payoff_value1= models.IntegerField() def production_sum(player): if player.round_number == 1: if player.threshold_check == False: player.sum_claims = player.number1 player.sum_previous = 0 player.potential_payoff1 = player.number1 player.payoff_value1= player.number1 else: player.sum_claims = 0 player.sum_previous = 0 player.potential_payoff1= 0 player.payoff_value1= 0 else: if player.threshold_check == False: player.sum_claims = player.in_previous_rounds()[-1].sum_claims + player.number1 player.sum_previous = player.in_previous_rounds()[-1].sum_claims player.potential_payoff1 = player.in_previous_rounds()[-1].sum_claims + player.number1 player.payoff_value1= player.in_previous_rounds()[-1].payoff_value1 + player.number1 else: player.sum_claims = player.in_previous_rounds()[-1].sum_claims player.sum_previous = player.in_previous_rounds()[-1].sum_claims player.potential_payoff1 = player.in_previous_rounds()[-1].sum_claims player.payoff_value1= player.in_previous_rounds()[-1].payoff_value1 return { 'sum_prod': player.sum_claims, 'sum_prev': player.sum_previous, 'payoff1': player.potential_payoff1, 'value1': player.payoff_value1 } def threshold_computation(player): if player.round_number == 1: player.threshold = random.randint(0,100) player.number1_previous = 0 else: player.threshold = player.in_previous_rounds()[0].threshold player.number1_previous = player.in_previous_rounds()[-1].number1 return { 'threshold_value': player.threshold, 'previous_number': player.number1_previous } def threshold_exceeded(player): if player.number1 > 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 = ["number1"] @staticmethod def before_next_page(player, timeout_happened): player.participant.vars['chosen_number'] = player.number1 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','payoff1','value1'] = production_sum(player) @staticmethod def before_next_page(player, timeout_happened): player.participant.vars['mypayoff1'] = player.potential_payoff1 player.participant.vars['payoff_value1'] = player.payoff_value1 player.participant.vars['number1.2'] = player.number1 player.participant.vars['number1.1'] = player.number1_previous @staticmethod def app_after_this_page(player, upcoming_apps): if player.round_number == 2: return upcoming_apps[6] 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','payoff1','value1'] = production_sum(player) @staticmethod def before_next_page(player, timeout_happened): player.participant.vars['mypayoff1'] = player.potential_payoff1 player.participant.vars['payoff_value1'] = player.payoff_value1 player.participant.vars['number1.2'] = 0 player.participant.vars['number1.1'] = player.number1_previous @staticmethod def app_after_this_page(player, upcoming_apps): return upcoming_apps[6] page_sequence = [Start, Decision, Result, Result2]