from otree.api import * c = cu doc = '' class Constants(BaseConstants): name_in_url = 'Take_Home_Assignment' players_per_group = 2 num_rounds = 1 fixed_wage = 100 multiplier = 1.5 class Subsession(BaseSubsession): pass def generate_num(group): import random group.Random_Numer = random.randint(0,100) def determine_winner(group): A_Diff = abs(group.Group_Member_A_Guess - group.Random_Numer) B_Diff = abs(group.Group_Member_B_Guess - group.Random_Numer) if A_Diff < B_Diff: group.Winner = "Group Member A" if A_Diff > B_Diff: group.Winner = "Group Member B" import random if A_Diff == B_Diff: winner_random = random.randint(1,2) if winner_random == 1: group.Winner = "Group Member A" else: group.Winner = "Group Member B" def calculate_earnings(group): total_contribution = group.Group_Member_A_Contribution + group.Group_Member_B_Contribution multiplied_contribution = total_contribution * Constants.multiplier individual_share = round (multiplied_contribution / Constants.players_per_group, 2) group_member_a = group.get_player_by_id(1) group_member_b = group.get_player_by_id(2) group_member_a.Earnings = Constants.fixed_wage - group.Group_Member_A_Contribution + individual_share group_member_b.Earnings = Constants.fixed_wage - group.Group_Member_B_Contribution + individual_share class Group(BaseGroup): Random_Numer = models.IntegerField() Winner = models.StringField() Group_Member_A_Guess = models.IntegerField(label='Please input your guess [Please input any integer between 0 and 100]', max=100, min=0) Group_Member_B_Guess = models.IntegerField(label='Please input your guess [Please input any integer between 0 and 100]', max=100, min=0) Group_Member_A_Contribution = models.IntegerField(label='How many points do you wish to contribute to the joint project? [Input any integer between 0 and 100]', max=100, min=0) Group_Member_B_Contribution = models.IntegerField(label='How many points do you wish to contribute to the joint project? [Input any integer between 0 and 100]', max=100, min=0) generate_num = generate_num determine_winner = determine_winner calculate_earnings = calculate_earnings class Player(BasePlayer): Individual_Role = models.IntegerField() Earnings = models.FloatField() class P1_A_Decision(Page): form_model = 'group' form_fields = ['Group_Member_A_Guess'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 1 @staticmethod def before_next_page(player, timeout_happened): group = player.group group.generate_num() class P1_B_Decision(Page): form_model = 'group' form_fields = ['Group_Member_B_Guess'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 2 class Waiting_Room_1(WaitPage): after_all_players_arrive = 'determine_winner' title_text = 'Waiting Room' body_text = 'Please wait for your group member to make a guess.' class P1_Results(Page): form_model = 'player' class P2_A_Decision(Page): form_model = 'group' form_fields = ['Group_Member_A_Contribution'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 1 class P2_B_Decision(Page): form_model = 'group' form_fields = ['Group_Member_B_Contribution'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 2 class Waiting_Room_2(WaitPage): after_all_players_arrive = 'calculate_earnings' title_text = 'Waiting Room' body_text = 'Please wait for your group member to make a guess.' class P2_Results(Page): form_model = 'player' page_sequence = [P1_A_Decision, P1_B_Decision, Waiting_Room_1, P1_Results, P2_A_Decision, P2_B_Decision, Waiting_Room_2, P2_Results]