from otree.api import * c = cu doc = '' class C(BaseConstants): NAME_IN_URL = 'foodloss' PLAYERS_PER_GROUP = 5 NUM_ROUNDS = 24 OBENTO_SHOKICHI = 23 class Subsession(BaseSubsession): base = models.IntegerField() Block = models.IntegerField() def creating_session(subsession: Subsession): session = subsession.session subsession.base = subsession.session.config['base'] if subsession.base==0: for g in subsession.get_groups(): g.treatment=[2,2,2,4][g.id_in_subsession-1] else: for g in subsession.get_groups(): g.treatment=1 import random tmp = random.sample(list(range(1, C.PLAYERS_PER_GROUP+1)),C.PLAYERS_PER_GROUP) for p in subsession.get_players(): p.Order = tmp[p.id_in_group-1] subsession.Block = (subsession.round_number-1)//6 + 1 class Group(BaseGroup): Zansu = models.IntegerField() Price = models.IntegerField() initial_zansu = models.IntegerField() treatment = models.IntegerField() def money_calc(group: Group): for player in group.get_players(): #!!!!ここら辺を変更!!!! if player.round_number%6==1: player.money=1850 group.Zansu=C.OBENTO_SHOKICHI group.Price=500 group.initial_zansu=23 player.finished=0 else: player.money = player.in_round(player.round_number-1).money group.Zansu=group.in_round(group.round_number-1).Zansu group.initial_zansu=group.in_round(group.round_number-1).Zansu if (player.money<=50 or group.Zansu<=0): player.finished=1 else: player.finished=0 if group.treatment==1: group.Price=500 if group.treatment==3: price_list=[250,250,250,275,275,275,275,312,312,312,312,362,362,362,362,425,425,425,425,500,500,500,500] group.Price = price_list[group.Zansu-1] if group.treatment==4: price_list=[250,250,250,325,325,325,325,388,388,388,388,438,438,438,438,475,475,475,475,500,500,500,500] group.Price=price_list[group.Zansu-1] if group.treatment==2: price_list=[[500]*23, [550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,500,500,500,450,450,450], [600,600,600,600,600,600,600,600,600,600,600,600,600,500,500,500,400,400,400,400,400,400,400], [650,650,650,650,650,650,650,650,650,500,500,500,350,350,350,350,350,350,350,350,350,350,350], [700,700,700,700,700,500,500,500,300,300,300,300,300,300,300,300,300,300,300,300,300,300,300], [250]*23] group.Price = price_list[player.round_number%6-1][group.Zansu-1] def Zansuu_calc(group: Group): session = group.session subsession = group.subsession players = group.get_players() Obento = [player.Ch2 for player in players] # お弁当に余裕がある場合とない場合で分けて、買えた個数Boughtを計算する。 # はじめは、全員が買いたい個数を買っても余裕がある場合。 if sum(Obento)Residualならば、Residualだけ買う」っていう計算ができる。 for p in players: Residual = group.Zansu - sum(buy_list[1:p.Order]) if Residual > 0: p.Bought = min(p.Ch2, Residual) else: p.Bought = 0 # 次の forループは、お金の残額を計算することと、獲得ポイント(残り所持金+お弁当購入から得られる便益を計算したもの) # やっと最後。この期が終わった段階での残数を計算する。 for p in players: #!!!!ここら辺を変更!!!! start = 6*(p.subsession.Block-1)+1 p.money=p.money-p.Bought*group.Price p.points = p.money + sum([i.Bought for i in p.in_rounds(start,p.round_number)]) * 700 group.Zansu=group.Zansu-sum(Obento) class Player(BasePlayer): Choice = models.IntegerField(choices=[[1, '行く'], [0, '行かない']], label='選択', widget=widgets.RadioSelect) money = models.IntegerField() Ch2 = models.IntegerField(label='購入数', min=0) Canbuy = models.IntegerField() Order = models.IntegerField() Bought = models.IntegerField() points = models.IntegerField() finished = models.IntegerField(initial=0) def deduct_50(player: Player): group = player.group player.money=player.money-player.Choice*50 player.Canbuy=player.money//group.Price if player.Choice == 0: player.Ch2 = 0 def Ch2_max(player: Player): return player.Canbuy class WaitPage1(WaitPage): after_all_players_arrive = money_calc class Introduction(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number %6 == 1 class Cannotgo(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.finished == 1 @staticmethod def before_next_page(player: Player, timeout_happened): player.Choice=0 player.Ch2=0 class Go(Page): form_model = 'player' form_fields = ['Choice'] @staticmethod def is_displayed(player: Player): return player.finished == 0 @staticmethod def before_next_page(player: Player, timeout_happened): deduct_50(player) @staticmethod def vars_for_template(player): return dict(current_round=[6,1,2,3,4,5][player.round_number % 6],) class Buy(Page): form_model = 'player' form_fields = ['Ch2'] @staticmethod def is_displayed(player: Player): return player.Choice==1 class WaitPage2(WaitPage): after_all_players_arrive = Zansuu_calc class Result_Buy(Page): form_model = 'player' class Last(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number%6==0 page_sequence = [WaitPage1, Introduction, Cannotgo, Go, Buy, WaitPage2, Result_Buy, Last]