from otree.api import * doc = """ Your app description This is the Period 1 of the fishery game where participants plays the baseline (unregulated) game. """ class C(BaseConstants): NAME_IN_URL = 'fishery_game_P1' PLAYERS_PER_GROUP = 5 NUM_ROUNDS = 6 # INSTRUCTIONS_TEMPLATE = 'fishery_game_project/instructions.html' class Subsession(BaseSubsession): pass class Group(BaseGroup): bottom_up = models.BooleanField() opt_out = models.BooleanField() low_state = models.BooleanField(initial=True) fisher_entered = models.IntegerField(initial=0) prev_rounds = models.IntegerField(initial=0) class Player(BasePlayer): area_choice = models.IntegerField(initial=None, choices=[[1, 'Area A'],[0, 'Area B']], widget=widgets.RadioSelect, label="I choose to fish in " ) entered = models.BooleanField() @staticmethod def fishermen_entered(player): if player.area_choice == 1: player.entered = True # FUNCTIONS # . def creating_session(subsession): import random for group in subsession.get_groups(): bottom_up = random.choice([True, False]) print('receive opportunity to change rules later', bottom_up) # for group in subsession.get_groups(): # opt_out = random.choice([True, False]) # print('receive opportunity to opt out later', opt_out) def calc_fisher_entered(group: Group): players = group.get_players() print('in calc_fisher_enter function') enterance = [p.area_choice for p in players] print('enterance:', enterance) group.fisher_entered = sum(enterance) print('sum is:', group.fisher_entered) def calculating_state(group): import random if group.fisher_entered == 0: p = 0.1 if random.random() <= p: group.low_state = True elif group.fisher_entered == 1: p = 0.3 if random.random() <= p: group.low_state = True elif group.fisher_entered == 2: p = 0.5 if random.random() <= p: group.low_state = True elif group.fisher_entered == 3: p = 0.8 if random.random() <= p: group.low_state = True else: group.low_state = True def area_change(group): pr1 = group.in_round(group.in_round - 1) pr2 = group.in_round(group.in_round - 2) group.prev_rounds = pr1.fisher_entered + pr2.fisher_entered if group.prev_rounds == 0: group.low_state = False # def creating_session(subsession): # if subsession.round_number == 1: # subsession.group_randomly() # else: # subsession.group_like_round(1) def set_payoffs(group): for p in group.get_players(): if group.round_number <= 2: p.payoff = 3 else: if group.low_state: p.payoff = 3 else: if p.area_choice == 1: p.payoff = 10 else: p.payoff = 6 # PAGES class Introduction(Page): @staticmethod def is_displayed(player): return player.round_number == 1 class Decide(Page): form_model = 'player' form_fields = ['area_choice'] class ResultsWaitPage(WaitPage): form_model = 'group' form_fields = ['low_state', 'fisher_entered', 'prev_rounds'] body_text = "Waiting for the other participant to decide." after_all_players_arrive1 = calculating_fisher after_all_players_arrive2 = calculating_state after_all_players_arrive3 = area_change after_all_players_arrive4 = set_payoffs class Results(Page): @staticmethod def vars_for_template(player: Player): return dict(player_area_choice=player.area_choice) @staticmethod def vars_for_template(player: Player): return dict(player_payoff=player.payoff) page_sequence = [Introduction, Decide, ResultsWaitPage, Results] def calc_area_change(group: Group): if group.round_number >= 2: pr1 = group.in_round(group.round_number) pr2 = group.in_round(group.round_number - 1) prev_rounds = pr1.fisher_entered + pr2.fisher_entered if prev_rounds == 0: group.low_state = False print('CHANGE low state:', group.low_state) else: group.low_state = group.low_state print('CHANGE low state:', group.low_state) def calc_area_state(group: Group): players = group.get_players() enterance = [p.area_choice for p in players] group.fisher_entered = sum(enterance) import random random_numb = random.random() random_numb = round(random_numb, 2) if group.fisher_entered == 0: p = 0.1 if random_numb <= p: group.low_state = True print('low state:', group.low_state) print('fisher entered:', group.fisher_entered, 'generated random:', random_numb, 'VS', p) elif group.fisher_entered == 1: p = 0.3 if random_numb <= p: group.low_state = True print('low state:', group.low_state) print('fisher entered:', group.fisher_entered, 'generated random:', random_numb, 'VS', p) elif group.fisher_entered == 2: p = 0.5 if random_numb <= p: group.low_state = True print('low state:', group.low_state) print('fisher entered:', group.fisher_entered, 'generated random:', random_numb, 'VS', p) elif group.fisher_entered == 3: p = 0.8 if random_numb <= p: group.low_state = True print('low state:', group.low_state) print('fisher entered:', group.fisher_entered, 'generated random:', random_numb, 'VS', p) elif group.fisher_entered == 4: group.low_state = True print('fucked up') ////////////////////////////////////// from otree.api import * import itertools doc = """ Your app description This is the Period 1 of the fishery game where participants plays the baseline (unregulated) game. """ class C(BaseConstants): NAME_IN_URL = 'fishery_game_P1' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 8 INSTRUCTIONS_TEMPLATE = 'fishery_game_P1/instructions.html' class Subsession(BaseSubsession): pass class Group(BaseGroup): treatment_group = models.IntegerField() low_state = models.BooleanField(initial=True, choices=[[True, 'low state'], [False, 'high state']] ) fisher_entered = models.IntegerField(initial=0) fisher_not_entered = models.IntegerField(initial=0) rounds_remain = models.IntegerField(initial=2) class Player(BasePlayer): area_choice = models.IntegerField(initial=None, choices=[[1, 'Area A'], [0, 'Area B']], widget=widgets.RadioSelectHorizontal, label="I choose to fish in:") total_payoff = models.IntegerField(initial=0) # FUNCTIONS def creating_session(subsession): treatments = itertools.cycle([1, 2, 3, 4]) for group in subsession.get_groups(): group.treatment_group = next(treatments) def calc_area_change(group: Group): players = group.get_players() enterance = [p.area_choice for p in players] group.fisher_entered = sum(enterance) group.fisher_not_entered = C.PLAYERS_PER_GROUP - group.fisher_entered if group.round_number >= 2: pr1 = group.in_round(group.round_number) pr2 = group.in_round(group.round_number - 1) group.low_state = pr2.low_state prev_rounds = pr1.fisher_entered + pr2.fisher_entered if prev_rounds == 0: group.low_state = False print('CHANGE low state:', group.low_state) else: import random random_numb = random.random() random_numb = round(random_numb, 2) print('START RANDOM area state is low:', group.low_state) if group.fisher_entered == 0: p = 0.1 if random_numb <= p: group.low_state = True print('RANDOM 0.1 CHANGED low state:', group.low_state) else: print('0.1 - random did not affect') print('fisher entered:', group.fisher_entered, 'generated random:', random_numb, 'VS', p) elif group.fisher_entered == 1: p = 0.3 if random_numb <= p: group.low_state = True print('RANDOM 0.3 CHANGED low state:', group.low_state) else: print('0.3 - random did not affect') print('fisher entered:', group.fisher_entered, 'generated random:', random_numb, 'VS', p) elif group.fisher_entered == 2: p = 0.5 if random_numb <= p: group.low_state = True print('RANDOM 0.5 CHANGED low state:', group.low_state) else: print('0.5 - random did not affect') print('fisher entered:', group.fisher_entered, 'generated random:', random_numb, 'VS', p) elif group.fisher_entered == 3: p = 0.8 if random_numb <= p: group.low_state = True print('RANDOM 0.8 CHANGED low state:', group.low_state) else: print('0.8 - random did not affect') print('fisher entered:', group.fisher_entered, 'generated random:', random_numb, 'VS', p) elif group.fisher_entered == 4: group.low_state = True print('100% deterioration') def set_payoffs(group: Group): players = group.get_players() for p in players: if group.round_number < 3: p.payoff = 3 print('Round 1 or 2. Payoff is:', p.payoff, 'points.') else: if group.low_state: p.payoff = 3 print('Round 3 and higher.', 'Area is in low state:', group.low_state, 'Payoff is:', p.payoff) else: if p.area_choice == 1: p.payoff = 10 print('Round 3 and higher.', 'Area in low state:', group.low_state, 'Payoff is:', p.payoff) else: p.payoff = 6 print('Round 3 and higher.', 'Area in low state:', group.low_state, 'Payoff is:', p.payoff) def low_state_rounds_remain(group): if group.round_number > 1: pr1 = group.in_round(group.round_number) pr2 = group.in_round(group.round_number - 1) if pr1.low_state: if pr2.low_state: group.rounds_remain = 1 print('rounds remain', group.rounds_remain) else: group.rounds_remain = 2 print('rounds remain', group.rounds_remain) else: group.rounds_remain = 0 print('rounds remain', group.rounds_remain) # PAGES class Introduction(Page): @staticmethod def is_displayed(player): return player.round_number == 1 class Decide(Page): form_model = 'player' form_fields = ['area_choice'] class ResultsWaitPage(WaitPage): body_text = "Waiting for the other participant to decide." after_all_players_arrive = calc_area_change @staticmethod def vars_for_template(player: Player): group = player.group return dict(low_state_rounds_remain=low_state_rounds_remain(group)) class ResultsWaitPage2(WaitPage): after_all_players_arrive = set_payoffs print('payoffs set') class ResultsWaitPage3(WaitPage): @staticmethod def before_next_page(player: Player): player_all_rounds = player.in_all_rounds() player.total_payoff = int(sum([p.payoff for p in player_all_rounds])) return print('total_player_payoff', player.total_payoff) class Feedback(Page): @staticmethod def vars_for_template(player: Player): group = player.group choices = sorted(p.field_display('area_choice') for p in group.get_players()) return dict(choices=choices) page_sequence = [Introduction, Decide, ResultsWaitPage, ResultsWaitPage2, ResultsWaitPage3, Feedback] /////////////////////// import random random_numb = random.random() random_numb = round(random_numb, 2) print('START RANDOM') print(random_numb) if group.fisher_entered == 0: p = 0.1 if random_numb <= p: group.low_state = True print('RANDOM 0.1 CHANGED low state:', group.low_state) else: print('0.1 - random did not affect') print('fisher entered:', group.fisher_entered, 'generated random:', random_numb, 'VS', p) elif group.fisher_entered == 1: p = 0.3 if random_numb <= p: group.low_state = True print('RANDOM 0.3 CHANGED low state:', group.low_state) else: print('0.3 - random did not affect') print('fisher entered:', group.fisher_entered, 'generated random:', random_numb, 'VS', p) elif group.fisher_entered == 2: p = 0.5 if random_numb <= p: group.low_state = True print('RANDOM 0.5 CHANGED low state:', group.low_state) else: print('0.5 - random did not affect') print('fisher entered:', group.fisher_entered, 'generated random:', random_numb, 'VS', p) elif group.fisher_entered == 3: p = 0.8 if random_numb <= p: group.low_state = True print('RANDOM 0.8 CHANGED low state:', group.low_state) else: print('0.8 - random did not affect') print('fisher entered:', group.fisher_entered, 'generated random:', random_numb, 'VS', p) elif group.fisher_entered >= 4: group.low_state = True print('100% deterioration') print(group.field_display('low_state')) return group.low_state