from otree.api import * import random doc = """ Adaptated @Chris Otree """ class C(BaseConstants): NAME_IN_URL = 'TP2402' PLAYERS_PER_GROUP = None NUM_ROUNDS = 30 PAYOFF_A = cu(300) PAYOFF_B = cu(200) PAYOFF_C = cu(100) PAYOFF_D = cu(0) NOISE = 0.1 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): cooperate = models.BooleanField( choices=[[True, 'A'], [False, 'B']], widget=widgets.RadioSelect, ) bot_cooperate = models.BooleanField( choices=[[True, 'A'], [False, 'B']], ) def set_payoff(player: Player): payoff_matrix = { (False, True): C.PAYOFF_A, (True, True): C.PAYOFF_B, (False, False): C.PAYOFF_C, (True, False): C.PAYOFF_D, } player.payoff = payoff_matrix[(player.cooperate, player.bot_cooperate)] class Decision(Page): form_model = 'player' form_fields = ['cooperate'] @staticmethod def before_next_page(player: Player, timeout_happened): import random vCoop = None prev_player = None if (player.round_number == 1): player.bot_cooperate = True else: prev_player = player.in_round(player.round_number - 1) if (random.choices([True, False], weights=[C.NOISE, 1 - C.NOISE], k=1)): vCoop = random.choices([True, False], weights=[0.5, 0.5], k=1) player.bot_cooperate = vCoop[0] else: player.bot_cooperate = prev_player.cooperate set_payoff(player) class WaitOther(Page): @staticmethod def get_timeout_seconds(player: Player): return random.randint(4, 8) class Results(Page): @staticmethod def vars_for_template(player: Player): return dict( same_choice=player.cooperate == player.bot_cooperate, my_decision=player.field_display('cooperate'), bot_decision=player.field_display('bot_cooperate'), ) page_sequence = [Decision, WaitOther, Results]