from otree.api import * doc = """ Human version of the prisoners game that is asynchronous. """ class C(BaseConstants): NAME_IN_URL = 'human_game' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 PAYOFF_A = cu(300) PAYOFF_B = cu(200) PAYOFF_C = cu(100) PAYOFF_D = cu(0) CHOICES = [[True, 'Cooperate'], [False, 'Defect']] class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): cooperate = models.BooleanField( choices=C.CHOICES, widget=widgets.RadioSelect, ) is_p1 = models.BooleanField() other_p_cooperate = models.BooleanField(choices=C.CHOICES) partner_id = models.IntegerField() # FUNCTIONS def creating_session(subsession: Subsession): session = subsession.session # Queue of players who are finished. session.finished_p1_list = [] 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.other_p_cooperate)] # PAGES class HumanG_Intro(Page): @staticmethod def before_next_page(player: Player, timeout_happened): group = player.group session = player.session finished_p1_list = session.finished_p1_list if finished_p1_list: player.is_p1 = False player.partner_id = finished_p1_list.pop() p1 = group.get_player_by_id(player.partner_id) p1.partner_id = player.id_in_group else: player.is_p1 = True class HumanG_P1Decision(Page): @staticmethod def is_displayed(player: Player): return player.is_p1 form_model = 'player' form_fields = ['cooperate'] @staticmethod def vars_for_template(player): return dict( session_name=player.session.config['treatment_name'] ) @staticmethod def before_next_page(player: Player, timeout_happened): session = player.session session.finished_p1_list.append(player.id_in_group) class HumanG_P1Results(Page): @staticmethod def is_displayed(player: Player): return player.is_p1 @staticmethod def vars_for_template(player: Player): return dict( my_decision=player.field_display('cooperate'), ) class HumanG_P2Decision(Page): @staticmethod def is_displayed(player: Player): return not player.is_p1 form_model = 'player' form_fields = ['cooperate'] @staticmethod def vars_for_template(player): group = player.group p1 = group.get_player_by_id(player.partner_id) player.other_p_cooperate = p1.cooperate return dict( session_name=player.session.config['treatment_name'], p1=p1, ) @staticmethod def before_next_page(player: Player, timeout_happened): group = player.group p1 = group.get_player_by_id(player.partner_id) set_payoff(player) # session = player.session # session.finished_p1_list.append(player.id_in_group) class HumanG_P2Results(Page): @staticmethod def is_displayed(player: Player): return not player.is_p1 @staticmethod def vars_for_template(player: Player): group = player.group p1 = group.get_player_by_id(player.partner_id) return dict( same_choice=player.cooperate == player.other_p_cooperate, my_decision=player.field_display('cooperate'), other_p_decision=player.field_display('other_p_cooperate'), p1=p1, ) page_sequence = [ HumanG_Intro, HumanG_P1Decision, HumanG_P1Results, HumanG_P2Decision, HumanG_P2Results, ]