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 = 'AVOD302020' players_per_group = 3 num_rounds = 15 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(30) 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'] ) 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 class Player(BasePlayer): code = models.IntegerField() totalpayoff = models.CurrencyField() skip = models.BooleanField( choices=[ [False, 'Continued'], [True, 'Skipped'], ] ) qualtrics = models.IntegerField( label='5ケタの数字', min=10000, max=99999 ) intuitive = models.StringField( choices=['分かりにくかった', 'どちらかといえば分かりにくかった', 'どちらでもない', 'どちらかといえば分かりやすかった', '分かりやすかった'], label='タスクのルールはどのくらい分かりやすかったですか', widget=widgets.RadioSelect) satisfaction1 = models.StringField( choices=['不満である', 'どちらかといえば不満である', 'どちらでもない', 'どちらかといえば満足である', '満足である'], label='AさんとBさんとCさんがレバーを引いた回数に関しては、どのくらい満足していますか', widget=widgets.RadioSelect) satisfaction2 = models.StringField( label='もし上記の満足度に関して理由があれば、下の欄にご記入ください。特になければ「なし」とご記入ください' ) ideal_a = models.IntegerField( label='Aさん(レバーを引くのに30コイン必要)がレバーを引くべき回数', min=0, max=15) ideal_b = models.IntegerField( label='Bさん(レバーを引くのに50コイン必要)がレバーを引くべき回数', min=0, max=15) ideal_c = models.IntegerField( label='Cさん(レバーを引くのに50コイン必要)がレバーを引くべき回数', min=0, max=15) concentration = models.StringField( choices=['集中できなかった', 'どちらかといえば集中できなかった', 'どちらでもない', 'どちらかといえば集中できた', '集中できた'], label='実験にはどの程度集中できましたか', widget=widgets.RadioSelect) error = models.StringField( label='実験実施に当たって、エラーがないように細心の注意を払っておりますが、もしエラーが出てしまった場合は大変申し訳ございません。どのようなエラーが出たか、下の欄に入力していただけると幸いです。特になければ「なし」とご記入ください', ) 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='最後に、実験全体に関して何かご意見やご感想などがあれば、下の欄にご記入ください。特になければ「なし」とご記入ください')