from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, Currency ) import random doc = """ This is a standard 2-player trust game where the amount sent by player 1 gets tripled. The trust game was first proposed by Berg, Dickhaut, and McCabe (1995) . """ class Constants(BaseConstants): question_num = 1 name_in_url = 'trust' players_per_group = None num_rounds = 1 instructions_template = 'trust/instructions.html' # Initial amount allocated to each player endowment = c(100) multiplier = 3 offer_increment = c(10) offer_choices = currency_range(0, endowment, offer_increment) offer_choices_count = len(offer_choices) keep_give_amounts = [] for offer in offer_choices: keep_give_amounts.append((offer, endowment - offer)) class Subsession(BaseSubsession): pass # def creating_session(self): # self.group_randomly() class Group(BaseGroup): use_strategy_method = models.BooleanField( doc="""Whether this group uses strategy method""" ) sent_back_amount = models.CurrencyField(initial=c(0)) sent_amount_group = models.CurrencyField(initial=c(0)) def set_roles(self): p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) self.sent_amount_group = p1.sent_amount if self.sent_amount_group == c(0): self.sent_back_amount = c(0) else: if self.sent_amount_group == c(10): self.sent_back_amount = p2.sent_back_amount1 else: if self.sent_amount_group == c(20): self.sent_back_amount = p2.sent_back_amount2 else: if self.sent_amount_group == c(30): self.sent_back_amount = p2.sent_back_amount3 else: if self.sent_amount_group == c(40): self.sent_back_amount = p2.sent_back_amount4 else: if self.sent_amount_group == c(50): self.sent_back_amount = p2.sent_back_amount5 else: if self.sent_amount_group == c(60): self.sent_back_amount = p2.sent_back_amount6 else: if self.sent_amount_group == c(70): self.sent_back_amount = p2.sent_back_amount7 else: if self.sent_amount_group == c(80): self.sent_back_amount = p2.sent_back_amount8 else: if self.sent_amount_group == c(90): self.sent_back_amount = p2.sent_back_amount9 else: if self.sent_amount_group == c(100): self.sent_back_amount = p2.sent_back_amount10 def set_payoffs(self): p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) p1.payoff_trust = Constants.endowment - self.sent_amount_group + self.sent_back_amount p2.payoff_trust = Constants.endowment + self.sent_amount_group * Constants.multiplier - self.sent_back_amount print('Player 1\'s sent amount:', self.sent_amount_group) print('Player 2\'s sent back amount', self.sent_back_amount) print('Player 1\'s payoff in trust game:', p1.payoff_trust) print('Player 2\'s payoff in trust game:', p2.payoff_trust) for p in self.get_players(): p.participant.vars['payoff_trust'] = p.payoff_trust print('Payoff Trust (participant var):', p.participant.vars['payoff_trust']) class Player(BasePlayer): leader_nudge = models.IntegerField() payoff_trust = models.CurrencyField() sent_amount = models.CurrencyField(widget=widgets.RadioSelect, label="Lütfen göndermek istediğiniz miktarı seçin", choices=Constants.offer_choices ) sent_back_amount1 = models.CurrencyField( label="Elinize 30 TL geçerse (size 10 TL gönderilmişse) kaç TL'sini geri yollarsınız?", min=c(0), max=c(30), ) sent_back_amount2 = models.CurrencyField( label="Elinize 60 TL geçerse (size 20 TL gönderilmişse) kaç TL'sini geri yollarsınız?", min=c(0), max=c(60), ) sent_back_amount3 = models.CurrencyField( label="Elinize 90 TL geçerse (size 30 TL gönderilmişse) kaç TL'sini geri yollarsınız?", min=c(0), max=c(90), ) sent_back_amount4 = models.CurrencyField( label="Elinize 120 TL geçerse (size 40 TL gönderilmişse) kaç TL'sini geri yollarsınız?", min=c(0), max=c(120), ) sent_back_amount5 = models.CurrencyField( label="Elinize 150 TL geçerse (size 50 TL gönderilmişse) kaç TL'sini geri yollarsınız?", min=c(0), max=c(150), ) sent_back_amount6 = models.CurrencyField( label="Elinize 180 TL geçerse (size 60 TL gönderilmişse) kaç TL'sini geri yollarsınız?", min=c(0), max=c(180), ) sent_back_amount7 = models.CurrencyField( label="Elinize 210 TL geçerse (size 70 TL gönderilmişse) kaç TL'sini geri yollarsınız?", min=c(0), max=c(210), ) sent_back_amount8 = models.CurrencyField( label="Elinize 240 TL geçerse (size 80 TL gönderilmişse) kaç TL'sini geri yollarsınız?", min=c(0), max=c(240), ) sent_back_amount9 = models.CurrencyField( label="Elinize 270 TL geçerse (size 90 TL gönderilmişse) kaç TL'sini geri yollarsınız?", min=c(0), max=c(270), ) sent_back_amount10 = models.CurrencyField( label="Elinize 300 TL geçerse (size 100 TL gönderilmişse) kaç TL'sini geri yollarsınız?", min=c(0), max=c(300), ) payoff_trust = models.CurrencyField() def role(self): if self.id_in_group == 1: return 'Sender' if self.id_in_group == 2: return 'Receiver'