from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random doc = """ ステージ4 """ class Constants(BaseConstants): name_in_url = 'S4_UG2in' players_per_group = 4 num_rounds = 1 instructions_template = 'S4_UG2in/Instructions.html' endowment = c(1200) total_endowment = c(2400) payoff_if_rejected = c(0) offer_increment = c(100) offer_choices = currency_range(0, endowment, offer_increment) offer_choices_count = len(offer_choices) keep_give_amounts = [] for offer in offer_choices: keep_give_amounts.append((offer, endowment - offer)) random_number = random.random() class Subsession(BaseSubsession): def creating_session(self): new_structure = [[1, 2, 7, 8], [3, 4, 9, 10], [5, 6, 11, 12], [13, 14, 19, 20], [15, 16, 21, 22], [17, 18, 23, 24], [25, 26, 31, 32], [27, 28, 33, 34], [29, 30, 35, 36], [37, 38, 45, 46], [39, 40, 47, 48], [41, 42, 49, 50], [43, 44, 51, 52]] self.set_group_matrix(new_structure) def make_field(amount): return models.BooleanField( widget=widgets.RadioSelectHorizontal, label='あなたは「チームBの各プレイヤーに{}を渡す」という提案を受け入れますか?'.format(c(amount))) class Group(BaseGroup): proposer_amount_offered = models.CurrencyField(choices=Constants.offer_choices) responder_offer_accepted = models.BooleanField( doc="if offered amount is accepted" ) def set_payoffs(self): p1 = self.get_player_by_role('player_A') p2 = self.get_player_by_role('player_B') p3 = self.get_player_by_role('player_C') p4 = self.get_player_by_role('player_D') if Constants.random_number >= 0.5: self.proposer_amount_offered = p1.amount_offered self.responder_offer_accepted = getattr(p3, 'response_{}'.format( int(p1.amount_offered))) else: self.proposer_amount_offered = p3.amount_offered self.responder_offer_accepted = getattr(p1, 'response_{}'.format( int(p3.amount_offered))) if self.responder_offer_accepted: p1.payoff = Constants.endowment - self.proposer_amount_offered p2.payoff = self.proposer_amount_offered p3.payoff = Constants.endowment - self.proposer_amount_offered p4.payoff = self.proposer_amount_offered else: p1.payoff = Constants.payoff_if_rejected p2.payoff = Constants.payoff_if_rejected p3.payoff = Constants.payoff_if_rejected p4.payoff = Constants.payoff_if_rejected class Player(BasePlayer): ID_number = models.IntegerField() amount_offered = models.CurrencyField(choices=Constants.offer_choices) response_0 = make_field(0) response_100 = make_field(100) response_200 = make_field(200) response_300 = make_field(300) response_400 = make_field(400) response_500 = make_field(500) response_600 = make_field(600) response_700 = make_field(700) response_800 = make_field(800) response_900 = make_field(900) response_1000 = make_field(1000) response_1100 = make_field(1100) response_1200 = make_field(1200) def role(self): if self.id_in_group == 1: return 'player_A' elif self.id_in_group == 2: return 'player_B' elif self.id_in_group == 3: return 'player_C' else: return 'player_D'