from otree.api import * from array import * from csv import writer, reader list_data=[] class C(BaseConstants): NAME_IN_URL = 'tower_of_london_allrounds' PLAYERS_PER_GROUP = None NUM_ROUNDS = 26 class Subsession(BaseSubsession): pass class Group(BaseGroup): name = models.StringField(label='enter your name') firstMoveTime =models.StringField(label='') boardCompletionTime =models.StringField(label='') noOfMoves =models.StringField(label='') class Player(BasePlayer): result = models.StringField(initial="incomplete") pass # FUNCTIONS # PAGES class selectBoard(Page): form_model = 'group' # form_fields = ['name'] @staticmethod def vars_for_template(player): global name group = player.group return dict( number= player.round_number ) class play(Page): form_model = 'group' form_fields = ['firstMoveTime','boardCompletionTime','noOfMoves'] @staticmethod def vars_for_template(player): group = player.group boardNumber = player.round_number if(group.field_maybe_none('name') and boardNumber ==1 and group.field_maybe_none('name') != 'uhgUGYYT87gt8yuGUyGUYG*&Y'): opened_file = open('TOLrecords.csv') read_file = reader(opened_file) apps_data = list(read_file) rowcount = len(apps_data) list_data.append(str(rowcount)) player.participant.vars["name"] =group.name if boardNumber == 1: round_message = 'Practice round' else: round_message = f'Round {boardNumber - 1}/{C.NUM_ROUNDS - 1}' return dict( board= setBoard(boardNumber), moves = setMoves(boardNumber), result =setResult(boardNumber), roundMessage = round_message ) @staticmethod def live_method(player: Player, data): print(f'data before: {data}') print(f'player.result before: {player.result}') if player.result == 'incomplete': print(f'player.result was {player.result} and changed to ', end="") if data == 'win' or data == 'loss': player.result = data print(f'{player.result}') print(f'data after: {data}') print(f'player.result after: {player.result}') class endPage(Page): form_model = 'group' @staticmethod def vars_for_template(player): group = player.group score = 0 boardNumber = player.round_number if(group.field_maybe_none('firstMoveTime') and group.field_maybe_none('firstMoveTime') != ''): list_data.append(group.firstMoveTime) if(group.field_maybe_none('boardCompletionTime') and group.field_maybe_none('boardCompletionTime') != ''): list_data.append(group.boardCompletionTime) if(group.field_maybe_none('noOfMoves') and group.field_maybe_none('noOfMoves') != ''): list_data.append(group.noOfMoves) if(boardNumber == C.NUM_ROUNDS): with open('TOLrecords.csv', 'a', newline='') as f_object: writer_object = writer(f_object) writer_object.writerow(list_data) f_object.close() num_boards_successful = 0 for i, p in enumerate(player.in_all_rounds()): print(f'i: {i}, p: {p}') if i != 0: if p.result == 'win': num_boards_successful += 1 score = (num_boards_successful / (C.NUM_ROUNDS - 1)) * 100 print(f'num_boards_successful: {num_boards_successful}') print(f'score: {score}') return dict( numRounds = C.NUM_ROUNDS, boardNumber= boardNumber, score = score, ) class board1(Page): form_model = 'group' @staticmethod def vars_for_template(player): group = player.group boardNumber = player.round_number return dict( boardNumber= boardNumber, ) page_sequence = [selectBoard, board1, play, endPage] def setBoard(boardNumber): boards = [ [[0, 0, 0], [0, 0, 0], [3, 2, 1]], [[0, 0, 0], [0, 3, 0], [0, 2, 1]], [[0, 0, 0], [0, 2, 0], [3, 1, 0]], [[0, 0, 0], [3, 0, 0], [2, 0, 1]], [[0, 0, 0], [0, 1, 0], [2, 3, 0]], [[0, 0, 0], [3, 0, 0], [1, 0, 2]], [[0, 0, 0], [0, 0, 0], [3, 1, 2]], [[0, 0, 0], [0, 1, 0], [0, 2, 3]], [[0, 0, 0], [0, 0, 0], [1, 3, 2]], [[0, 0, 0], [0, 2, 0], [0, 3, 1]], [[0, 0, 0], [1, 0, 0], [2, 3, 0]], [[0, 0, 0], [2, 0, 0], [3, 1, 0]], [[0, 0, 0], [2, 0, 0], [1, 3, 0]], [[0, 0, 0], [0, 0, 0], [3, 1, 2]], [[0, 0, 0], [3, 0, 0], [2, 0, 1]], [[0, 0, 0], [0, 2, 0], [3, 1, 0]], [[0, 0, 0], [2, 0, 0], [3, 0, 1]], [[0, 0, 0], [0, 0, 0], [3, 1, 2]], [[0, 0, 0], [2, 0, 0], [1, 0, 3]], [[0, 0, 0], [0, 1, 0], [2, 3, 0]], [[0, 0, 0], [3, 0, 0], [2, 0, 1]], [[0, 0, 0], [0, 2, 0], [0, 1, 3]], [[0, 0, 0], [2, 0, 0], [1, 3, 0]], [[0, 0, 0], [3, 0, 0], [2, 1, 0]], [[0, 0, 0], [3, 0, 0], [1, 2, 0]], [[0, 0, 0], [2, 0, 0], [1, 0, 3]], ] if(boardNumber<=C.NUM_ROUNDS): return boards[boardNumber-1] return boards[boardNumber-1] def setMoves(boardNumber): moves =[2,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6] if(boardNumber<=C.NUM_ROUNDS): return moves[boardNumber-1] return moves[boardNumber-1] def setResult(boardNumber): results=[ [[1, 0, 0], [2, 0, 0], [3, 0, 0]], [[2, 0, 0], [3, 0, 0], [1, 0, 0]], [[3, 0, 0], [1, 0, 0], [2, 0, 0]], [[0, 0, 0], [2, 0, 0], [1, 3, 0]], [[0, 0, 0], [3, 0, 0], [1, 2, 0]], [[0, 0, 0], [0, 0, 0], [3, 2, 1]], [[1, 0, 0], [3, 0, 0], [2, 0, 0]], [[0, 0, 0], [0, 2, 0], [1, 3, 0]], [[0, 0, 0], [1, 0, 0], [2, 0, 3]], [[0, 0, 0], [0, 0, 0], [1, 2, 3]], [[2, 0, 0], [3, 0, 0], [1, 0, 0]], [[0, 0, 0], [3, 0, 0], [1, 2, 0]], [[0, 0, 0], [3, 0, 0], [2, 1, 0]], [[0, 0, 0], [0, 0, 0], [1, 2, 3]], [[3, 0, 0], [2, 0, 0], [1, 0, 0]], [[0, 0, 0], [0, 1, 0], [2, 3, 0]], [[0, 0, 0], [3, 0, 0], [1, 0, 2]], [[0, 0, 0], [0, 0, 0], [2, 3, 1]], [[1, 0, 0], [3, 0, 0], [2, 0, 0]], [[0, 0, 0], [2, 0, 0], [3, 1, 0]], [[0, 0, 0], [1, 0, 0], [3, 2, 0]], [[0, 0, 0], [0, 0, 0], [1, 3, 2]], [[2, 0, 0], [1, 0, 0], [3, 0, 0]], [[0, 0, 0], [0, 1, 0], [3, 2, 0]], [[0, 0, 0], [1, 0, 0], [2, 0, 3]], [[0, 0, 0], [0, 0, 0], [3, 1, 2]] ] if(boardNumber<=C.NUM_ROUNDS): return results[boardNumber-1] return results[boardNumber-1]