from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, Page, WaitPage ) cu = c doc = '\nThis is a one-shot "Prisoner\'s Dilemma". Two players are asked separately\nwhether they want to cooperate or defect. Their choices directly determine the\npayoffs.\n' class Constants(BaseConstants): name_in_url = 'prisoner2' players_per_group = 2 num_rounds = 10 betray_payoff = c(100) betrayed_payoff = c(0) both_cooperate_payoff = c(50) both_defect_payoff = c(0) instructions_template = 'prisoner2/instructions.html' def pay_off_meals(subsession): session = subsession.session for player in subsession.get_players(): player.payoff = 0 def num_value(subsession): session = subsession.session players = subsession.get_players() harvest = [player.num_payoff for player in players] subsession.total_contribution = sum(harvest) players = subsession.get_players() def number_of_economists(subsession): session = subsession.session players = subsession.get_players() economists = [] for player in players: if player.profession == 'Economist': economists.append(player) subsession.num_economists = len(economists) def number_of_socialists(subsession): session = subsession.session players = subsession.get_players() socialists = [] for player in players: if player.profession == 'Socialists': socialists.append(player) subsession.num_socialists = len(socialists) def my_function(subsession): pass class Subsession(BaseSubsession): my_field = models.IntegerField() pay_off_meals = pay_off_meals num_value = num_value number_of_economists = number_of_economists number_of_socialists = number_of_socialists my_function = my_function def set_payoffs(group): for player in group.get_players(): player.payoff = 0 def add_up_value(group): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) p1.payoff = group.blueberries_eaten_by_p1 p2.payoff = Constants.initial_blueberries - group.blueberries_eaten_by_p1 def num_economist(group): players = group.get_players() economists = [] for player in players: if player.profession == 'Economist': economists.append(player) group.num_economists = len(economists) def num_socialist(group): players = group.get_players() socialists = [] for player in players: if player.profession == 'Socialist': socialists.append(player) group.num_socialists = len(socialists) class Group(BaseGroup): set_payoffs = set_payoffs add_up_value = add_up_value num_economist = num_economist num_socialist = num_socialist def other_player(player): group = player.group return player.get_others_in_group()[0] def set_payoff(player): payoff_matrix = dict( Cooperate=dict( Cooperate=Constants.both_cooperate_payoff, Defect=Constants.betrayed_payoff ), Defect=dict( Cooperate=Constants.betray_payoff, Defect=Constants.both_defect_payoff ), ) player.payoff = payoff_matrix[player.decision][other_player(player).decision] class Player(BasePlayer): Name_player = models.StringField(initial='What is your name?', label='') Age_player = models.IntegerField(initial=0, max=99, min=0, widget=widgets.RadioSelect) my_field = models.BooleanField(initial=True) my_field2 = models.StringField() other_player = other_player set_payoff = set_payoff def custom_export(players): yield ['participant_code', 'id_in_group'] for p in players: pp = p.participant yield [pp.code, p.id_in_group]