from otree.api import * author = 'Your name here' doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'ElFarol_Inst_Div' PLAYERS_PER_GROUP = None NUM_ROUNDS = 30 ENDOWMENT = 10 MULTIPLIER = 2 StandardChoices_1=[ [1, '0ポイント'], [2, '10ポイント'], [3, '20ポイント'], [4, '5ポイント'] ] SURVEY1CHOICES = StandardChoices_1 StandardChoices_2=[ [1, '0ポイント'], [2, '10ポイント'], [3, '20ポイント'], [4, '15ポイント'] ] SURVEY2CHOICES = StandardChoices_2 StandardChoices_3=[ [1, '0ポイント'], [2, '10ポイント'], [3, '20ポイント'], [4, '15ポイント'] ] SURVEY3CHOICES = StandardChoices_3 StandardChoices_4=[ [1, '0ポイント'], [2, '20ポイント'], [3, '10ポイント'], [4, '15ポイント'] ] SURVEY4CHOICES = StandardChoices_4 SurveyQuizChoices=[ [1, '0円'], [2, '20円'], [3, '10円'], [4, '40円'] ] SURVEYQUIZCHOICES = SurveyQuizChoices StandardChoices_5=[ [1,"1: 全く感じない"], [2,"2"], [3,"3"], [4,"4: どちらでもない "], [5,"5"], [6,"6"], [7,"7: すごく感じる"] ] SURVEY5CHOICES = StandardChoices_5 StandardChoices_8=[ [0,"地域Xで必ず0ポイント得られる"], [1,"地域Xで必ず1ポイント得られる"], [2,"地域Xで必ず2ポイント得られる"], [3,"地域Xで必ず3ポイント得られる"], [4,"地域Xで必ず4ポイント得られる"], [5,"地域Xで必ず5ポイント得られる"], [6,"地域Xで必ず6ポイント得られる"], [7,"地域Xで必ず7ポイント得られる"], [8,"地域Xで必ず8ポイント得られる"], ] SURVEY8CHOICES = StandardChoices_8 StandardChoices_9=[ [1,"地域Xを選ぶ"], [2,"地域Yを選ぶ"], ] SURVEY9CHOICES = StandardChoices_9 StandardChoices_10=[ [1,"1: 全く同意できない"], [2,"2"], [3,"3"], [4,"4"], [5,"5:どちらでもない"], [6,"6"], [7,"7"], [8,"8"], [9,"9: 強く同意する"] ] SURVEY10CHOICES = StandardChoices_10 class Subsession(BaseSubsession): pass class Group(BaseGroup): total_customers = models.CurrencyField() total_chosen_customers = models.IntegerField() total_bar_full = models.IntegerField() computer_bar_full = models.IntegerField() computer_bar_customers = models.IntegerField() def set_choice(self): for p in self.get_players(): print(p.select_inst) if p.select_inst == False: p.decision = False # print(p.decision) self.total_chosen_customers = sum([p.select_inst for p in self.get_players()]) self.computer_bar_customers = p.player_numbers - self.total_chosen_customers def set_payoffs(self): import math import random self.total_customers = sum([p.decision for p in self.get_players()]) self.total_bar_full = math.ceil(self.total_chosen_customers*(2/3)) self.computer_bar_full = math.ceil(self.computer_bar_customers*(2/3)) count = 0 for p in self.get_players(): if p.select_inst == False: p.decision = bool(sum(random.choices((False,True), weights=[1,2]))) if p.decision == True: count += 1 for p in self.get_players(): if p.select_inst == True: if self.total_chosen_customers == 1: import random p.payoff = random.choice([0,10,20]) elif self.total_chosen_customers == 2: if self.total_customers == 2: if p.decision == 1: p.payoff = 0 else: p.payoff = C.ENDOWMENT #print("bar is full") else: if p.decision == 1: p.payoff = C.ENDOWMENT * C.MULTIPLIER # print("winner") else: p.payoff = C.ENDOWMENT # print("loser") #print("bar looks great") else: if self.total_customers > self.total_bar_full: if p.decision == 1: p.payoff = 0 else: p.payoff = C.ENDOWMENT #print("bar is full") else: if p.decision == 1: p.payoff = C.ENDOWMENT * C.MULTIPLIER # print("winner") else: p.payoff = C.ENDOWMENT # print("loser") #print("bar looks great") else: if self.computer_bar_customers == 1: import random p.payoff = random.choice([0,10,20]) elif self.computer_bar_customers == 2: if count == 2: if p.decision == 1: p.payoff = 0 else: p.payoff = C.ENDOWMENT #print("bar is full") else: if p.decision == 1: p.payoff = C.ENDOWMENT * C.MULTIPLIER # print("winner") else: p.payoff = C.ENDOWMENT # print("loser") #print("bar looks great") else: if count > self.computer_bar_full: if p.decision == 1: p.payoff = 0 else: p.payoff = C.ENDOWMENT #print("bar is full") else: if p.decision == 1: p.payoff = C.ENDOWMENT * C.MULTIPLIER # print("winner") else: p.payoff = C.ENDOWMENT # print("loser") #print("bar looks great") p.curr_cumu_payoffs = sum([pp.payoff for pp in p.in_all_rounds()]) class Player(BasePlayer): total_payoffs = models.CurrencyField() curr_cumu_payoffs = models.CurrencyField() total_money = models.CurrencyField() consent_btn = models.BooleanField() player_numbers = models.IntegerField() # Demographics name = models.StringField( label='以下にログイン直前に配布されたID番号をお書きください' ) name2 = models.StringField( label='まず、振り込み用の確認のため、ログイン直前に配布されたID番号を以下にお書きください' ) sex = models.IntegerField( label='以下にご自分の性別をお書きください', choices=[ [1,'男性'], [2,'女性'], [3,'答えない'] ] ) age = models.IntegerField( label='以下にご自分の年齢をお書きください' ) university = models.StringField( label='以下にご自分の所属している大学名および学部名をお書きください' ) birthyear = models.IntegerField( label='年' ) birthmonth = models.IntegerField( label='月' ) birthday = models.IntegerField( label='日' ) favcolor = models.StringField( label='以下にあなたの好きな色をお答えください' ) favnumber = models.IntegerField( label='以下にあなたの好きな数をお答えください' ) birthplace = models.IntegerField( label='あなたが生まれた地域をお答えください', choices=[[1,'北海道'],[2,'東北'],[3,'北陸'],[4,'関東'],[5,'東海'],[6,'近畿'],[7,'中国'],[8,'四国'],[10,'九州・沖縄'],[11,'海外']] ) # Decision select_inst = models.BooleanField( choices=[ [True, '地域A(自分で決める)'], [False, '地域B(占い師に決めてもらう)'], ], widget=widgets.RadioSelect ) decision = models.BooleanField( choices=[ [True, '参加する'], [False, '参加しない'], ], widget=widgets.RadioSelect ) #quizのやつ item1A = models.IntegerField( label='正しいと思う選択肢をお選びください', choices=C.SURVEY1CHOICES, widget=widgets.RadioSelect ) item1B = models.IntegerField( label='正しいと思う選択肢をお選びください', choices=C.SURVEY2CHOICES, widget=widgets.RadioSelect ) item1C = models.IntegerField( label='正しいと思う選択肢をお選びください', choices=C.SURVEY3CHOICES, widget=widgets.RadioSelect ) item1D = models.IntegerField( label='正しいと思う選択肢をお選びください', choices=C.SURVEY4CHOICES, widget=widgets.RadioSelect ) item1E = models.IntegerField( label='正しいと思う選択肢をお選びください', choices=C.SURVEYQUIZCHOICES, widget=widgets.RadioSelect ) #Survey1 (Strategy) item3A = models.IntegerField( label='メンバー全員がイベントに均等に参加できること', choices=C.SURVEY5CHOICES, widget=widgets.RadioSelect ) item3B = models.IntegerField( label='自分の報酬が増えること', choices=C.SURVEY5CHOICES, widget=widgets.RadioSelect ) item3C = models.IntegerField( label='自分の報酬が他のメンバーより高くなること', choices=C.SURVEY5CHOICES, widget=widgets.RadioSelect ) item3D = models.IntegerField( label='他の人から利用されないに振る舞うこと', choices=C.SURVEY5CHOICES, widget=widgets.RadioSelect ) item3E = models.IntegerField( label='グループ全体の利益が高くなること', choices=C.SURVEY5CHOICES, widget=widgets.RadioSelect ) item3F = models.IntegerField( label='他のメンバーと協力し合うこと', choices=C.SURVEY5CHOICES, widget=widgets.RadioSelect ) item3G = models.IntegerField( label='他のメンバーの利益が増えること', choices=C.SURVEY5CHOICES, widget=widgets.RadioSelect ) item3H = models.IntegerField( label='他のメンバーの役に立つこと', choices=C.SURVEY5CHOICES, widget=widgets.RadioSelect ) item3I = models.IntegerField( label='自分自身の決定で結果が決まること', choices=C.SURVEY5CHOICES, widget=widgets.RadioSelect ) item3Free = models.StringField( label='実験に参加している間、どのように戦略を決めていたか具体的にお書きください。' ) item3J = models.IntegerField( label='この実験で地域Bのオススメシステムがうまく機能しないことでどれほど不利益を被ると感じましたか。', choices=C.SURVEY5CHOICES, widget=widgets.RadioSelect ) item3K = models.IntegerField( label='現実に地域Bのようなシステムがあっとしたら、それはどれほど人々に害を及ぼす危険性があると感じますか。', choices=C.SURVEY5CHOICES, widget=widgets.RadioSelect ) # risk aversion riskA = models.IntegerField( label='', choices=[[0,'1/10で300円か9/10で250円'],[1,'1/10で500円か9/10で50円']], widget=widgets.RadioSelect ) riskB = models.IntegerField( label='', choices=[[0,'2/10で300円か8/10で250円'],[1,'2/10で500円か8/10で50円']], widget=widgets.RadioSelect ) riskC = models.IntegerField( label='', choices=[[0,'3/10で300円か7/10で250円'],[1,'3/10で500円か7/10で50円']], widget=widgets.RadioSelect ) riskD = models.IntegerField( label='', choices=[[0,'4/10で300円か6/10で250円'],[1,'4/10で500円か6/10で50円']], widget=widgets.RadioSelect ) riskE = models.IntegerField( label='', choices=[[0,'5/10で300円か5/10で250円'],[1,'5/10で500円か5/10で50円']], widget=widgets.RadioSelect ) riskF = models.IntegerField( label='', choices=[[0,'6/10で300円か4/10で250円'],[1,'6/10で500円か4/10で50円']], widget=widgets.RadioSelect ) riskG = models.IntegerField( label='', choices=[[0,'7/10で300円か3/10で250円'],[1,'7/10で500円か3/10で50円']], widget=widgets.RadioSelect ) riskH = models.IntegerField( label='', choices=[[0,'8/10で300円か2/10で250円'],[1,'8/10で500円か2/10で50円']], widget=widgets.RadioSelect ) riskI = models.IntegerField( label='', choices=[[0,'9/10で300円か1/10で250円'],[1,'9/10で500円か1/10で50円']], widget=widgets.RadioSelect ) riskJ = models.IntegerField( label='', choices=[[0,'10/10で300円か0/10で250円'],[1,'10/10で500円か0/10で50円']], widget=widgets.RadioSelect ) # 霊的尺度 ghost1 = models.IntegerField( label='霊的で全知全能な神と呼ばれるようなものは実在する。', choices=C.SURVEY10CHOICES, widget=widgets.RadioSelect ) ghost2 = models.IntegerField( label='守護霊や悪霊のような善悪のある霊的な存在はいる。', choices=C.SURVEY10CHOICES, widget=widgets.RadioSelect ) ghost3 = models.IntegerField( label='守護神や悪魔のような善悪のある霊的な存在がいる。', choices=C.SURVEY10CHOICES, widget=widgets.RadioSelect ) ghost4 = models.IntegerField( label='人間には、物質的な身体とは区別される魂が存在する。', choices=C.SURVEY10CHOICES, widget=widgets.RadioSelect ) ghost5 = models.IntegerField( label='死後の世界は存在する。', choices=C.SURVEY10CHOICES, widget=widgets.RadioSelect ) ghost6 = models.IntegerField( label='物質的世界以外にも霊的世界が存在する。', choices=C.SURVEY10CHOICES, widget=widgets.RadioSelect ) ghost7 = models.IntegerField( label='科学理論では説明できない超自然的な奇跡は起こりうるし、実際に起こる。', choices=C.SURVEY10CHOICES, widget=widgets.RadioSelect ) def creating_session(self): for player in self.get_players(): player.player_numbers = self.session.num_participants class Intro(Page): form_model = 'player' form_fields = ['consent_btn','name','university'] def is_displayed(self): return self.round_number == 1 class Fortune(Page): form_model = 'player' form_fields = ['birthyear','birthmonth','birthday','favcolor','birthplace','sex'] def is_displayed(self): return self.round_number == 1 class Explain(Page): def is_displayed(self): return self.round_number == 1 class Quiz(Page): form_model = 'player' form_fields = [ 'item1A', 'item1B', 'item1C', 'item1D', 'item1E', ] # def get_form_fields(player): # fields = player.form_fields # return fields def is_displayed(self): return self.round_number == 1 class Quiz_Answer(Page): def is_displayed(self): return self.round_number == 1 class Explain_control(Page): def is_displayed(self): return self.round_number == 1 class Start_page(Page): def is_displayed(self): return self.round_number == 1 class Start_WaitPage(WaitPage): def is_displayed(self): return self.round_number == 1 class SelectInst(Page): form_model = 'player' form_fields = ['select_inst'] class WaitPageSelectInst(WaitPage): template_name = 'ElFarol_Inst/MyWaitPage.html' def after_all_players_arrive(self): self.group.set_choice() class MyPage(Page): form_model = 'player' form_fields = ['decision'] def is_displayed(player): return player.select_inst == True class ResultsWaitPage(WaitPage): def after_all_players_arrive(self): self.group.set_payoffs() class Results(Page): pass class Finish(Page): def vars_for_template(self): return {'fin_payoff': sum([p.payoff for p in self.in_all_rounds()]), } def is_displayed(self): return self.round_number == C.NUM_ROUNDS form_model = 'player' form_fields = ['name2'] class Question1(Page): def is_displayed(self): if self.round_number == C.NUM_ROUNDS: return True else: False form_model = 'player' form_fields = [ 'item3A', 'item3B', 'item3C', 'item3D', 'item3E', 'item3F', 'item3G', 'item3H', 'item3I', 'item3Free', 'item3J', 'item3K', ] class FinishExp(Page): def is_displayed(self): if self.round_number == C.NUM_ROUNDS: return True else: False def vars_for_template(self): return {'fin_payoff': sum([p.payoff for p in self.in_all_rounds()]), 'fin_money': (sum([p.payoff for p in self.in_all_rounds()])*2).to_real_world_currency(self.session)/10, 'total_money': ((sum([p.payoff for p in self.in_all_rounds()])*2)+2500).to_real_world_currency(self.session)/10} class ConsentWaitPage(WaitPage): def is_displayed(self): return self.round_number == 1 class QuizWaitPage(WaitPage): def is_displayed(self): return self.round_number == 1 class Question8(Page): def is_displayed(self): if self.round_number == C.NUM_ROUNDS: return True else: False form_model = 'player' form_fields = [ 'riskA', 'riskB', 'riskC', 'riskD', 'riskE', 'riskF', 'riskG', 'riskH', 'riskI', ] class Question9(Page): def is_displayed(self): if self.round_number == C.NUM_ROUNDS: return True else: False form_model = 'player' form_fields = [ 'ghost1', 'ghost2', 'ghost3', 'ghost4', 'ghost5', 'ghost6', 'ghost7', ] page_sequence = [ Intro, Fortune, ConsentWaitPage, Explain, Quiz, Quiz_Answer, QuizWaitPage, Explain_control, Start_page, Start_WaitPage, SelectInst, WaitPageSelectInst, MyPage, ResultsWaitPage, Results, Finish, Question1, # Question6, Question8, Question9, FinishExp] # Instruction1,Instruction2,Instruction3,Instruction_Wait,, totalpayoff