from csv import reader, writer from otree.api import (BaseConstants, BaseGroup, BasePlayer, BaseSubsession, Page, models) from .board_weights_calculated_scores import get_board_weights_longest_path_myopic_path BOARD_OPTIONS = { 'board_1': {'weight_id': 3, 'num_layers': 2}, 'board_2': {'weight_id': 23, 'num_layers': 3}, 'board_3': {'weight_id': 28, 'num_layers': 3}, 'board_4': {'weight_id': 38, 'num_layers': 3}, 'board_5': {'weight_id': 95, 'num_layers': 3}, 'board_6': {'weight_id': 79, 'num_layers': 3}, 'board_7': {'weight_id': 1, 'num_layers': 3}, 'board_8': {'weight_id': 59, 'num_layers': 4}, 'board_9': {'weight_id': 57, 'num_layers': 4}, 'board_10': {'weight_id': 76, 'num_layers': 4}, 'board_11': {'weight_id': 122553, 'num_layers': 4}, 'board_12': {'weight_id': 156, 'num_layers': 4}, 'board_13': {'weight_id': 164, 'num_layers': 4}, 'board_14': {'weight_id': 1031, 'num_layers': 5}, 'board_15': {'weight_id': 1033, 'num_layers': 5}, 'board_16': {'weight_id': 1034, 'num_layers': 5}, 'board_17': {'weight_id': 4, 'num_layers': 5}, 'board_18': {'weight_id': 24, 'num_layers': 5}, 'board_19': {'weight_id': 1019, 'num_layers': 5}, 'board_20': {'weight_id': 52, 'num_layers': 6}, 'board_21': {'weight_id': 57, 'num_layers': 6}, 'board_22': {'weight_id': 58, 'num_layers': 6}, 'board_23': {'weight_id': 71, 'num_layers': 6}, 'board_24': {'weight_id': 95, 'num_layers': 6}, 'board_25': {'weight_id': 1, 'num_layers': 6}, 'board_26': {'weight_id': 26, 'num_layers': 7}, 'board_27': {'weight_id': 22, 'num_layers': 7}, 'board_28': {'weight_id': 27, 'num_layers': 7}, 'board_29': {'weight_id': 991, 'num_layers': 7}, 'board_30': {'weight_id': 862, 'num_layers': 7}, 'board_31': {'weight_id': 1, 'num_layers': 7}, } list_data = [] class C(BaseConstants): NAME_IN_URL = 'elithorns_maze_S3' PLAYERS_PER_GROUP = None NUM_ROUNDS = len(BOARD_OPTIONS) class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): name = models.StringField(label='enter your name') noOfCities = models.StringField(label='') timeTaken = models.StringField(label='') score = models.StringField(label='') longestScore = models.StringField(label='') myopicScore = models.StringField(label='') path = models.StringField(label='') weightsId = models.StringField(label='') numLayers = models.StringField(label='') totalScore = models.IntegerField() totalScorePercent = models.FloatField() # FUNCTIONS # PAGES class play(Page): form_model = 'player' form_fields = ['timeTaken', 'score', 'longestScore', 'myopicScore', 'path', 'weightsId', 'numLayers'] @staticmethod def vars_for_template(player): if not list_data or list_data == []: if player.participant.vars and player.participant.vars['name']: list_data.append(player.participant.vars["name"]) else: opened_file = open('elithorns_maze.csv') read_file = reader(opened_file) apps_data = list(read_file) rowcount = len(apps_data) list_data.append(str(rowcount)) boardNumber = player.round_number board_params = BOARD_OPTIONS[f'board_{boardNumber}'] weight_choice = board_params['weight_id'] num_layers = board_params['num_layers'] board, line_weights, optimal_score, myopic_score = get_board_weights_longest_path_myopic_path( weight_choice=weight_choice, num_layers=num_layers ) if boardNumber == 1: round_message = 'Practice round' else: round_message = f'Round {boardNumber - 1}/{C.NUM_ROUNDS - 1}' return dict( boardPlacements=board, lineWeights=line_weights, longestScore=optimal_score, myopicScore=myopic_score, weightsId=weight_choice, numLayers=num_layers, roundMessage = round_message ) class endPage(Page): form_model = 'player' @staticmethod def vars_for_template(player): boardNumber = player.round_number list_data = [ player.participant.id, player.field_maybe_none('timeTaken'), player.field_maybe_none('score'), player.field_maybe_none('longestScore'), player.field_maybe_none('myopicScore'), player.field_maybe_none('path'), player.field_maybe_none('weightsId'), player.field_maybe_none('numLayers') ] totalScore = 0 for i, p in enumerate(player.in_all_rounds()): if i != 0: score = p.field_maybe_none('score') longestScore = p.field_maybe_none('longestScore') # print(f'score: {score}, longestScore: {longestScore}') if (score == longestScore): totalScore += 1 # print(f'total score: {totalScore}') totalScorePercentage = (totalScore / (C.NUM_ROUNDS - 1)) * 100 player.totalScorePercent= totalScorePercentage player.totalScore= totalScore # with open('elithorns_maze.csv', 'a') as f: # writer_object = writer(f) # writer_object.writerow(list_data) # f.close() return {'boardNumber': boardNumber, 'list': list_data, 'numRounds': len(BOARD_OPTIONS), 'totalScorePercentage': totalScorePercentage} class welcome(Page): form_model = 'player' @staticmethod def vars_for_template(player): boardNumber = player.round_number return {'boardNumber': boardNumber} class board1(Page): form_model = 'player' @staticmethod def vars_for_template(player): boardNumber = player.round_number return dict( boardNumber = boardNumber, ) page_sequence = [welcome, board1, play, endPage]