from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) from numpy import random author = 'Your name here' doc = """ Your app description """ class Constants(BaseConstants) : name_in_url = 'ultimatum_game' players_per_group = 3 num_rounds = 5 amount = c(100) participation_fee = c(50) class Subsession(BaseSubsession) : pass class Group(BaseGroup) : split_amount = models.CurrencyField(min=0, max=Constants.amount, label='How much do you want to split to the other players?') def set_payoffs(self) : p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) p3 = self.get_player_by_id(3) if p2.receiver_response == True and p3.receiver_response == True : for p in self.get_players() : p.payoff = self.split_amount p1.payoff = (p1.payoff + Constants.amount - (3 * self.split_amount)) else : for p in self.get_players() : p.payoff = 0 while self.round_number == 5 : for p in self.get_players() : l = [p.in_round(5).payoff, p.in_round(4).payoff, p.in_round(3).payoff, p.in_round(2).payoff, p.in_round(1).payoff ] for p in self.get_players() : p.final_payoff = (random.choice(l, replace=True) + Constants.amount - (3 * self.split_amount) + Constants.participation_fee) self.round_number = self.round_number + 1 class Player(BasePlayer) : receiver_response = models.BooleanField(label='Do you accept the proposed split amount?') final_payoff = models.CurrencyField(min=0, max=Constants.amount, label='Your final Payoff from the game') Name = models.StringField(label='Please enter your Name') Gender = models.StringField(label='Please enter your gender')