from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random doc = """ This is asymmetric Volunteer's Dilemma game based on Diekmann & Przepiorka (2016). """ class Constants(BaseConstants): name_in_url = 'VOD' players_per_group = 3 num_rounds = 22 num_other_players = players_per_group - 1 # """Payoff for each player if at least one volunteers""" general_benefit = c(80) # """Payoff for each player if no one volunteers""" no_benefit = c(0) # """Cost incurred by volunteering player""" volunteer_cost_weak = c(50) volunteer_cost_strong = c(10) class Subsession(BaseSubsession): pass class Group(BaseGroup): p1_volunteer = models.StringField( choices=['True', 'False'] ) p2_volunteer = models.StringField( choices=['True', 'False'] ) p3_volunteer = models.StringField( choices=['True', 'False'] ) p1payoff = models.CurrencyField() p2payoff = models.CurrencyField() p3payoff = models.CurrencyField() allpayoff = models.CurrencyField() 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 self.p1_volunteer == "True" and self.p2_volunteer == "True" and self.p3_volunteer == "True": p1.payoff = Constants.general_benefit - Constants.volunteer_cost_strong p2.payoff = Constants.general_benefit - Constants.volunteer_cost_weak p3.payoff = Constants.general_benefit - Constants.volunteer_cost_weak elif self.p1_volunteer == "True" and self.p2_volunteer == "True": p1.payoff = Constants.general_benefit - Constants.volunteer_cost_strong p2.payoff = Constants.general_benefit - Constants.volunteer_cost_weak p3.payoff = Constants.general_benefit elif self.p1_volunteer == "True" and self.p3_volunteer == "True": p1.payoff = Constants.general_benefit - Constants.volunteer_cost_strong p2.payoff = Constants.general_benefit p3.payoff = Constants.general_benefit - Constants.volunteer_cost_weak elif self.p2_volunteer == "True" and self.p3_volunteer == "True": p1.payoff = Constants.general_benefit p2.payoff = Constants.general_benefit - Constants.volunteer_cost_weak p3.payoff = Constants.general_benefit - Constants.volunteer_cost_weak elif self.p1_volunteer == "True": p1.payoff = Constants.general_benefit - Constants.volunteer_cost_strong p2.payoff = Constants.general_benefit p3.payoff = Constants.general_benefit elif self.p2_volunteer == "True": p1.payoff = Constants.general_benefit p2.payoff = Constants.general_benefit - Constants.volunteer_cost_weak p3.payoff = Constants.general_benefit elif self.p3_volunteer == "True": p1.payoff = Constants.general_benefit p2.payoff = Constants.general_benefit p3.payoff = Constants.general_benefit - Constants.volunteer_cost_weak else: p1.payoff = Constants.no_benefit p2.payoff = Constants.no_benefit p3.payoff = Constants.no_benefit self.p1payoff = p1.payoff self.p2payoff = p2.payoff self.p3payoff = p3.payoff self.allpayoff = p1.payoff + p2.payoff + p3.payoff p1totalpayoff = models.CurrencyField() p2totalpayoff = models.CurrencyField() p3totalpayoff = models.CurrencyField() alltotalpayoff = models.CurrencyField() p1totalvolunteer = models.CurrencyField() p2totalvolunteer = models.CurrencyField() p3totalvolunteer = models.CurrencyField() def set_totalpayoffs(self): p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) p3 = self.get_player_by_id(3) self.p1totalpayoff = sum([p1.payoff for p1 in p1.in_all_rounds()]) self.p2totalpayoff = sum([p2.payoff for p2 in p2.in_all_rounds()]) self.p3totalpayoff = sum([p3.payoff for p3 in p3.in_all_rounds()]) self.alltotalpayoff = self.p1totalpayoff + self.p2totalpayoff + self.p3totalpayoff self.p1totalvolunteer = sum(1 if self.p1_volunteer == "True" else 0 for self in self.in_all_rounds()) self.p2totalvolunteer = sum(1 if self.p2_volunteer == "True" else 0 for self in self.in_all_rounds()) self.p3totalvolunteer = sum(1 if self.p3_volunteer == "True" else 0 for self in self.in_all_rounds()) class Player(BasePlayer): code = models.IntegerField() totalpayoff = models.CurrencyField() skip = models.BooleanField( choices=[ [False, 'Continued'], [True, 'Skipped'], ] ) satisfaction = models.StringField( choices=['不満である', 'どちらかといえば不満である', 'どちらでもない', 'どちらかといえば満足である', '満足である'], label='AさんとBさんとCさんがレバーを引いた回数に関しては、どのくらい満足していますか', widget=widgets.RadioSelect) ideal_a = models.IntegerField( label='Aさん(レバーを引くのに10コイン必要)がレバーを引くべき回数', min=0, max=22) ideal_b = models.IntegerField( label='Bさん(レバーを引くのに50コイン必要)がレバーを引くべき回数', min=0, max=22) ideal_c = models.IntegerField( label='Cさん(レバーを引くのに50コイン必要)がレバーを引くべき回数', min=0, max=22) sex = models.StringField( choices=['男性', '女性', 'その他'], label='あなたの性別を教えてください', widget=widgets.RadioSelect) age = models.IntegerField( label='あなたの年齢を半角数字でご入力ください', min=18, max=99) comment = models.StringField( label='最後に、実験全体に関して何かご意見やご感想などがあれば、下の欄にご記入ください。特になければ「なし」とご記入ください')