from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) author = 'Your name here' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'public_goods_trial' players_per_group = 4 #四人でやる num_rounds = 3 #三回繰り返す endowment = c(20) # 初期保有額は20ポイント multiplier = 2 # 全員の貢献額を2倍にします. class Subsession(BaseSubsession): pass class Group(BaseGroup): total_contribution = models.CurrencyField() # 全員の合計金額を入れる箱 individual_share = models.CurrencyField() # 全員に分配される金額(合計金額を2倍して人数で割る)を入れる箱 def compute(self): contributions = [p.contribution for p in self.get_players()] # Groupクラスにあるcontributionsとは,プレイヤー全員の貢献額の行列ですよ! self.total_contribution = sum(contributions)# Groupクラスにあるtotal_contributionとは,contributionsの合計です. self.individual_share = self.total_contribution * Constants.multiplier / Constants.players_per_group # Groupクラスにあるindividual_shareとは,Groupクラスにあるtotal_contributionとConstantsクラスにあるmultiplierをかけて,Constantsクラスにあるplayers_per_groupで割ったものです. for p in self.get_players(): # 各プレイヤーについて,こんな計算をしてください. p.payoff = Constants.endowment - p.contribution + self.individual_share # 各プレイヤーのpayoffはConstantsクラスのendowment(保有額)から各プレイヤーのcontributionを引いて,Groupクラスにあるindividual_shareを足します. class Player(BasePlayer): contribution = models.CurrencyField( # 変数"contribution"を定義しよう. choices=currency_range(c(0), c(Constants.endowment), c(1)), # 選択肢は最小値0,最大値はConstantsクラスで定義した初期保有額の中で1ずつ変化させることができるようにします. label="あなたはいくら貢献しますか?", # 貢献額の選択肢の前にこんな文字列を表示しよう. )