from otree.api import * import csv doc = """ Your app description """ def read_csv(): import csv f = open(__name__ + '/decode.csv', encoding='utf-8-sig') rows = list(csv.DictReader(f)) return rows class Constants(BaseConstants): name_in_url = 'HMM' players_per_group = 3 num_rounds = 2 questions = read_csv() class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): num_correct = models.IntegerField(initial=0) num_incorrect = models.IntegerField(initial=0) attempted = models.IntegerField(initial=0) letter = models.StringField() grid = models.StringField() answer = models.StringField() finished = models.BooleanField(initial=False) target = models.StringField() # FUNCTIONS def creating_session(subsession: Subsession): current_question = Constants.questions[0] for p in subsession.get_players(): p.participant.vars['total_attempted'] = 0 p.letter = current_question['letter'] p.grid = current_question['grid'] p.answer = current_question['answer'] import random target = random.randrange(0, 100) p.target = str(target) print("grid", p.grid) # PAGES class Page1(Page): def is_displayed(player): return player.round_number == 1 class Page2(Page): def is_displayed(player): return player.round_number == 1 class Page3(Page): def is_displayed(player): return player.round_number == 1 class Page4(Page): def is_displayed(player): return player.round_number == 1 class Slider(Page): timeout_seconds = 10 def is_displayed(player): return player.round_number == 1 def live_method(player, data): print(data, player.target) if data == player.target: player.num_correct += 1 else: player.num_incorrect += 1 player.attempted = player.num_correct + player.num_incorrect import random target = random.randrange(0,100) player.target = str(target) print('number_correct:', player.num_correct) print('number_incorrect:', player.num_incorrect) print('number_attempted:', player.attempted) msg = { 'correct': player.num_correct, 'target': player.target, } return {player.id_in_group: msg} class Decode(Page): timeout_seconds = 180 def is_displayed(player): return player.round_number == 2 def live_method(player, data): print(player.letter, player.grid, player.answer) player.participant.vars['total_attempted'] += 1 print("participant total attempted", player.participant.vars['total_attempted']) if data == player.answer: player.num_correct += 1 else: player.num_incorrect += 1 #record the response; convert to/from string/list # lst = json.loads(player.responses) print("response", data) # lst.append(data) # player.responses = json.dumps(lst) print("correct answer", player.answer) print("number correct", player.num_correct) print("number incorrect", player.num_incorrect) print("grid", player.grid) # Check to see if any questions left num_completed = player.num_correct + player.num_incorrect if num_completed < len(Constants.questions): q = player.participant.vars['total_attempted'] player.letter = Constants.questions[q]['letter'] player.grid = Constants.questions[q]['grid'] player.answer = Constants.questions[q]['answer'] else: player.finished = True msg = { 'letter': player.letter, 'grid': player.grid, 'answer': player.answer, 'finished': player.finished, 'num_correct': player.num_correct, 'num_incorrect': player.num_incorrect, } return {player.id_in_group: msg} class ResultsWaitPage(WaitPage): pass class Results(Page): pass page_sequence = [Decode]