from otree.api import * doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'MatchingPennie' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 20 STAKES=10 class Subsession(BaseSubsession): pass def creating_session(subsession): import random if subsession.round_number == 10: # reverse the roles matrix = subsession.get_group_matrix() for row in matrix: row.reverse() subsession.set_group_matrix(matrix) if subsession.round_number > 10: subsession.group_like_round(10) class Group(BaseGroup): def set_payoffs(self): matcher = self.get_player_by_role('A') mismatcher = self.get_player_by_role('B') if matcher.penny_side == mismatcher.penny_side: matcher.is_winner = True mismatcher.is_winner = False else: matcher.is_winner = False mismatcher.is_winner = True for player in [mismatcher, matcher]: if player.is_winner: player.payoff = C.STAKES else: player.payoff = 0 class Player(BasePlayer): penny_side = models.StringField( choices=[['表', '表'], ['裏', '裏']], widget=widgets.RadioSelect ) is_winner = models.BooleanField() def role(self): if self.id_in_group == 1: return 'A' if self.id_in_group == 2: return 'B' # PAGES class MyPage(Page): form_model = 'player' form_fields = ['penny_side'] def vars_for_template(player): return dict(player_in_previous_rounds=player.in_previous_rounds()) class ResultsWaitPage(WaitPage): def after_all_players_arrive(self): self.group.set_payoffs() class Results(Page): def is_displayed(self): return self.round_number == C.NUM_ROUNDS def vars_for_template(player): player_in_all_rounds = player.in_all_rounds() return dict( total_payoff=sum([p.payoff for p in player_in_all_rounds]), player_in_all_rounds=player_in_all_rounds, ) page_sequence = [MyPage, ResultsWaitPage, Results]