from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random doc = """ This is Volunteer's Dilemma game using templates of Prisoner's Dilemma. This was tested but has not been conducted as a proper experiment yet. In c5 condition, participants play VoD with a computer. The computer randomly chooses 'Cooperate' or 'Defect.' The rate that the computer chooses'Cooperate' depends on the condition, and there are five conditions. """ class Constants(BaseConstants): name_in_url = 'myVoD2019_s1_c5' players_per_group = None num_rounds = 30 # payoff if 1 player defects and the other cooperates volunteered_payoff = c(100) volunteer_payoff = c(50) # payoff if both players cooperate or both defect both_volunteer_payoff = c(50) both_shirk_payoff = c(0) payoff_matrix = dict( Cooperate=dict( Cooperate=both_volunteer_payoff, Defect=volunteer_payoff ), Defect=dict( Cooperate=volunteered_payoff, Defect=both_shirk_payoff ) ) class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): treatment = models.StringField( choices=['fif', 'for', 'thi', 'twe', 'ten'] ) decision = models.StringField( choices=['Cooperate', 'Defect'], doc="""This player's decision""", widget=widgets.RadioSelect ) bot_decision = models.StringField( choices=['Cooperate', 'Defect'] ) other_payoff = models.CurrencyField(initial=0) def set_payoff(self, does_bot_cooperate): if self.round_number == 1: self.treatment = random.choice(['fif', 'for', 'thi', 'twe', 'ten']) else: self.treatment = self.in_round(self.round_number - 1).treatment self.bot_decision = 'Cooperate' if does_bot_cooperate else 'Defect' self.payoff = Constants.payoff_matrix[self.decision][self.bot_decision] self.other_payoff = Constants.payoff_matrix[self.bot_decision][self.decision] trust1 = models.StringField( choices=['まったく当てはまらない', '当てはまらない', 'あまり当てはまらない', '少し当てはまる', '当てはまる', 'かなり当てはまる'], label='(1)ほとんどの人は基本的に正直である', widget=widgets.RadioSelect) trust2 = models.StringField( choices=['まったく当てはまらない', '当てはまらない', 'あまり当てはまらない', '少し当てはまる', '当てはまる', 'かなり当てはまる'], label='(2)ほとんどの人は信頼できる', widget=widgets.RadioSelect) trust3 = models.StringField( choices=['まったく当てはまらない', '当てはまらない', 'あまり当てはまらない', '少し当てはまる', '当てはまる', 'かなり当てはまる'], label='(3)ほとんどの人は基本的に善良で親切である', widget=widgets.RadioSelect) trust4 = models.StringField( choices=['まったく当てはまらない', '当てはまらない', 'あまり当てはまらない', '少し当てはまる', '当てはまる', 'かなり当てはまる'], label='(4)ほとんどの人は他人を信頼している', widget=widgets.RadioSelect) trust5 = models.StringField( choices=['まったく当てはまらない', '当てはまらない', 'あまり当てはまらない', '少し当てはまる', '当てはまる', 'かなり当てはまる'], label='(5)私は, 人を信頼するほうである', widget=widgets.RadioSelect) trust6 = models.StringField( choices=['まったく当てはまらない', '当てはまらない', 'あまり当てはまらない', '少し当てはまる', '当てはまる', 'かなり当てはまる'], label='(6)たいていの人は, 人から信頼された場合, 同じようにその相手を信頼する', widget=widgets.RadioSelect) jsv6 = models.StringField( choices=['まったく当てはまらない', '当てはまらない', 'どちらかといえば当てはまらない', 'どちらかといえば当てはまる', '当てはまる', '大変よく当てはまる'], label='(1)他の人が不当に私より良い暮らしをしていると, 腹が立つ', widget=widgets.RadioSelect) jsv7 = models.StringField( choices=['まったく当てはまらない', '当てはまらない', 'どちらかといえば当てはまらない', 'どちらかといえば当てはまる', '当てはまる', '大変よく当てはまる'], label='(2)他の人は簡単に得られるものを私は努力なしでは得られないと, 思い悩む', widget=widgets.RadioSelect) jso6 = models.StringField( choices=['まったく当てはまらない', '当てはまらない', 'どちらかといえば当てはまらない', 'どちらかといえば当てはまる', '当てはまる', '大変よく当てはまる'], label='(3)他の人より不当に苦しい生活を送っている人がいると, 落ち着かない気分になる', widget=widgets.RadioSelect) jso7 = models.StringField( choices=['まったく当てはまらない', '当てはまらない', 'どちらかといえば当てはまらない', 'どちらかといえば当てはまる', '当てはまる', '大変よく当てはまる'], label='(4)他の人は簡単に得られるものを努力なしでは得られない人がいると, 心配になる', widget=widgets.RadioSelect) jsb6 = models.StringField( choices=['まったく当てはまらない', '当てはまらない', 'どちらかといえば当てはまらない', 'どちらかといえば当てはまる', '当てはまる', '大変よく当てはまる'], label='(5)ふさわしい理由もなく他の人より良い暮らしをしていると, 罪悪感を覚える', widget=widgets.RadioSelect) jsb7 = models.StringField( choices=['まったく当てはまらない', '当てはまらない', 'どちらかといえば当てはまらない', 'どちらかといえば当てはまる', '当てはまる', '大変よく当てはまる'], label='(6)他の人は努力なしでは得られないものを私は簡単に得られると, 嫌な気持ちになる', widget=widgets.RadioSelect) jsp6 = models.StringField( choices=['まったく当てはまらない', '当てはまらない', 'どちらかといえば当てはまらない', 'どちらかといえば当てはまる', '当てはまる', '大変よく当てはまる'], label='(7)他の人を犠牲にして良い暮らしをしてしまうと, 罪悪感を覚える​​​', widget=widgets.RadioSelect) jsp7 = models.StringField( choices=['まったく当てはまらない', '当てはまらない', 'どちらかといえば当てはまらない', 'どちらかといえば当てはまる', '当てはまる', '大変よく当てはまる'], label='(8)他の人は努力なしでは達成できないことを私はズルしてできてしまうと, 嫌な気持ちになる', widget=widgets.RadioSelect) quiz1 = models.IntegerField( label='(1)先ほどのゲームにおいて, あなたが「レバーを下げない」を選択し, 相手が「レバーを下げる」を選択した場合, あなたは何コイン手に入れることができましたか (半角数字でお答えください).') quiz2 = models.IntegerField( label='(2)先ほどのゲームにおいて, あなたも相手も「レバーを下げない」を選択した場合, あなたは何コイン手に入れることができましたか (半角数字でお答えください).') satisfaction1 = models.StringField( choices=['まったく面白くなかった', 'やや面白くなかった', 'どちらでもない', 'やや面白かった', 'とても面白かった'], label='ゲームはどの程度面白かったですか.', widget=widgets.RadioSelect) satisfaction2 = models.StringField( choices=['まったく満足していない', 'やや満足していない', 'どちらでもない', 'やや満足している', 'とても満足している'], label='(3)ゲームの結果にはどの程度満足していますか.', widget=widgets.RadioSelect) concentration1 = models.StringField( choices=['まったく集中できなかった', '少し集中できなかった', 'どちらでもない', 'おおむね集中できた', 'とても集中できた'], label='(4)ゲームにどの程度集中できましたか.', widget=widgets.RadioSelect) problem = models.StringField( label='(5)ゲーム中に何か問題があれば, 下の欄にご記入ください(例: 画面が動かなくなった, 途中でトイレに行ったなど). 特になければ「なし」とご記入ください.') concentration2 = models.StringField( choices=['今回のデータを分析の対象にするには心配がある', '今回のデータを分析の対象にしても問題ないと思う', 'わからない'], label='(6)あなたのデータは, 研究のための分析の対象となる予定です. もしゲームに集中できなかったなどして今回のデータを分析の対象にするには心配がある場合は, お知らせください.', widget=widgets.RadioSelect) comment = models.StringField( label='(7)実験全体に関して, 何かご意見やご感想などがあれば, 下の欄にご記入ください. 特になければ「なし」とご記入ください.')