from otree.api import * c = cu doc = '' class Constants(BaseConstants): name_in_url = 'Competition_PublicGoodsGame' players_per_group = 2 num_rounds = 1 fixed_wage = 100 multiple = 1.5 class Subsession(BaseSubsession): pass def decide_winner(group): DiffA=abs(group.Computer_Num-group.GuessA) DiffB=abs(group.Computer_Num-group.GuessB) if DiffA < DiffB: group.Winner="Group Member A" if DiffB < DiffA: group.Winner="Group Member B" import random if DiffA == DiffB: tie_winner = random.randint(1,2) if tie_winner == 1: group.Winner="Group Member A" else: group.Winner="Group Member B" def decide_earnings(group): Total_Contribution = group.ContributionA + group.ContributionB Project_profit = Total_Contribution * Constants.multiple Divided_project_profit = Project_profit / Constants.players_per_group Member_A = group.get_player_by_id(1) Member_B = group.get_player_by_id(2) Member_A.Earnings = Constants.fixed_wage - group.ContributionA + Divided_project_profit Member_B.Earnings = Constants.fixed_wage - group.ContributionB + Divided_project_profit class Group(BaseGroup): GuessA = models.IntegerField(label='Please input your guess:', max=100, min=0) GuessB = models.IntegerField(label='Please input your guess:', max=100, min=0) ContributionA = models.IntegerField(label='Please make a decision: How many points do you wish to contribute to the joint project? [Input any integer between 0 and 100]', max=Constants.fixed_wage, min=0) ContributionB = models.IntegerField(label='Please make a decision: How many points do you wish to contribute to the joint project? [Input any integer between 0 and 100]', max=Constants.fixed_wage, min=0) Computer_Num = models.IntegerField() Winner = models.StringField() class Player(BasePlayer): IndivRole = models.IntegerField() Earnings = models.FloatField() class Part1_DecisionA(Page): form_model = 'group' form_fields = ['GuessA'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 1 class Part1_DecisionB(Page): form_model = 'group' form_fields = ['GuessB'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group==2 @staticmethod def before_next_page(player, timeout_happened): group = player.group import random group.Computer_Num = random.randint(0,100) class Part1_WaitingRoom(WaitPage): after_all_players_arrive = 'decide_winner' title_text = 'Waiting Room' body_text = 'Please wait until all group members make decision.' class Part1_Result(Page): form_model = 'player' class Part2_DecisionA(Page): form_model = 'group' form_fields = ['ContributionA'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group ==1 class Part2_DecisionB(Page): form_model = 'group' form_fields = ['ContributionB'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group==2 class Part2_WaitingRoom(WaitPage): after_all_players_arrive = 'decide_earnings' title_text = 'Waiting Room' body_text = 'Please wait until all group members make decision.' class Part2_Result(Page): form_model = 'player' page_sequence = [Part1_DecisionA, Part1_DecisionB, Part1_WaitingRoom, Part1_Result, Part2_DecisionA, Part2_DecisionB, Part2_WaitingRoom, Part2_Result]