from otree.api import * doc = """ publicgoods trial """ class C(BaseConstants): NAME_IN_URL = 'publicgoods_trial' PLAYERS_PER_GROUP = 3 NUM_ROUNDS = 5 ENDOWMENT = cu(20) MULTIPLIER = 1.6 class Subsession(BaseSubsession): pass class Group(BaseGroup): total_contribution = models.CurrencyField() individual_share = models.CurrencyField() class Player(BasePlayer): contribution = models.CurrencyField( choices = currency_range(cu(0),C.ENDOWMENT,cu(1)), label = 'あなたはいくら貢献しますか?' ) def compute(group: Group): players = group.get_players() #grouopクラスに所属するplayersの情報取得 contributions = [p.contribution for p in players] #playersの貢献額をリストにまとめる group.total_contribution = sum(contributions) #グループの総貢献額を計算 group.individual_share = (group.total_contribution * C.MULTIPLIER / C.PLAYERS_PER_GROUP) #分配額を計算 for p in players: p.payoff = C.ENDOWMENT - p.contribution + group.individual_share #各playerの獲得金額 def creating_session(subsession: Subsession): if subsession.round_number == 1: subsession.group_randomly() else: subsession.group_like_round(1) # PAGES class Page1(Page): form_model = 'player' form_fields = ['contribution'] #Playerが貢献額を入力する class Page2(WaitPage): after_all_players_arrive = 'compute' #全員の貢献額が入力された後に計算を実行 class Page3(Page): pass page_sequence = [Page1, Page2, Page3]