from otree.api import * from array import * from csv import writer, reader list_data=[] class C(BaseConstants): NAME_IN_URL = 'tower_of_london' PLAYERS_PER_GROUP = None NUM_ROUNDS = 18 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): name = models.StringField(label='enter your name') firstMoveTime = models.StringField(label='') boardCompletionTime = models.StringField(label='') noOfMoves = models.StringField(label='') result = models.StringField(initial="incomplete") totalScore = models.IntegerField() totalScorePercent = models.FloatField() # FUNCTIONS # PAGES class selectBoard(Page): form_model = 'player' # form_fields = ['name'] @staticmethod def vars_for_template(player): global name return dict( number= player.round_number ) class play(Page): form_model = 'player' form_fields = ['firstMoveTime','boardCompletionTime','noOfMoves'] @staticmethod def vars_for_template(player): boardNumber = player.round_number if(player.field_maybe_none('name') and boardNumber ==1 and player.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"] = player.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 = 'player' @staticmethod def vars_for_template(player): score = 0 boardNumber = player.round_number if(player.field_maybe_none('firstMoveTime') and player.field_maybe_none('firstMoveTime') != ''): list_data.append(player.firstMoveTime) if(player.field_maybe_none('boardCompletionTime') and player.field_maybe_none('boardCompletionTime') != ''): list_data.append(player.boardCompletionTime) if(player.field_maybe_none('noOfMoves') and player.field_maybe_none('noOfMoves') != ''): list_data.append(player.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 totalScorePercentage = (num_boards_successful / (C.NUM_ROUNDS - 1)) * 100 player.totalScorePercent= totalScorePercentage player.totalScore= num_boards_successful # 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 = 'player' @staticmethod def vars_for_template(player): 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]], #Practice [65-51] 2 moves [[0, 0, 0], [0, 3, 0], [0, 2, 1]], #Understanding [66-11] 3 moves # [[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]], #[33-11] 5 moves [[0, 0, 0], [2, 0, 0], [3, 1, 0]], #[53-13] 5 moves [[0, 0, 0], [2, 0, 0], [1, 3, 0]], #[23-43] 5 moves [[0, 0, 0], [0, 0, 0], [3, 1, 2]], #[55-15] 5 moves [[0, 0, 0], [3, 0, 0], [2, 0, 1]], #[42-21] 5 moves [[0, 0, 0], [0, 2, 0], [3, 1, 0]], #[54-34] 5 moves [[0, 0, 0], [2, 0, 0], [3, 0, 1]], #[52-12] 5 moves [[0, 0, 0], [0, 0, 0], [3, 1, 2]], #[55-35] 5 moves [[0, 0, 0], [2, 0, 0], [1, 0, 3]], #[22-41] 6 moves [[0, 0, 0], [0, 1, 0], [2, 3, 0]], #[34-53] 6 moves [[0, 0, 0], [3, 0, 0], [2, 0, 1]], #[42-63] 6 moves [[0, 0, 0], [0, 2, 0], [0, 1, 3]], #[46-25] 6 moves [[0, 0, 0], [2, 0, 0], [1, 3, 0]], #[23-31] 6 moves [[0, 0, 0], [3, 0, 0], [2, 1, 0]], #[43-64] 6 moves [[0, 0, 0], [3, 0, 0], [1, 2, 0]], #[13-32] 6 moves [[0, 0, 0], [2, 0, 0], [1, 0, 3]], #[22-55] 6 moves ] if(boardNumber<=C.NUM_ROUNDS): return boards[boardNumber-1] return boards[boardNumber-1] def setMoves(boardNumber): moves =[2,3,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]], #Practice [65-51] 2 moves [[2, 0, 0], [3, 0, 0], [1, 0, 0]], #Understanding [66-11] 3 moves # [[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]], #[33-11] 5 moves [[0, 0, 0], [3, 0, 0], [1, 2, 0]], #[53-13] 5 moves [[0, 0, 0], [3, 0, 0], [2, 1, 0]], #[23-43] 5 moves [[0, 0, 0], [0, 0, 0], [1, 2, 3]], #[55-15] 5 moves [[3, 0, 0], [2, 0, 0], [1, 0, 0]], #[42-21] 5 moves [[0, 0, 0], [0, 1, 0], [2, 3, 0]], #[54-34] 5 moves [[0, 0, 0], [3, 0, 0], [1, 0, 2]], #[52-12] 5 moves [[0, 0, 0], [0, 0, 0], [2, 3, 1]], #[55-35] 5 moves [[1, 0, 0], [3, 0, 0], [2, 0, 0]], #[22-41] 6 moves [[0, 0, 0], [2, 0, 0], [3, 1, 0]], #[34-53] 6 moves [[0, 0, 0], [1, 0, 0], [3, 2, 0]], #[42-63] 6 moves [[0, 0, 0], [0, 0, 0], [1, 3, 2]], #[46-25] 6 moves [[2, 0, 0], [1, 0, 0], [3, 0, 0]], #[23-31] 6 moves [[0, 0, 0], [0, 1, 0], [3, 2, 0]], #[43-64] 6 moves [[0, 0, 0], [1, 0, 0], [2, 0, 3]], #[13-32] 6 moves [[0, 0, 0], [0, 0, 0], [3, 1, 2]] #[22-55] 6 moves ] if(boardNumber<=C.NUM_ROUNDS): return results[boardNumber-1] return results[boardNumber-1]