from otree.api import * c = cu doc = '\nThis is a Colonel Blotto Game under three different conditions.' class Constants(BaseConstants): name_in_url = 'Blotto2' players_per_group = 2 num_rounds = 4 round1_troops1 = 150 round1_troops2 = 96 round1_fronts = 3 win_round_payoff = cu(20) lose_round_payoff = cu(0) tie_round_payoff = cu(10) instructions_template = 'Blotto2/instructions.html' def creating_session(subsession): session = subsession.session subsession.group_randomly() class Subsession(BaseSubsession): pass def set_payoffs(group): for p in group.get_players(): set_payoff(p) class Group(BaseGroup): P1_R1_F1 = models.IntegerField(initial=0, label='How many troops do you allocate to the first front?', max=Constants.round1_troops1, min=0) P1_R1_F2 = models.IntegerField(initial=0, label='How many troops do you allocate to the second front?', max=Constants.round1_troops1, min=0) P1_R1_F3 = models.IntegerField(initial=0, label='How many troops do you allocate to the third front?', max=Constants.round1_troops1, min=0) P2_R1_F1 = models.IntegerField(initial=0, label='How many troops do you allocate to the first front?', max=Constants.round1_troops2, min=0) P2_R1_F2 = models.IntegerField(initial=0, label='How many troops do you allocate to the second front?', max=Constants.round1_troops2, min=0) P2_R1_F3 = models.IntegerField(initial=0, label='How many troops do you allocate to the third front?', max=Constants.round1_troops2, min=0) p1_total_allocation = models.IntegerField(initial=0) p2_total_allocation = models.IntegerField(initial=0) p1_over_allocate = models.BooleanField(initial=False) p2_over_allocate = models.BooleanField(initial=False) p1_fronts_won = models.IntegerField(initial=0) p2_fronts_won = models.IntegerField(initial=0) fronts_tied = models.IntegerField(initial=0) def set_payoff(player): group = player.group group.p1_total_allocation = group.P1_R1_F1 + group.P1_R1_F2 + group.P1_R1_F3 group.p2_total_allocation = group.P2_R1_F1 + group.P2_R1_F2 + group.P2_R1_F3 if group.p1_total_allocation > Constants.round1_troops1: group.p1_over_allocate = True if group.p2_total_allocation > Constants.round1_troops2: group.p2_over_allocate = True if group.p1_over_allocate == True and group.p2_over_allocate == True: player.payoff = Constants.lose_round_payoff elif group.p1_over_allocate == True: if player.id_in_group == 1: player.payoff = Constants.lose_round_payoff else: player.payoff = Constants.win_round_payoff elif group.p2_over_allocate == True: if player.id_in_group == 2: player.payoff = Constants.lose_round_payoff else: player.payoff = Constants.win_round_payoff else: group.p1_fronts_won = 0 group.p2_fronts_won = 0 if player.round_number == 1: if group.P1_R1_F1 > group.P2_R1_F1: group.p1_fronts_won = group.p1_fronts_won + 1 elif group.P1_R1_F1 < group.P2_R1_F1: group.p2_fronts_won = group.p2_fronts_won + 1 else: group.fronts_tied = group.fronts_tied + 1 if group.P1_R1_F2 > group.P2_R1_F2: group.p1_fronts_won = group.p1_fronts_won + 1 elif group.P1_R1_F2 < group.P2_R1_F2: group.p2_fronts_won = group.p2_fronts_won + 1 else: group.fronts_tied = group.fronts_tied + 1 if group.P1_R1_F3 > group.P2_R1_F3: group.p1_fronts_won = group.p1_fronts_won + 1 elif group.P1_R1_F3 < group.P2_R1_F3: group.p2_fronts_won = group.p2_fronts_won + 1 else: group.fronts_tied = group.fronts_tied + 1 if player.id_in_group == 1: if group.p1_fronts_won > group.p2_fronts_won: player.payoff = Constants.win_round_payoff elif group.p1_fronts_won < group.p2_fronts_won: player.payoff = Constants.lose_round_payoff else: player.payoff = Constants.tie_round_payoff else: if group.p1_fronts_won < group.p2_fronts_won: player.payoff = Constants.win_round_payoff elif group.p1_fronts_won > group.p2_fronts_won: player.payoff = Constants.lose_round_payoff else: player.payoff = Constants.tie_round_payoff class Player(BasePlayer): pass class Round1_Player1(Page): form_model = 'group' form_fields = ['P1_R1_F1', 'P1_R1_F2', 'P1_R1_F3'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 1 class Round1_Player2(Page): form_model = 'group' form_fields = ['P2_R1_F1', 'P2_R1_F2', 'P2_R1_F3'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 2 class ResultsWaitPage(WaitPage): after_all_players_arrive = set_payoffs class Results(Page): form_model = 'player' page_sequence = [Round1_Player1, Round1_Player2, ResultsWaitPage, Results]