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 = 'AVOD10P2021' 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) look1 = models.StringField( choices=['① (各ラウンドで、誰がレバーを引いたか)', '② (各ラウンドで、誰が何コイン獲得したか)', '③ (各ラウンドで、全員で何コイン獲得したか)'], label='1番よく見た部分', widget=widgets.RadioSelect) look2 = models.StringField( choices=['① (各ラウンドで、誰がレバーを引いたか)', '② (各ラウンドで、誰が何コイン獲得したか)', '③ (各ラウンドで、全員で何コイン獲得したか)'], label='2番目によく見た部分', 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) concentration = models.StringField( choices=['集中できなかった', 'どちらかといえば集中できなかった', 'どちらでもない', 'どちらかといえば集中できた', '集中できた'], label='実験にはどの程度集中できましたか', widget=widgets.RadioSelect) quality = models.StringField( choices=['今回のデータを分析の対象にするには心配がある', '今回のデータを分析の対象にしても問題ないと思う', 'わからない'], label='あなたのデータは、研究のための分析の対象となる予定です。もし実験に集中できなかったなどして今回のデータを分析の対象にするには心配がある場合は、お知らせください', widget=widgets.RadioSelect) sex = models.StringField( choices=['男性', '女性', 'その他'], label='あなたの性別を教えてください', widget=widgets.RadioSelect) age = models.IntegerField( label='あなたの年齢を半角数字でご入力ください', min=18, max=99) academic = models.StringField( choices=['小学校あるいは中学校', '高等学校', '専門学校(在学中含む)', '短大士(在学中含む)', '学士号(在学中含む)', '修士号(在学中含む)', '博士号(在学中含む)', 'わからない', '答えたくない'], label='あなたの最終学歴を教えてください', widget=widgets.RadioSelect) income = models.StringField( choices=['200万円未満', '200~400万円未満', '400~600万円未満', '600~800万円未満', '800~1000万円未満', '1000~1500万円未満', '1500万円以上', 'わからない', '答えたくない'], label='昨年1年間のあなたの家の世帯収入は、この中のどれにあたりますか。税金を差し引く前の収入でお答えください。仕事からの収入だけでなく、株式配当、年金、不動産収入などすべての収入を合わせてください。', widget=widgets.RadioSelect) comment = models.StringField( label='最後に、実験全体に関して何かご意見やご感想などがあれば、下の欄にご記入ください。特になければ「なし」とご記入ください')