from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) class Constants(BaseConstants): name_in_url = 'public_goods_C1' players_per_group = 5 #参加人数 num_rounds = 20 #ラウンド数 endowment = 10 #初期保有 half_rounds = num_rounds / 2 add_round = half_rounds + 1 class Subsession(BaseSubsession): pass class Group(BaseGroup): #公共財実験部分 total_contribution = models.FloatField() #貢献額の総合を入れるとこ individual_share = models.FloatField() #貢献額を分配 multiplier = models.FloatField(initial = 0) #倍率 spite_rounds = models.FloatField() def set_payoffs(self):#ラウンドで倍率を変える if self.round_number <= Constants.half_rounds: #half_rounds self.multiplier = 1.4 else: self.multiplier = 0.7 players = self.get_players() contributions = [float(p.contribution) for p in players] self.total_contribution = sum(contributions)#貢献額の総合を計算 self.individual_share = round(self.total_contribution * self.multiplier,2)#分配額をそれぞれ求める for p in players: p.dividend = Constants.endowment - p.contribution + self.individual_share #アンケート部分 class Player(BasePlayer): contribution = models.IntegerField(min=0, max=Constants.endowment) dividend = models.FloatField(initial = 0) #アンケート部分 q_group = models.CharField(initial=None, verbose_name = 'グループ名', choices = ['グループCsub'],) q_number = models.CharField(initial=None, choices = ['1', '2', '3', '4', '5', '6', '7'], verbose_name = '参加者番号',) q_contribution1_way = models.StringField(initial=None, verbose_name='どのような投資行動を取りましたか。') q_contribution1_reason = models.StringField(initial=None, verbose_name='そのような投資行動を取った理由はなんですか。') q_contribution2_way = models.StringField(initial=None, verbose_name='どのような投資行動を取りましたか。') q_contribution2_reason = models.StringField(initial=None, verbose_name='そのような投資行動を取った理由はなんですか。')