from otree.api import * import random doc = """ Main section, containing instructions for part 2 and 16 ring games for part two """ class C(BaseConstants): NAME_IN_URL = 'Reverse' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 num_questions = 4 payoffs = { 'Ring_1': {'Skip': 1, "A1": 0, "B1": 8, "C1": 0, "D1": 0}, # Payoffs for choices in question 'Ring_2': {'Skip': 1, "A1": 0, "B1": 0, "C1": 0, "D1": 9}, 'Ring_3': {'Skip': 1, "A1": 4, "B1": 8, "C1": 3, "D1": 6}, 'Ring_4': {'Skip': 1, "A1": 7, "B1": 5, "C1": 8, "D1": 9}, 'Ring_5': {'Skip': 1, "A1": 0, "B1": 8, "C1": 0}, 'Ring_6': {'Skip': 1, "A1": 9, "B1": 0, "C1": 0}, 'Ring_7': {'Skip': 1, "A1": 0, "B1": 0, "C1": 9, "D1": 0, "E1": 0}, 'Ring_8': {'Skip': 1, "A1": 0, "B1": 9, "C1": 0, "D1": 0, "E1": 0}, 'Ring_9': {'Skip': 1, "A1": 0, "B1": 8, "C1": 0, "D1": 6}, 'Ring_10': {'Skip': 1, "A1": 7, "B1": 0, "C1": 8, "D1": 9}, 'Ring_11': {'Skip': 1, "A1": 4, "B1": 8, "C1": 3, "D1": 6}, 'Ring_12': {'Skip': 1, "A1": 7, "B1": 5, "C1": 8, "D1": 9}, 'Ring_13': {'Skip': 1, "A1": 0, "B1": 8, "C1": 0, "D1": 0}, 'Ring_14': {'Skip': 1, "A1": 0, "B1": 0, "C1": 0, "D1": 9}, 'Ring_15': {'Skip': 1, "A1": 4, "B1": 8, "C1": 3, "D1": 6}, 'Ring_16': {'Skip': 1, "A1": 7, "B1": 5, "C1": 8, "D1": 9}, } class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): current_question = models.IntegerField(initial=1) Ring_1 = models.StringField(label="What's your choice?", choices=['Skip', 'A1', 'B1', 'C1', 'D1'], widget=widgets.RadioSelectHorizontal) Ring_2 = models.StringField(label="What's your choice?", choices=['Skip', 'A1', 'B1', 'C1', 'D1'], widget=widgets.RadioSelectHorizontal) Ring_3 = models.StringField(label="What's your choice?", choices=['Skip', 'A1', 'B1', 'C1', 'D1'], widget=widgets.RadioSelectHorizontal) Ring_4 = models.StringField(label="What's your choice?", choices=['Skip', 'A1', 'B1', 'C1', 'D1'], widget=widgets.RadioSelectHorizontal) Ring_5 = models.StringField(label="What's your choice?", choices=['Skip', 'A1', 'B1', 'C1'], widget=widgets.RadioSelectHorizontal) Ring_6 = models.StringField(label="What's your choice?", choices=['Skip', 'A1', 'B1', 'C1'], widget=widgets.RadioSelectHorizontal) Ring_7 = models.StringField(label="What's your choice?", choices=['Skip', 'A1', 'B1', 'C1', 'D1', 'F1'], widget=widgets.RadioSelectHorizontal) Ring_8 = models.StringField(label="What's your choice?", choices=['Skip', 'A1', 'B1', 'C1', 'D1', 'F1'], widget=widgets.RadioSelectHorizontal) Ring_9 = models.StringField(label="What's your choice?", choices=['Skip', 'A1', 'B1', 'C1', 'D1'], widget=widgets.RadioSelectHorizontal) Ring_10 = models.StringField(label="What's your choice?", choices=['Skip', 'A1', 'B1', 'C1', 'D1'], widget=widgets.RadioSelectHorizontal) Ring_11 = models.StringField(label="What's your choice?", choices=['Skip', 'A1', 'B1', 'C1', 'D1'], widget=widgets.RadioSelectHorizontal) Ring_12 = models.StringField(label="What's your choice?", choices=['Skip', 'A1', 'B1', 'C1', 'D1'], widget=widgets.RadioSelectHorizontal) Ring_13 = models.StringField(label="What's your choice?", choices=['Skip', 'A1', 'B1', 'C1', 'D1'], widget=widgets.RadioSelectHorizontal) Ring_14 = models.StringField(label="What's your choice?", choices=['Skip', 'A1', 'B1', 'C1', 'D1'], widget=widgets.RadioSelectHorizontal) Ring_15 = models.StringField(label="What's your choice?", choices=['Skip', 'A1', 'B1', 'C1', 'D1'], widget=widgets.RadioSelectHorizontal) Ring_16 = models.StringField(label="What's your choice?", choices=['Skip', 'A1', 'B1', 'C1', 'D1'], widget=widgets.RadioSelectHorizontal) Outcome_1 = models.IntegerField(initial=0) Outcome_2 = models.IntegerField(initial=0) Outcome_3 = models.IntegerField(initial=0) Outcome_4 = models.IntegerField(initial=0) Outcome_5 = models.IntegerField(initial=0) Outcome_6 = models.IntegerField(initial=0) Outcome_7 = models.IntegerField(initial=0) Outcome_8 = models.IntegerField(initial=0) Outcome_9 = models.IntegerField(initial=0) Outcome_10 = models.IntegerField(initial=0) Outcome_11 = models.IntegerField(initial=0) Outcome_12 = models.IntegerField(initial=0) Outcome_13 = models.IntegerField(initial=0) Outcome_14 = models.IntegerField(initial=0) Outcome_15 = models.IntegerField(initial=0) Outcome_16 = models.IntegerField(initial=0) clicked_cell_ring1 = models.LongStringField(blank=True) clicked_cell_ring2 = models.LongStringField(blank=True) clicked_cell_ring3 = models.LongStringField(blank=True) clicked_cell_ring4 = models.LongStringField(blank=True) clicked_cell_ring5 = models.LongStringField(blank=True) clicked_cell_ring6 = models.LongStringField(blank=True) clicked_cell_ring7 = models.LongStringField(blank=True) clicked_cell_ring8 = models.LongStringField(blank=True) clicked_cell_ring9 = models.LongStringField(blank=True) clicked_cell_ring10 = models.LongStringField(blank=True) clicked_cell_ring11 = models.LongStringField(blank=True) clicked_cell_ring12 = models.LongStringField(blank=True) clicked_cell_ring13 = models.LongStringField(blank=True) clicked_cell_ring14 = models.LongStringField(blank=True) clicked_cell_ring15 = models.LongStringField(blank=True) clicked_cell_ring16 = models.LongStringField(blank=True) def set_outcomes(player): outcomes_dict = {} for question_number in range(1, 17): choice_field_name = f'Ring_{question_number}' choice = getattr(player, choice_field_name) outcome_dict = C.payoffs[choice_field_name] outcome = outcome_dict.get(choice, 0) outcomes_dict[choice_field_name] = outcome setattr(player, f'Outcome_{question_number}', outcome) # Store the outcomes dictionary in the participant fields player.participant.outcomes_dict = outcomes_dict def calculate_total_payoff(player): outcomes = [getattr(player, f'Outcome_{i}') for i in range(1, 17)] random_outcomes = random.sample(outcomes, 4) total_payoff = sum(random_outcomes) player.payoff = total_payoff # Store the total payoff in the participant's fields for later use player.participant.payoff_rev = total_payoff player.participant.payoff_main = 0 # PAGES class Ring1(Page): form_model = 'player' form_fields = ['Ring_1', 'clicked_cell_ring1'] class Ring2(Page): form_model = 'player' form_fields = ['Ring_2', 'clicked_cell_ring2'] class Ring3(Page): form_model = 'player' form_fields = ['Ring_3', 'clicked_cell_ring3'] class Ring4(Page): form_model = 'player' form_fields = ['Ring_4', 'clicked_cell_ring4'] class Ring5(Page): form_model = 'player' form_fields = ['Ring_5', 'clicked_cell_ring5'] class Ring6(Page): form_model = 'player' form_fields = ['Ring_6', 'clicked_cell_ring6'] class Ring7(Page): form_model = 'player' form_fields = ['Ring_7', 'clicked_cell_ring7'] class Ring8(Page): form_model = 'player' form_fields = ['Ring_8', 'clicked_cell_ring8'] class Ring9(Page): form_model = 'player' form_fields = ['Ring_9', 'clicked_cell_ring9'] class Ring10(Page): form_model = 'player' form_fields = ['Ring_10', 'clicked_cell_ring10'] class Ring11(Page): form_model = 'player' form_fields = ['Ring_11', 'clicked_cell_ring11'] class Ring12(Page): form_model = 'player' form_fields = ['Ring_12', 'clicked_cell_ring12'] class Ring13(Page): form_model = 'player' form_fields = ['Ring_13', 'clicked_cell_ring13'] class Ring14(Page): form_model = 'player' form_fields = ['Ring_14', 'clicked_cell_ring14'] class Ring15(Page): form_model = 'player' form_fields = (['Ring_15', 'clicked_cell_ring15']) @staticmethod def before_next_page(player, timeout_happened): set_outcomes(player) calculate_total_payoff(player) class Ring16(Page): form_model = 'player' form_fields = ['Ring_16', 'clicked_cell_ring16'] class Results(Page): pass page_sequence = [Ring9, Ring14, Ring16, Ring3, Ring7, Ring4, Ring2, Ring5, Ring8, Ring13, Ring6, Ring12, Ring1, Ring11, Ring10, Ring15 ] # page_sequence = [ Ring16, Ring15, Ring14, Ring13,Ring12, Ring11, Ring10, # Ring9, Ring8, Ring7, Ring6, Ring5, Ring4, Ring3, Ring2, Ring1, ]