from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random doc = """ This is symmetric Volunteer's Dilemma game based on Diekmann & Przepiorka (2016). """ class Constants(BaseConstants): name_in_url = 'SVOD2020' players_per_group = 3 num_rounds = 7 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 = c(50) 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 p2.payoff = Constants.general_benefit - Constants.volunteer_cost p3.payoff = Constants.general_benefit - Constants.volunteer_cost elif self.p1_volunteer == "True" and self.p2_volunteer == "True": p1.payoff = Constants.general_benefit - Constants.volunteer_cost p2.payoff = Constants.general_benefit - Constants.volunteer_cost p3.payoff = Constants.general_benefit elif self.p1_volunteer == "True" and self.p3_volunteer == "True": p1.payoff = Constants.general_benefit - Constants.volunteer_cost p2.payoff = Constants.general_benefit p3.payoff = Constants.general_benefit - Constants.volunteer_cost elif self.p2_volunteer == "True" and self.p3_volunteer == "True": p1.payoff = Constants.general_benefit p2.payoff = Constants.general_benefit - Constants.volunteer_cost p3.payoff = Constants.general_benefit - Constants.volunteer_cost elif self.p1_volunteer == "True": p1.payoff = Constants.general_benefit - Constants.volunteer_cost 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 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 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 ) quiz1 = models.StringField( choices=['0コイン', '10コイン', '30コイン', '50コイン', '80コイン', '100コイン'], label='Aさんは、レバーを引くのにいくら必要ですか', widget=widgets.RadioSelect) quiz2 = models.StringField( choices=['0コイン', '10コイン', '30コイン', '50コイン', '80コイン', '100コイン'], label='Cさんが「レバーを引く」を選択した場合、Cさんの合計獲得コインはいくらですか', widget=widgets.RadioSelect) quiz3 = models.StringField( choices=['0コイン', '10コイン', '30コイン', '50コイン', '80コイン', '100コイン'], label='誰も「レバーを引く」を選択しなかった場合、Bさんの合計獲得コインはいくらですか', widget=widgets.RadioSelect) belief = models.StringField( choices=['0%(誰もレバーを引かない)', '10%', '20%', '30%', '40%', '50%', '60%', '70%', '80%', '90%', '100%(全員レバーを引く)'], label='このタスクに参加する人のうち、どのくらいの人がレバーを引くと思いますか。直感にしたがってお答えください', widget=widgets.RadioSelect) intuitive = models.StringField( choices=['分かりにくかった', 'どちらかといえば分かりにくかった', 'どちらでもない', 'どちらかといえば分かりやすかった', '分かりやすかった'], label='タスクの内容はどのくらい分かりやすかったですか', widget=widgets.RadioSelect) satisfaction1 = models.StringField( choices=['不満がある', 'どちらかといえば不満がある', 'どちらでもない', 'どちらかといえば満足である', '満足である'], label='タスクの結果にはどのくらい満足していますか', widget=widgets.RadioSelect) satisfaction2 = models.StringField( label='もし上記の満足度に関して理由があれば、下の欄にご記入ください。特になければ「なし」とご記入ください' ) 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=110) 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='最後に、実験全体に関して何かご意見やご感想などがあれば、下の欄にご記入ください。特になければ「なし」とご記入ください')