from otree.api import * import os from time import sleep doc = """ a.k.a. Keynesian beauty contest. Players all guess a number; whoever guesses closest to 2/3 of the average wins. See https://en.wikipedia.org/wiki/Guess_2/3_of_the_average """ class C(BaseConstants): NUM_ROUNDS = 1 NAME_IN_URL = 'OnlineExpMemory' # JACKPOT = Currency(100) # GUESS_MAX = 100 INSTRUCTIONS_TEMPLATE_P = 'OnlineExpMemory/instructionsP.html' INSTRUCTIONS_TEMPLATE_R = 'OnlineExpMemory/instructionsR.html' INSTRUCTIONS_TEMPLATE_PR = 'OnlineExpMemory/instructionsPR.html' rule = 'Only move a rock if it touches at least two rocks of the other color' N_CHAINS = 2 N_GENS = 3 PLAYERS_PER_GROUP = N_GENS MAT_INIT = [] with open('OnlineExpMemory/grid_init.txt', encoding='utf-8') as file: for line in file: str_list = line.split() int_list = list(map(int, str_list)) MAT_INIT.append(int_list) class Subsession(BaseSubsession): pass # # class Subsession(BaseSubsession): # print('here?') def creating_session(subsession): # C.NUM_ROUNDS = self.session.config['num_demo_participants'] new_structure = [[1,3,5], [2,4,6]] subsession.set_group_matrix(new_structure) class Group(BaseGroup): pass class Player(BasePlayer): moves = models.StringField(initial = "") final_grid = models.StringField() objective_grid = models.StringField() objective_rule = models.StringField() # transmitted_rule = models.StringField() transmitted_rule = models.StringField( label="Please enter the rule that you have memorized", ) # PAGES class IntroductionP(Page): def is_displayed(player : Player): return player.session.config['treatment'] == 1 @staticmethod def vars_for_template(player: Player): return dict(treatment = player.session.config['treatment']) class IntroductionR(Page): def is_displayed(player : Player): return player.session.config['treatment'] == 2 @staticmethod def vars_for_template(player: Player): return dict(treatment = player.session.config['treatment']) class IntroductionPR(Page): def is_displayed(player : Player): return player.session.config['treatment'] == 3 @staticmethod def vars_for_template(player: Player): return dict(treatment = player.session.config['treatment']) # def is_displayed(player: Player): # current_round = player.group.round_number # name = '/Users/jeremyperez/Downloads/OBJ' + str(current_round) + '.txt' # if os.path.exists(name): # print('-------REMOVED------') # os.remove(name) # # # # for r in range(current_round,C.NUM_ROUNDS+1): # # name = '/Users/jeremyperez/Downloads/OBJ' + str(r) + '.txt' # # if os.path.exists(name): # # print('-------REMOVED------') # # os.remove(name) # # # # return player.round_number == player.id_in_group # class task1(Page): # # # # @staticmethod # def vars_for_template(player: Player): # # player.participant.NEW_OBJ = [] # with open('guess_two_thirds/grid_obj.txt', encoding='utf-8') as file: # for line in file: # str_list = line.split() # int_list = list(map(int, str_list)) # player.participant.NEW_OBJ.append(int_list) # # group = player.group # # return dict(rule=C.rule, new_obj=player.participant.NEW_OBJ) # # def before_next_page(player, timeout_happened): # # # player.NEW_OBJ = player.MAT_OBJ.copy() # player.group.rule_tr = '' # # class transmission_phase1(Page): # form_model = 'group' # form_fields = ['rule_tr'] class observation_phase(Page): timeout_seconds = 300 # @staticmethod # def is_displayed(player: Player): # return player.round_number == player.id_in_group @staticmethod def vars_for_template(player: Player): # player.participant.NEW_OBJ = [] # try: # name = 'OBJ' + str(player.group.round_number - 1) + '.txt' # # with open('/Users/jeremyperez/Downloads/' + name, encoding='utf-8') as file: # for line in file: # str_list = line.split() # int_list = list(map(int, str_list)) # player.participant.NEW_OBJ.append(int_list) # except: treatment = player.session.config['treatment'] if player.id_in_group == 1: if treatment != 2: player.objective_grid = "" #print('EXCPET') with open('OnlineExpMemory/grid_obj.txt', encoding='utf-8') as file: for line in file: str_list = line.split() int_list = list(map(int, str_list)) print(line) player.objective_grid += str(line[:-1]) + ' ' print(player.objective_grid) else: player.objective_grid = None if treatment != 1: player.objective_rule = C.rule else: player.objective_rule = None else: prev_player = player.group.get_player_by_id(player.id_in_group - 1) if treatment != 2: player.objective_grid = prev_player.final_grid else: player.objective_grid = None if treatment != 1: player.objective_rule = prev_player.transmitted_rule else: player.objective_rule = None return dict(rule=player.field_maybe_none('objective_rule'), new_obj=player.field_maybe_none('objective_grid'), treatment = player.session.config['treatment']) # # prev_player = player.group.get_player_by_id(player.id_in_group - 1) # # if player.session.config['treatment'] != 1: # return dict(rule=prev_player.participant.RULE, new_obj=prev_player.participant.NEW_OBJ, treatment = player.session.config['treatment']) # return dict(new_obj=prev_player.participant.NEW_OBJ, treatment = player.session.config['treatment']) class task1(Page): # timeout_seconds = 300 @staticmethod def live_method(player, data): if data[0] == 'move': player.moves += ' '.join(map(str, data[1])) + ',' print('here') elif data[0] == 'grid': player.final_grid = '' for line in data[1]: player.final_grid += ' '.join(map(str, line)) + ' ' @staticmethod def vars_for_template(player: Player): # player.participant.NEW_OBJ = [] # try: # name = 'OBJ' + str(player.group.round_number - 1) + '.txt' # # with open('/Users/jeremyperez/Downloads/' + name, encoding='utf-8') as file: # for line in file: # str_list = line.split() # int_list = list(map(int, str_list)) # player.participant.NEW_OBJ.append(int_list) # except: # if player.group.round_number == 1: # player.participant.NEW_OBJ = [] # print('EXCPET') # # # with open('guess_two_thirds/grid_obj.txt', encoding='utf-8') as file: # for line in file: # str_list = line.split() # int_list = list(map(int, str_list)) # player.participant.NEW_OBJ.append(int_list) # # # return dict(rule=C.rule, new_obj=player.participant.NEW_OBJ, treatment = player.session.config['treatment']) return dict(rule=player.field_maybe_none('objective_rule'), new_obj=player.field_maybe_none('objective_grid'), treatment = player.session.config['treatment']) # # prev_player = player.group.get_player_by_id(player.id_in_group - 1) # # if player.session.config['treatment'] != 1: # return dict(rule=prev_player.participant.RULE, new_obj=prev_player.participant.NEW_OBJ, treatment = player.session.config['treatment']) # return dict(new_obj=prev_player.participant.NEW_OBJ, treatment = player.session.config['treatment']) # def before_next_page(player, timeout_happened): # # # player.NEW_OBJ = player.MAT_OBJ.copy() # sleep(0.1) # if player.session.config['treatment'] != 2: # # player.participant.NEW_OBJ = [] # name = 'OBJ' + str(player.group.round_number) + '.txt' # # with open('/Users/jeremyperez/Downloads/' + name, encoding='utf-8') as file: # for txt in file: # lines = txt.split('],[') # for line in lines: # if line[0] == '[': # line = line[2:] # elif line[-1] == ']': # line = line[:-2] # # str_list = line.split(',') # int_list = list(map(int, str_list)) # player.participant.NEW_OBJ.append(int_list) # print('new_obj') # print(player.participant.NEW_OBJ) # # @staticmethod # def is_displayed(player: Player): # return player.round_number == player.id_in_group # class transmission_phase1(Page): form_model = 'player' form_fields = ['transmitted_rule'] def is_displayed(player : Player): return player.session.config['treatment'] != 1 # # @staticmethod # def is_displayed(player: Player): # print('rule:') # print(player.group.field_maybe_none('rule_tr')) # if player.group.field_maybe_none('rule_tr') != None: # player.participant.RULE = player.group.field_maybe_none('rule_tr') # # # return player.round_number == player.id_in_group and player.session.config['treatment'] != 1 # # class WaitPage1(WaitPage): # pass # # @staticmethod # # def is_displayed(player: Player): # # return player.round_number == player.id_in_group # # class task2(Page): # # # # def vars_for_template(player: Player): # # others = player.get_others_in_group() # # for p in others: # # if p.id == player.id - 1: # # player.participant.NEW_OBJ = p.participant.NEW_OBJ # # return dict(rule=player.group.rule_tr, new_obj=player.participant.NEW_OBJ) # def before_next_page(player, timeout_happened): # # # player.NEW_OBJ = player.MAT_OBJ.copy() # player.group.rule_tr = '' # # @staticmethod # # def is_displayed(player: Player): # # return player.id_in_group == 2 class Results(Page): def vars_for_template(player: Player): player.has_finished = True return dict(rule_obj = player.field_maybe_none('objective_rule'), rule_tr = player.field_maybe_none('transmitted_rule'), final=player.field_maybe_none('final_grid'), obj=player.field_maybe_none('objective_grid'), treatment = player.session.config['treatment']) class transmission_phase2(Page): form_model = 'group' form_fields = ['rule_tr'] # @staticmethod # class ResultsWaitPage(WaitPage): # after_all_players_arrive = set_payoffs page_sequence = [IntroductionP, IntroductionR, IntroductionPR, observation_phase, task1, transmission_phase1, Results ] # , Results]