from otree.api import * import random doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 's2' players_per_group = None num_rounds = 2 P1_ROLE = "P1" P2_ROLE = "P2" vars_table_1 = [ {'name': 's2t100', 'vals': [20, 0, 0, 0, 10, 0]}, {'name': 's2t101', 'vals': [20, 0, 1, 1, 10, 0]}, {'name': 's2t102', 'vals': [20, 0, 2, 2, 10, 0]}, {'name': 's2t103', 'vals': [20, 0, 3, 3, 10, 0]}, {'name': 's2t104', 'vals': [20, 0, 4, 4, 10, 0]}, {'name': 's2t105', 'vals': [20, 0, 5, 5, 10, 0]}, {'name': 's2t106', 'vals': [20, 0, 6, 6, 10, 0]}, {'name': 's2t107', 'vals': [20, 0, 7, 7, 10, 0]}, {'name': 's2t108', 'vals': [20, 0, 8, 8, 10, 0]}, {'name': 's2t109', 'vals': [20, 0, 9, 9, 10, 0]}, {'name': 's2t110', 'vals': [20, 0, 10, 10, 10, 0]}, {'name': 's2t111', 'vals': [20, 0, 11, 11, 10, 0]}, {'name': 's2t112', 'vals': [20, 0, 12, 12, 10, 0]}, {'name': 's2t113', 'vals': [20, 0, 13, 13, 10, 0]}, {'name': 's2t114', 'vals': [20, 0, 14, 14, 10, 0]}, {'name': 's2t115', 'vals': [20, 0, 15, 15, 10, 0]}, {'name': 's2t116', 'vals': [20, 0, 16, 16, 10, 0]}, {'name': 's2t117', 'vals': [20, 0, 17, 17, 10, 0]}, {'name': 's2t118', 'vals': [20, 0, 18, 18, 10, 0]}, {'name': 's2t119', 'vals': [20, 0, 19, 19, 10, 0]}, {'name': 's2t120', 'vals': [20, 0, 20, 20, 10, 0]}, {'name': 's2t121', 'vals': [20, 0, 21, 21, 10, 0]} ] vars_table_2 = [ {'name': 's2t200', 'vals': [20, 0, 0, 0, 10, 0]}, {'name': 's2t201', 'vals': [20, 0, 1, 1, 10, 0]}, {'name': 's2t202', 'vals': [20, 0, 2, 2, 10, 0]}, {'name': 's2t203', 'vals': [20, 0, 3, 3, 10, 0]}, {'name': 's2t204', 'vals': [20, 0, 4, 4, 10, 0]}, {'name': 's2t205', 'vals': [20, 0, 5, 5, 10, 0]}, {'name': 's2t206', 'vals': [20, 0, 6, 6, 10, 0]}, {'name': 's2t207', 'vals': [20, 0, 7, 7, 10, 0]}, {'name': 's2t208', 'vals': [20, 0, 8, 8, 10, 0]}, {'name': 's2t209', 'vals': [20, 0, 9, 9, 10, 0]}, {'name': 's2t210', 'vals': [20, 0, 10, 10, 10, 0]}, {'name': 's2t211', 'vals': [20, 0, 11, 11, 10, 0]}, {'name': 's2t212', 'vals': [20, 0, 12, 12, 10, 0]}, {'name': 's2t213', 'vals': [20, 0, 13, 13, 10, 0]}, {'name': 's2t214', 'vals': [20, 0, 14, 14, 10, 0]}, {'name': 's2t215', 'vals': [20, 0, 15, 15, 10, 0]}, {'name': 's2t216', 'vals': [20, 0, 16, 16, 10, 0]}, {'name': 's2t217', 'vals': [20, 0, 17, 17, 10, 0]}, {'name': 's2t218', 'vals': [20, 0, 18, 18, 10, 0]}, {'name': 's2t219', 'vals': [20, 0, 19, 19, 10, 0]}, {'name': 's2t220', 'vals': [20, 0, 20, 20, 10, 0]}, {'name': 's2t221', 'vals': [20, 0, 21, 21, 10, 0]} ] class Subsession(BaseSubsession): pregunta_pago = models.IntegerField() @staticmethod def right_rotate(lst): """ Takes a list (lst) and right rotates it by one position. For example, given lst = [1, 2, 3] right_rotate returns [3, 1, 2]. """ return [lst[-1]] + lst[0:len(lst)-1] @staticmethod def is_even(number): """ This function returns true if number is even, otherwise false is returned. """ # See link for more information on the modulus operator: # https://python-reference.readthedocs.io/en/latest/docs/operators/modulus.html#modulus return number % 2 == 0 @staticmethod def creating_session(subsession): ''' This function runs at the beggining of each round. So I am choosing the same question for everyone in the session but different per round. ''' subsession.pregunta_pago = random.randint(0,21) if subsession.round_number == 1: for p in subsession.get_players(): round_nums = [1,2] random.shuffle(round_nums) p.participant.task_round_s2 = round_nums players = subsession.get_group_matrix()[0] random.shuffle(players) even_players = [p for p in players if is_even(p)] odd_players = [p for p in players if not is_even(p)] subsession.set_group_matrix([[i, j] for i,j in zip(even_players, odd_players)]) else: # See link for more info on the group_like_round function: # https://otree.readthedocs.io/en/latest/multiplayer/groups.html#group-like-round subsession.group_like_round(subsession.round_number - 1) group_matrix = subsession.get_group_matrix() # The following for loop splits the group pairs in group_matrix into two lists. # The even_players list which consists of players with an even subsession id, # and the odd_players list which consists of players with an odd subsession id. odd_players = [] even_players = [] for group in group_matrix: for player in group: if is_even(player): even_players.append(player) else: odd_players.append(player) # Only the odd players are rotated, then they are paired back with the even # players list. odd_players = right_rotate(odd_players) subsession.set_group_matrix([[i, j] for i,j in zip(even_players, odd_players)]) print(f"Displaying group matrix for round {subsession.round_number}") print(subsession.get_group_matrix()) # Save roles for p in subsession.get_players(): p.participant.vars['role_s2_' + str(p.round_number)] = p.role p.participant.vars['fila_s2_' + str(p.round_number)] = subsession.pregunta_pago class Group(BaseGroup): pass @staticmethod def get_dado(p1, p2, n, round, ses): dado = random.randint(1, 10) if dado <= n: p1.participant.vars['payoff_' + str(round + 2)] = ses.pregunta_pago p2.participant.vars['payoff_' + str(round+2)] = ses.pregunta_pago else: p1.participant.vars['payoff_' + str(round + 2)] = 10 p2.participant.vars['payoff_' + str(round+2)] = 0 @staticmethod def get_payment(group, round): #p1 = group.get_player_by_role('P1') #p2 = group.get_player_by_role('P2') #! CHECK LAS RONDAS PARA QUE EL PAGO CUADRE p1 = group.get_player_by_id(1).in_round(round) p2 = group.get_player_by_id(2).in_round(round) ses = group.subsession.in_round(round) if ses.pregunta_pago < 10: col = getattr(p1, 's2t' + str(round) + '0' + str(ses.pregunta_pago)) else: col = getattr(p1, 's2t' + str(round) + str(ses.pregunta_pago)) if col == 1: p1.participant.vars['payoff_' + str(round + 2)] = 20 p2.participant.vars['payoff_' + str(round + 2)] = 0 else: get_dado(p1, p2, 7, round, ses) class Player(BasePlayer): # ############################################################### # # VARIABLES A USARSE EN LA TABLA 1 # ############################################################### # s2t100 = models.IntegerField() s2t101 = models.IntegerField() s2t102 = models.IntegerField() s2t103 = models.IntegerField() s2t104 = models.IntegerField() s2t105 = models.IntegerField() s2t106 = models.IntegerField() s2t107 = models.IntegerField() s2t108 = models.IntegerField() s2t109 = models.IntegerField() s2t110 = models.IntegerField() s2t111 = models.IntegerField() s2t112 = models.IntegerField() s2t113 = models.IntegerField() s2t114 = models.IntegerField() s2t115 = models.IntegerField() s2t116 = models.IntegerField() s2t117 = models.IntegerField() s2t118 = models.IntegerField() s2t119 = models.IntegerField() s2t120 = models.IntegerField() s2t121 = models.IntegerField() # ############################################################### # # ############################################################### # # VARIABLES A USARSE EN LA TABLA 1 # ############################################################### # s2t200 = models.IntegerField() s2t201 = models.IntegerField() s2t202 = models.IntegerField() s2t203 = models.IntegerField() s2t204 = models.IntegerField() s2t205 = models.IntegerField() s2t206 = models.IntegerField() s2t207 = models.IntegerField() s2t208 = models.IntegerField() s2t209 = models.IntegerField() s2t210 = models.IntegerField() s2t211 = models.IntegerField() s2t212 = models.IntegerField() s2t213 = models.IntegerField() s2t214 = models.IntegerField() s2t215 = models.IntegerField() s2t216 = models.IntegerField() s2t217 = models.IntegerField() s2t218 = models.IntegerField() s2t219 = models.IntegerField() s2t220 = models.IntegerField() s2t221 = models.IntegerField() # PAGES class Instrucciones(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Instrucciones1(Page): #@staticmethod #def vars_for_template(player: Player): # return {'task_num': player.participant.task_round_s2[0]} @staticmethod def is_displayed(player: Player): return player.round_number == 1 #player.participant.task_round_s2[0] class table1(Page): form_model = 'player' form_fields = ['s2t100', 's2t101', 's2t102', 's2t103', 's2t104', 's2t105', 's2t106', 's2t107', 's2t108', 's2t109', 's2t110', 's2t111', 's2t112', 's2t113', 's2t114', 's2t115', 's2t116', 's2t117', 's2t118', 's2t119', 's2t120', 's2t121'] @staticmethod def vars_for_template(player): return { 'task_num': player.participant.task_round_s2[0], "vars_table": [ {'name': 's2t100', 'vals': [20, 0, 0, 0, 10, 0]}, {'name': 's2t101', 'vals': [20, 0, 1, 1, 10, 0]}, {'name': 's2t102', 'vals': [20, 0, 2, 2, 10, 0]}, {'name': 's2t103', 'vals': [20, 0, 3, 3, 10, 0]}, {'name': 's2t104', 'vals': [20, 0, 4, 4, 10, 0]}, {'name': 's2t105', 'vals': [20, 0, 5, 5, 10, 0]}, {'name': 's2t106', 'vals': [20, 0, 6, 6, 10, 0]}, {'name': 's2t107', 'vals': [20, 0, 7, 7, 10, 0]}, {'name': 's2t108', 'vals': [20, 0, 8, 8, 10, 0]}, {'name': 's2t109', 'vals': [20, 0, 9, 9, 10, 0]}, {'name': 's2t110', 'vals': [20, 0, 10, 10, 10, 0]}, {'name': 's2t111', 'vals': [20, 0, 11, 11, 10, 0]}, {'name': 's2t112', 'vals': [20, 0, 12, 12, 10, 0]}, {'name': 's2t113', 'vals': [20, 0, 13, 13, 10, 0]}, {'name': 's2t114', 'vals': [20, 0, 14, 14, 10, 0]}, {'name': 's2t115', 'vals': [20, 0, 15, 15, 10, 0]}, {'name': 's2t116', 'vals': [20, 0, 16, 16, 10, 0]}, {'name': 's2t117', 'vals': [20, 0, 17, 17, 10, 0]}, {'name': 's2t118', 'vals': [20, 0, 18, 18, 10, 0]}, {'name': 's2t119', 'vals': [20, 0, 19, 19, 10, 0]}, {'name': 's2t120', 'vals': [20, 0, 20, 20, 10, 0]}, {'name': 's2t121', 'vals': [20, 0, 21, 21, 10, 0]} ], } @staticmethod def is_displayed(player: Player): return player.round_number == 1 #player.participant.task_round_s2[0] class Instrucciones2(Page): #@staticmethod #def vars_for_template(player: Player): # return {'task_num': player.participant.task_round_s2[1]} @staticmethod def is_displayed(player: Player): return player.round_number == 2 #player.participant.task_round_s2[1] class table2(Page): form_model = 'player' form_fields = ['s2t200', 's2t201', 's2t202', 's2t203', 's2t204', 's2t205', 's2t206', 's2t207', 's2t208', 's2t209', 's2t210', 's2t211', 's2t212', 's2t213', 's2t214', 's2t215', 's2t216', 's2t217', 's2t218', 's2t219', 's2t220', 's2t221'] @staticmethod def vars_for_template(player): return { 'task_num': player.participant.task_round_s2[1], "vars_table": [ {'name': 's2t200', 'vals': [20, 0, 0, 0, 10, 0]}, {'name': 's2t201', 'vals': [20, 0, 1, 1, 10, 0]}, {'name': 's2t202', 'vals': [20, 0, 2, 2, 10, 0]}, {'name': 's2t203', 'vals': [20, 0, 3, 3, 10, 0]}, {'name': 's2t204', 'vals': [20, 0, 4, 4, 10, 0]}, {'name': 's2t205', 'vals': [20, 0, 5, 5, 10, 0]}, {'name': 's2t206', 'vals': [20, 0, 6, 6, 10, 0]}, {'name': 's2t207', 'vals': [20, 0, 7, 7, 10, 0]}, {'name': 's2t208', 'vals': [20, 0, 8, 8, 10, 0]}, {'name': 's2t209', 'vals': [20, 0, 9, 9, 10, 0]}, {'name': 's2t210', 'vals': [20, 0, 10, 10, 10, 0]}, {'name': 's2t211', 'vals': [20, 0, 11, 11, 10, 0]}, {'name': 's2t212', 'vals': [20, 0, 12, 12, 10, 0]}, {'name': 's2t213', 'vals': [20, 0, 13, 13, 10, 0]}, {'name': 's2t214', 'vals': [20, 0, 14, 14, 10, 0]}, {'name': 's2t215', 'vals': [20, 0, 15, 15, 10, 0]}, {'name': 's2t216', 'vals': [20, 0, 16, 16, 10, 0]}, {'name': 's2t217', 'vals': [20, 0, 17, 17, 10, 0]}, {'name': 's2t218', 'vals': [20, 0, 18, 18, 10, 0]}, {'name': 's2t219', 'vals': [20, 0, 19, 19, 10, 0]}, {'name': 's2t220', 'vals': [20, 0, 20, 20, 10, 0]}, {'name': 's2t221', 'vals': [20, 0, 21, 21, 10, 0]}] } @staticmethod def is_displayed(player: Player): return player.round_number == 2 #player.participant.task_round_s2[1] class FinalWait(WaitPage): @staticmethod def is_displayed(player: Player): return player.round_number == 2 @staticmethod def after_all_players_arrive(group: Group): get_payment(group, 1) get_payment(group, 2) page_sequence = [Instrucciones, Instrucciones1, table1, Instrucciones2, table2, FinalWait]