from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from .models import Constants class MyWaitPage(WaitPage): def after_all_players_arrive(self): self.subsession.correct_guess = sum([player.answer for player in self.subsession.get_players()]) for player in self.subsession.get_players(): if player.guess == self.subsession.correct_guess: player.score = player.score + self.session.config['points_exact_guess'] elif abs(player.guess - self.subsession.correct_guess) <= self.session.config['close_guess_distance']: player.score = player.score + self.session.config['points_close_guess'] class Rules(Page): def is_displayed(self): return self.round_number == 1 def vars_for_template(self): return { 'points_exact_guess': self.session.config['points_exact_guess'], 'points_close_guess': self.session.config['points_close_guess'], 'close_guess_distance': self.session.config['close_guess_distance'] } class GamePage(Page): form_model = 'player' form_fields = ['answer', 'guess'] def guess_max(self): return self.session.num_participants class Results(Page): def vars_for_template(self): guesses_categories = [x for x in range(self.session.num_participants+1)] guesses_data = [0 for x in range(self.session.num_participants+1)] players = self.subsession.get_players() for x in range(self.session.num_participants+1): for player in players: if player.guess == x: guesses_data[x] = guesses_data[x] + 1 score_list = [] for player in players: tmp = [player.participant.vars['name'],sum([p.score for p in player.in_all_rounds()])] score_list.append(tmp) score_list = sorted(score_list, key=lambda score: score[1], reverse=True) return { # This is for the guess distribution plot 'guesses_categories': guesses_categories, 'guesses_data': guesses_data, # This is to show highlight your own guess in the distribution 'own_answer': self.player.answer, 'own_guess': self.player.guess, # This is to show the total score 'sorted_by_score': [item for sublist in score_list for item in sublist], 'sorted_names': [entry[0] for entry in score_list], 'sorted_points': [entry[1] for entry in score_list] } class FinalResults(Page): def is_displayed(self): return self.session.vars['FinishGame'] == True or self.round_number == 100 page_sequence = [ Rules, GamePage,MyWaitPage,Results, FinalResults ]