from otree.api import * c = cu doc = '\nThis is a standard 2-player trust game where the amount sent by player 1 gets\ntripled. The trust game was first proposed by\n\n Berg, Dickhaut, and McCabe (1995)\n.\n' class C(BaseConstants): NAME_IN_URL = 'trust_punish_henreinasi' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 10 ENDOWMENT = 100 PROB_P = 0.5 PENALTY_SIZE = -100 INSTRUCTIONS_TEMPLATE = 'trust_punish_henreinasi/instructions.html' class Subsession(BaseSubsession): pass def creating_session(subsession: Subsession): session = subsession.session subsession.group_randomly(fixed_id_in_group=True) for g in subsession.get_groups(): import random g.multiplier = random.randint(1,10) for p in subsession.get_players(): p.p_random = random.random() class Group(BaseGroup): multiplier = models.IntegerField() announcement = models.IntegerField(label='公開する収益力', max=10, min=1) sent_amount = models.IntegerField(label='Please enter an amount from 0 to 100', max=C.ENDOWMENT, min=0) sent_back_amount = models.FloatField(min=0) profit = models.FloatField(min=0) def sent_back_amount_calc(group: Group): group.sent_back_amount = 0.2 * group.sent_amount * group.announcement def set_payoffs(group: Group): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) if (p2.p_random <= C.PROB_P ) & ( group.announcement != group.multiplier): p2.penalty = 1 else: p2.penalty = 0 p1.penalty = 0 if (group.multiplier != group.announcement) & (p2.penalty == 0): p1.refund = 0 else: p1.refund = 1 if p1.refund == 1: p2.refund = 1 if p1.refund == 0: p2.refund = 0 p1.payoff = C.ENDOWMENT - group.sent_amount + group.sent_back_amount * p1.refund p2.payoff = group.sent_amount * group.multiplier - group.sent_back_amount * p2.refund + p2.penalty * C.PENALTY_SIZE p1.points = C.ENDOWMENT - group.sent_amount + group.sent_back_amount * p1.refund p2.points = group.sent_amount * group.multiplier - group.sent_back_amount * p2.refund + p2.penalty * C.PENALTY_SIZE def profit_calc(group: Group): group.profit = group.multiplier * group.sent_amount class Player(BasePlayer): total_points = models.FloatField() points = models.FloatField() p_random = models.FloatField() penalty = models.BooleanField() refund = models.BooleanField() def total_payoffs(player: Player): player.total_points = sum([p.points for p in player.in_all_rounds()]) class Introduction(Page): form_model = 'player' class Decision_making(Page): form_model = 'group' form_fields = ['announcement'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 2 class Decision_wait(WaitPage): pass class Send(Page): form_model = 'group' form_fields = ['sent_amount'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 1 @staticmethod def before_next_page(player: Player, timeout_happened): group = player.group sent_back_amount_calc(group) class ResultsWaitPage(WaitPage): after_all_players_arrive = set_payoffs class Results(Page): form_model = 'player' @staticmethod def vars_for_template(player: Player): group = player.group return dict(tripled_amount=group.sent_amount * group.announcement * 0.2) @staticmethod def before_next_page(player: Player, timeout_happened): total_payoffs(player) class Final(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS page_sequence = [Introduction, Decision_making, Decision_wait, Send, ResultsWaitPage, Results, Final]