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 = 3 ENDOWMENT = cu(1) SEQ_STORED = 0 # for each group which participant store the actor information N_MINI_BLOCK = 1 # in each mini block the tree players take turns to be the Actor. class Subsession(BaseSubsession): pass class Group(BaseGroup): actor = models.IntegerField(initial = 0) num_finished = models.IntegerField(initial = 0) trial_no = models.IntegerField(initial = 1) rewarded_no = models.IntegerField(initial = 0) class Player(BasePlayer): pass 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)) print(actor_seq) player_list[C.SEQ_STORED].participant.actor_seq = actor_seq # PAGES class WaitingRoom(WaitPage): group_by_arrival_time = True def is_displayed(player): return player.round_number == 1 class Trial(ExtraModel): group = models.Link(Group) 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.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) 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.group.trial_no += 1 return {0: dict(msg_type = 'control',msg = 'all_players_finished')} if data['type'] == 'data': response = dict(msg_type = 'data', stage = 'send', chosen_player = data['choice'], food_angle_list = data['food_angle_list']) player.group.rewarded_no = data['choice'] Trial.create(group = player.group) 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 page_sequence = [ WaitingRoom, SendTask ]