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' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 10 ENDOWMENT = 100 PENALTY_SIZE = -200 INSTRUCTIONS_TEMPLATE = 'trust_punish/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='', max=C.ENDOWMENT, min=0) sent_back_amount = models.FloatField(label='', min=0) profit = models.FloatField(min=0) prob_p = models.FloatField(min=0.3) def sent_back_amount_calc(group: Group): group.sent_back_amount = 0.2 * group.sent_amount * group.multiplier def set_payoffs(group: Group): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) group.prob_p = (group.multiplier + 5)*0.05 if (p2.p_random <= group.prob_p ) & ( group.announcement != group.multiplier): p2.penalty = 1 else: p2.penalty = 0 p1.penalty = 0 p1.punishment = 0 p2.punishment = p2.penalty * C.PENALTY_SIZE p1.payoff = C.ENDOWMENT - group.sent_amount + group.sent_back_amount p2.payoff = group.sent_amount * group.multiplier - group.sent_back_amount + p2.punishment p1.points = C.ENDOWMENT - group.sent_amount + group.sent_back_amount p2.points = group.sent_amount * group.multiplier - group.sent_back_amount + p2.punishment class Player(BasePlayer): total_points = models.FloatField() points = models.FloatField() p_random = models.FloatField() penalty = models.BooleanField() punishment = models.IntegerField() def total_payoffs(player: Player): player.total_points = sum([p.points for p in player.in_all_rounds()]) class Introduction(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == 1 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 Result(Page): form_model = 'player' @staticmethod def vars_for_template(player: Player): group = player.group return dict(revenue=group.multiplier * group.sent_amount) @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, Result, Final]