from otree.api import * from .Constants import * import json import random def rotate_roles(group): players = group.get_players() num_players = len(players) round_number = group.round_number leader_index = (round_number - 1) % num_players group.currentDiscussion1_channel = "Discussion1_Round"+str(round_number) group.currentDiscussion2_channel = "Discussion2_Round"+str(round_number) print(f'The channel name is: {group.currentDiscussion1_channel}') for i, player in enumerate(players): player.is_leader = (i == leader_index) #print(f'player {player.id_in_group} is leader: {player.is_leader}') def question_choices(player): selected_question = json.loads(player.group.selected_question) return [ [1, selected_question['A']], [2, selected_question['B']], [3, selected_question['C']], [4, selected_question['D']] ] def individual_answer_choices(player): return question_choices(player) def group_answer_choices(player): return question_choices(player) def difficulty_to_score(difficulty): if difficulty == C.EASY_STRING: return C.EASY_SCORE elif difficulty == C.MEDIUM_STRING: return C.MEDIUM_SCORE elif difficulty == C.HARD_STRING: return C.HARD_SCORE def get_ai_accuarcy_confidence(difficulty): if difficulty == C.EASY_STRING: return C.AI_EASY_QUESTION_PROB, C.AI_EASY_CONF_MEAN, C.AI_EASY_CONF_STD elif difficulty == C.MEDIUM_STRING: return C.AI_MEDIUM_QUESTION_PROB, C.AI_MEDIUM_CONF_MEAN, C.AI_MEDIUM_CONF_STD elif difficulty == C.HARD_STRING: return C.AI_HARD_QUESTION_PROB, C.AI_HARD_CONF_MEAN, C.AI_HARD_CONF_STD def calculate_score(group): players = group.get_players() answers = [p.get_group_answer_display() for p in players] selected_question = group.get_selected_question() round_score = 0 group.num_correct = 0 group.num_incorrect = 0 for answer in answers: if answer.lower() == selected_question['Answer'].lower(): round_score += difficulty_to_score(group.difficulty_choice) group.num_correct += 1 else: round_score -= difficulty_to_score(group.difficulty_choice) group.num_incorrect +=1 group.score += round_score group.session.vars['score'] = group.score def is_question_remaining(group, category_difficulty): questions = json.loads(group.session.vars[category_difficulty]) if len(questions) > 0: return True return False def get_question_availability(group): categories = [C.US_HISTORY_STR, C.GEOGRAPHY_STR, C.LITERATURE_STR, C.POP_CULTURE_STR, C.SCIENCE_STR] categories_initials = [C.US_HISTORY, C.GEOGRAPHY, C.LITERATURE, C.POP_CULTURE, C.SCIENCE] difficulties = [C.EASY_STRING.lower(), C.MEDIUM_STRING.lower(), C.HARD_STRING.lower()] difficulties_numbers = [str(C.EASY), str(C.MEDIUM), str(C.HARD)] questions_availability = {} for category, category_initial in zip(categories, categories_initials): for difficulty, difficulty_number in zip(difficulties, difficulties_numbers): category_difficulty = '_'.join([category, difficulty]) questions_availability[category_initial+difficulty_number] = is_question_remaining(group, category_difficulty) return questions_availability def get_random_nicknames(): selected_animals = random.sample(ANIMAL_NAMES, k=C.PLAYERS_PER_GROUP) selected_colors = random.sample(COLOR_NAMES, k=C.PLAYERS_PER_GROUP) player_names = [f'{color} {animal}' for animal, color in zip(selected_animals, selected_colors)] return player_names