from otree.api import * doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'publicgoods_punishment' players_per_group = 4 #グループ人数 num_rounds = 2 #繰り返しの回数 endowment = cu(20) #初期保有額(公共財への投資にかかるコスト) multiplier = 1.6 #係数 punishment = cu(30) #罰の大きさ punishment_endowment = cu(10) #監視にかかるコスト class Subsession(BaseSubsession): pass class Group(BaseGroup): total_contribution = models.CurrencyField() group_inspection = models.CurrencyField() individual_share = models.CurrencyField() def compute(self): contributions = [p.contribution for p in self.get_players()] self.total_contribution = sum(contributions) self.individual_share = self.total_contribution * Constants.multiplier / Constants.players_per_group inspections = [p.inspection for p in self.get_players()] self.group_inspection = sum(inspections) ##誰かひとりでも監視をすれば貢献しなかった人全員に罰を与えることができるが、誰も監視をしなければ貢献しなかった人を罰せられない if sum(inspections) >= Constants.punishment_endowment: self.group_inspection = Constants.punishment else: self.group_inspection = cu(0) for p in self.get_players(): if p.contribution == cu(0): p.individual_punishment = self.group_inspection else: p.individual_punishment = cu(0) p.payoff = Constants.endowment - p.contribution + self.individual_share - Constants.punishment_endowment - p.individual_punishment p.payoff = Constants.endowment - p.contribution + self.individual_share - Constants.punishment_endowment - p.individual_punishment class Player(BasePlayer): contribution = models.CurrencyField( choices=[ [cu(Constants.endowment),'貢献する'], [cu(0), '貢献しない'] ], label="グループに貢献しますか?", widget = widgets.RadioSelect ) inspection = models.CurrencyField( choices=[ [cu(Constants.punishment_endowment),'監視する'], [cu(0), '監視しない'] ], label="監視しますか?", widget = widgets.RadioSelect ) individual_punishment = models.CurrencyField() # PAGES class Page1(Page): timeout_seconds = 60 form_model = 'player' form_fields = ['contribution'] class Page2(Page): timeout_seconds = 60 form_model = 'player' form_fields = ['inspection'] class Page3(WaitPage): def after_all_players_arrive(self): self.group.compute() class Page4(Page): pass page_sequence = [Page1, Page2, Page3, Page4]