from otree.api import * c = cu doc = '' class C(BaseConstants): PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 4 NAME_IN_URL = 'my_duel' INTERCEPT1_1 = 10 SLOPE1_1 = 10 INTERCEPT1_2 = 10 SLOPE1_2 = 10 INTERCEPT2_1 = 10 SLOPE2_1 = 5 INTERCEPT2_2 = 10 SLOPE2_2 = 5 INTERCEPT3_1 = 10 SLOPE3_1 = 20 INTERCEPT3_2 = 10 SLOPE3_2 = 20 INTERCEPT4_1 = 0 SLOPE4_1 = 10 INTERCEPT4_2 = 0 SLOPE4_2 = 10 INTERCEPTS_1 = (10, 10, 10, 0) INTERCEPTS_2 = (10, 10, 10, 0) SLOPES_1 = (10, 5, 20, 10) SLOPES_2 = (10, 5, 20, 10) ROUNDS = (1, 2, 3, 4) ROUND_VECTOR = () class Subsession(BaseSubsession): RAND_ROUND_ORDER = models.IntegerField() RAND_PERM_VECTOR = models.IntegerField() J_ROUND = models.IntegerField() def my_method(subsession: Subsession): pass Subsession.my_method = my_method class Group(BaseGroup): PROB_A = models.IntegerField() PROB_B = models.IntegerField() launchtext = models.StringField() DUMMY_LAUNCH_A = models.IntegerField() DUEL_A = models.IntegerField(label=' In what period (0 to 20) do you want to launch your project in?', max=20, min=0) DUEL_B = models.IntegerField(label=' In what period (0 to 20) do you want to launch your project in?', max=20, min=0) WIN_LAUNCH_A = models.IntegerField() WIN_LAUNCH_B = models.IntegerField() wintext = models.StringField() WIN_PROB_LAUNCH = models.IntegerField() FAST_WIN = models.IntegerField() tiebreaker = models.IntegerField() ROUND_PAYOFF_A = models.IntegerField() RAND_PERMUTATION_VECTOR = models.IntegerField() ROUND_PAYOFF_B = models.IntegerField() J_ROUND = models.IntegerField() successprob = models.IntegerField() def duelguess(group: Group): import random group.PROB_A =min((C.INTERCEPTS_1[group.round_number-1]+(C.SLOPES_1[group.round_number-1]*group.DUEL_A)),100) group.PROB_B= min((C.INTERCEPTS_2[group.round_number-1]+ (C.SLOPES_2[group.round_number-1]*group.DUEL_B)),100) #who launches first if group.DUEL_A< group.DUEL_B: group.launchtext="Participant A launched first" group.DUMMY_LAUNCH_A=0 if group.DUEL_A> group.DUEL_B: group.launchtext="Participant B launched first" group.DUMMY_LAUNCH_A=1 #tiebreaking if group.DUEL_A== group.DUEL_B: group.launchtext="Participant A launched first" group.DUMMY_LAUNCH_A=1 #win#ner a=random.choices(population=[1,0],weights=[(group.PROB_A/100), 1-(group.PROB_A/100)],k=1) group.WIN_LAUNCH_A=int(a[0]) b=random.choices(population=[1,0],weights=[(group.PROB_B)/100, 1-((group.PROB_B)/100)],k=1) group.WIN_LAUNCH_B=int(b[0]) if group.DUMMY_LAUNCH_A==0: if group.WIN_LAUNCH_A==1: group.wintext="The launch was successful" group.WIN_PROB_LAUNCH= group.PROB_A group.FAST_WIN=1 group.ROUND_PAYOFF_A=1 group.ROUND_PAYOFF_B=0 if group.WIN_LAUNCH_A==0: group.wintext="The launch was not successful" group.WIN_PROB_LAUNCH= group.PROB_A group.FAST_WIN=0 group.ROUND_PAYOFF_A=0 group.ROUND_PAYOFF_B=0 if group.DUMMY_LAUNCH_A==1: if group.WIN_LAUNCH_B==1: group.wintext="The launch was successful" group.WIN_PROB_LAUNCH= group.PROB_B group.FAST_WIN=1 group.ROUND_PAYOFF_A=0 group.ROUND_PAYOFF_B=1 if group.WIN_LAUNCH_B==0: group.wintext="The launch was not successful" group.WIN_PROB_LAUNCH= group.PROB_B group.FAST_WIN=0 group.ROUND_PAYOFF_A=0 group.ROUND_PAYOFF_B=0 Group.duelguess = duelguess class Player(BasePlayer): roundimage = models.StringField() class Instructions1(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number==1 class Instructions2(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number==1 class Instructions3(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number==1 class Instructions4(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number==1 class Instructions5(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number==1 class Instructions6(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number==1 class Decision1(Page): form_model = 'group' form_fields = ['DUEL_A'] @staticmethod def is_displayed(player: Player): group = player.group return player.in_round(player.round_number).id_in_group == 1 @staticmethod def vars_for_template(player: Player): group = player.group return dict(roundimage=str("https://celss.iserp.columbia.edu/sites/default/files/content/images/Experiments/DuelTask/DuelImage_PA_")+str(C.INTERCEPTS_1[group.round_number-1])+"_"+str(C.SLOPES_1[group.round_number-1])+"_PB_"+str(C.INTERCEPTS_2[group.round_number-1])+"_"+str(C.SLOPES_2[group.round_number-1])+".png") class Decision2(Page): form_model = 'group' form_fields = ['DUEL_B'] @staticmethod def is_displayed(player: Player): group = player.group return player.in_round(player.round_number).id_in_group == 2 @staticmethod def vars_for_template(player: Player): group = player.group return dict(roundimage=str("https://celss.iserp.columbia.edu/sites/default/files/content/images/Experiments/DuelTask/DuelImage_PA_")+str(C.INTERCEPTS_1[group.round_number-1])+"_"+str(C.SLOPES_1[group.round_number-1])+"_PB_"+str(C.INTERCEPTS_2[group.round_number-1])+"_"+str(C.SLOPES_2[group.round_number-1])+".png") class ResultsWaitPage(WaitPage): after_all_players_arrive = duelguess class Results(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): group = player.group return player.in_round(player.round_number).id_in_group == 1 class Results2(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): group = player.group return player.in_round(player.round_number).id_in_group == 2 page_sequence = [Instructions1, Instructions2, Instructions3, Instructions4, Instructions5, Instructions6, Decision1, Decision2, ResultsWaitPage, Results, Results2]