from otree.api import * from numpy import random doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'three_agent' PLAYERS_PER_GROUP = 3 NUM_ROUNDS = 6 ENDOWMENT = cu(1) SEQ_STORED = 0 N_MINI_BLOCK = 1 class Subsession(BaseSubsession): pass class Group(BaseGroup): actor = models.IntegerField(initial = 0) num_finished = models.IntegerField(initial = 0) position = models.IntegerField(initial = 0) class Player(BasePlayer): reward_player = models.IntegerField( label="Whom do you want to send to?", initial = 0) def creating_session(subsession: Subsession): if subsession.round_number == 1: group_list = subsession.get_groups() for group in group_list: player_list = group.get_players() actor_seq = [] template_seq = [1,2,3] for i in range(C.N_MINI_BLOCK): actor_seq.extend(random.permutation(template_seq)) position_seq = random.randint(low = 1,high = 3, size = len(actor_seq)).tolist() print(actor_seq) player_list[C.SEQ_STORED].participant.position_seq = position_seq player_list[C.SEQ_STORED].participant.actor_seq = actor_seq # PAGES class InstructionsText(Page): pass class InstructionsGraphics(Page): pass class SendTask(Page): def live_method(player: Player,data): # This function is called when the javascripts use 'liveSend' method to send data # to the server. We need to unpack the message and then send information back to # players. if data['type'] == 'control': # control type message indicate was used for controlling task procedure. if data['msg'] == 'page_loaded': if player.group.actor == 0: player_list = player.group.get_players() player.group.position = int(player_list[C.SEQ_STORED].participant.position_seq.pop()); player.group.actor = int(player_list[C.SEQ_STORED].participant.actor_seq.pop()) print('The actor is',player.group.actor,'Player ',player.id_in_group,':','Ready!') response = dict(msg_type = 'control',msg = 'initialization', player_id = player.id_in_group, next_actor = player.group.actor, next_position = player.group.position) return {player.id_in_group: response} if data['msg'] == 'trial_finished': player.group.num_finished += 1 print('num_finished',player.group.num_finished) if player.group.num_finished == C.PLAYERS_PER_GROUP: # check if all players completed the trial player.group.num_finished = 0 player_list = player.group.get_players() actor_seq = player_list[C.SEQ_STORED].participant.actor_seq position_seq = player_list[C.SEQ_STORED].participant.position_seq if actor_seq: player.group.actor = int(actor_seq.pop()) player.group.position = int(position_seq.pop()) return {0: dict(msg_type = 'control',msg = 'all_players_finished', next_actor = player.group.actor, next_position = player.group.position)} else: return {0: dict(msg_type = 'control', msg = 'task_ended')} if data['type'] == 'data': response = dict(msg_type = 'data', stage = 'send', chosen_player = data['choice'], food_angle_list = data['food_angle_list']) return {0: response} if data['type'] == 'graphic': if data['shape'] == 'angle': angle = data['angle'] response = dict(msg_type = 'graphic', stage = 'send', angle = angle) player_list = player.get_others_in_group() msg = {} for player in player_list: msg[player.id_in_group] = response return msg def set_payoffs(group): player_list = group.get_players() reward_player = 0 # get the reward player number for p in player_list: p.payoff = 0; if p.reward_player != 0: reward_player = p.reward_player # sync the reward_player information to all players for p in player_list: p.reward_player = reward_player player_list[reward_player-1].payoff = 1 class Results(Page): pass class ShufflePage(WaitPage): @staticmethod def after_all_players_arrive(group:Group): players = group.get_players() role_list = ['Actor','Receiver','Receiver'] random.shuffle(role_list) for p,r in zip(players,role_list): p.participant.role = r page_sequence = [ InstructionsText, InstructionsGraphics, SendTask, Results, ShufflePage, ]