from otree.api import * import random 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) 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 elif player.round_number == 8 or player.round_number == 16 or player.round_number == 24: prev_player = player.in_round(player.round_number - 1) player.bot_cooperate = not prev_player.cooperate else: prev_player = player.in_round(player.round_number - 1) player.bot_cooperate = prev_player.cooperate set_payoff(player) class WaitOther(Page): @staticmethod def get_timeout_seconds(player: Player): return random.randint(2, 7) 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]