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_reward' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 10 ENDOWMENT = 100 REWARD_SIZE = 200 INSTRUCTIONS_TEMPLATE = 'trust_reward/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.r_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(min=0) profit = models.FloatField(min=0) prob_r = models.FloatField() 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_r = (15 - group.multiplier)*0.05 if (p2.r_random <= group.prob_r ) & (group.announcement != group.multiplier): p2.reward = 0 else: p2.reward = 1 p1.reward = 0 p1.subsidy = 0 p2.subsidy = p2.reward * C.REWARD_SIZE p1.payoff = C.ENDOWMENT - group.sent_amount + group.sent_back_amount p2.payoff = group.sent_amount * group.multiplier - group.sent_back_amount + p2.subsidy p1.points = C.ENDOWMENT - group.sent_amount + group.sent_back_amount p2.points = group.sent_amount * group.multiplier - group.sent_back_amount + p2.subsidy class Player(BasePlayer): total_points = models.FloatField() points = models.FloatField() r_random = models.FloatField() reward = models.BooleanField() subsidy = 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 Results(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, Results, Final]