import random from otree.api import * doc = """ """ BLANK = ' ' class C(BaseConstants): NAME_IN_URL = 'Experiment' PLAYERS_PER_GROUP = None NUM_ROUNDS = 5 PERIODS = 5 class Subsession(BaseSubsession): pass class Group(BaseGroup): board_state = models.LongStringField(initial=BLANK * 25) class Player(BasePlayer): symbol = models.StringField() period = models.IntegerField(initial='1') final_period = models.BooleanField(initial=False) final_round = models.BooleanField(initial=False) prize0 = models.IntegerField(initial='0') prize1 = models.IntegerField(initial='0') prize2 = models.IntegerField(initial='0') prize3 = models.IntegerField(initial='0') prize4 = models.IntegerField(initial='0') prize5 = models.IntegerField(initial='0') prize6 = models.IntegerField(initial='0') prize7 = models.IntegerField(initial='0') prize8 = models.IntegerField(initial='0') prize9 = models.IntegerField(initial='0') prize10 = models.IntegerField(initial='0') prize11 = models.IntegerField(initial='0') prize12 = models.IntegerField(initial='0') prize13 = models.IntegerField(initial='0') prize14 = models.IntegerField(initial='0') prize15 = models.IntegerField(initial='0') prize16 = models.IntegerField(initial='0') prize17 = models.IntegerField(initial='0') prize18 = models.IntegerField(initial='0') prize19 = models.IntegerField(initial='0') prize20 = models.IntegerField(initial='0') prize21 = models.IntegerField(initial='0') prize22 = models.IntegerField(initial='0') prize23 = models.IntegerField(initial='0') prize24 = models.IntegerField(initial='0') next_round = models.IntegerField(initial='2') def creating_session(subsession: Subsession): for p in subsession.get_players(): p.symbol = {1: 'X'}[p.id_in_group] p.prize0 = random.randint(0, 100) p.prize1 = random.randint(0, 100) p.prize2 = random.randint(0, 100) p.prize3 = random.randint(0, 100) p.prize4 = random.randint(0, 100) p.prize5 = random.randint(0, 100) p.prize6 = random.randint(0, 100) p.prize7 = random.randint(0, 100) p.prize8 = random.randint(0, 100) p.prize9 = random.randint(0, 100) p.prize10 = random.randint(0, 100) p.prize11 = random.randint(0, 100) p.prize12 = random.randint(0, 100) p.prize13 = random.randint(0, 100) p.prize14 = random.randint(0, 100) p.prize15 = random.randint(0, 100) p.prize16 = random.randint(0, 100) p.prize17 = random.randint(0, 100) p.prize18 = random.randint(0, 100) p.prize19 = random.randint(0, 100) p.prize20 = random.randint(0, 100) p.prize21 = random.randint(0, 100) p.prize22 = random.randint(0, 100) p.prize23 = random.randint(0, 100) p.prize24 = random.randint(0, 100) class Play(Page): @staticmethod def js_vars(player): return dict( my_symbol=player.symbol, prize0=player.prize0, prize1=player.prize1, prize2=player.prize2, prize3=player.prize3, prize4=player.prize4, prize5=player.prize5, prize6=player.prize6, prize7=player.prize7, prize8=player.prize8, prize9=player.prize9, prize10=player.prize10, prize11=player.prize11, prize12=player.prize12, prize13=player.prize13, prize14=player.prize14, prize15=player.prize15, prize16=player.prize16, prize17=player.prize17, prize18=player.prize18, prize19=player.prize19, prize20=player.prize20, prize21=player.prize21, prize22=player.prize22, prize23=player.prize23, prize24=player.prize24, ) @staticmethod def vars_for_template(player: Player): next_round = player.round_number + 1 return dict( next_round=next_round, ) @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant if player.round_number == C.NUM_ROUNDS: random_round_1 = random.randint(1,C.NUM_ROUNDS) participant.random_round_1 = random_round_1 player_in_selected_round = player.in_round(random_round_1) participant.payoff = player_in_selected_round.payoff @staticmethod def live_method(player: Player, data: dict): group = player.group board = list(group.board_state) broadcast = {} if 'move' in data: move = data['move'] if player.final_period == True: return player.period += 1 board[move] = player.symbol group.board_state = ''.join(board) if player.period > C.PERIODS: player.final_period = True if player.round_number == C.NUM_ROUNDS: player.final_round = True if 'value' in data: value = data['value'] player.payoff += value broadcast['board_state'] = board broadcast['period'] = player.period broadcast['payoff'] = player.payoff broadcast['final_period'] = player.final_period broadcast['final_round'] = player.final_round return {0: broadcast} class Results(Page): @staticmethod def vars_for_template(player: Player): return dict(me_in_all_rounds=player.in_all_rounds()) def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS page_sequence = [Play, Results]