from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import random author = 'Your name here' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'bribery_game' players_per_group = 2 num_rounds = 3 transfer_fee = c(-2) x_pay = c(36) y1_pay = c(56) y2_pay = c(30) multiplier = 3 class Subsession(BaseSubsession): def creating_session(self): if self.round_number == 1: for p in self.get_players(): p.participant.vars['dead'] = False import itertools treatments = itertools.cycle([True, False]) for g in self.get_groups(): g.sudden_death = next(treatments) for p in g.get_players(): p.participant.vars['treatment'] = g.sudden_death else: for g in self.get_groups(): g.sudden_death = g.get_player_by_id(1).participant.vars['treatment'] class Group(BaseGroup): sudden_death = models.BooleanField() dead = models.BooleanField(initial=False) transfer = models.CurrencyField(choices=[[c(0), "No transfer"], [c(1), "1 point"], [c(2), "2 points"], [c(3), "3 points"], [c(4), "4 points"], [c(5), "5 points"], [c(6), "6 points"], [c(7), "7 points"], [c(8), "8 points"], [c(9), "9 points"],], label="Please choose how much you want to transfer to Player 2.", widget=widgets.RadioSelect) accept = models.BooleanField(label="Do you accept the transfer of Player 1?", choices=[[True, "Yes"], [False, "No"]], widget=widgets.RadioSelect) choice = models.BooleanField(label="Your choice:", choices=[[True, "X"], [False, "Y"]], widget=widgets.RadioSelect) def set_payoffs(self): p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) if self.transfer != 0: if self.accept and self.choice: p1.payoff = Constants.x_pay - Constants.transfer_fee - self.transfer p2.payoff = Constants.x_pay + Constants.multiplier*self.transfer if self.accept and not self.choice: p1.payoff = Constants.y1_pay - Constants.transfer_fee - self.transfer p2.payoff = Constants.y2_pay + Constants.multiplier * self.transfer if not self.accept and self.choice: p1.payoff = Constants.x_pay - Constants.transfer_fee p2.payoff = Constants.x_pay if not self.accept and not self.choice: p1.payoff = Constants.y1_pay - Constants.transfer_fee p2.payoff = Constants.y1_pay else: if self.choice: p1.payoff = Constants.x_pay p2.payoff = Constants.x_pay else: p1.payoff = Constants.y1_pay p2.payoff = Constants.y2_pay if self.sudden_death: lottery = random.randint(1, 1000) if lottery < 500 and self.transfer != 0 and self.accept: self.dead = True p1.participant.vars['dead'] = True p2.participant.vars['dead'] = True class Player(BasePlayer): def role(self): if self.id_in_group == 1: self.role = "Briber" else: self.role = "Bribee" return self.role