from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import math author = 'Kengo_Suzuki' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'N_player_pd_class_3p' players_per_group = None num_rounds = 20 payment_red = 100 multiplier = 3 class Subsession(BaseSubsession): def creating_session(self): group_matrix = [] players = self.get_players() ppg = self.session.config['players_per_group'] for i in range(0, len(players), ppg): group_matrix.append(players[i:i+ppg]) self.set_group_matrix(group_matrix) class Group(BaseGroup): count_red = models.IntegerField( initial=0, ) count_black = models.IntegerField( initial=0, ) profit = models.IntegerField( initial=0, ) def set_profits(self): ppg = self.session.config['players_per_group'] # 赤と黒を選んだプレイヤー数をカウント for p in self.get_players(): if p.decision == '赤のコイン': self.count_red = self.count_red + 1 else: self.count_black = self.count_black + 1 print('ppg is', ppg) # デバッグ用 print('count_red is', self.count_red) # デバッグ用 print('count_black is', self.count_black) # デバッグ用 # 赤を選んだプレイヤーは payment_red の金額を支払う for p in self.get_players(): if self.round_number == 1: if p.decision == '赤のコイン': p.profit_accumulation = -Constants.payment_red else: p.profit_accumulation = 0 else: if p.decision == '赤のコイン': p.profit_accumulation = p.in_round(self.round_number - 1).profit_accumulation\ - Constants.payment_red else: p.profit_accumulation = p.in_round(self.round_number - 1).profit_accumulation print('profit_accumulation is', p.profit_accumulation) # デバッグ用 # 支払総額を multiplier 倍して全員に支払う self.profit = math.floor(Constants.multiplier * Constants.payment_red * self.count_red/ppg) print('profit is', self.profit) # デバッグ用 for p in self.get_players(): p.profit_accumulation = p.profit_accumulation + self.profit print('profit_accumulation is', p.profit_accumulation) # デバッグ用 class Player(BasePlayer): decision = models.StringField( choices=['赤のコイン', '黒のコイン'], initial='赤のコイン', widget=widgets.RadioSelect, ) profit_accumulation = models.IntegerField( initial=0, ) def custom_export(players): # header row yield ['group','round_number', 'id_in_group','decision', ' profit'] for p in players: yield [p.group.id_in_subsession, p.round_number, p.id_in_group, p.decision, p. profit_accumulation]