from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from .models import Constants import random class FirstWaitPage(WaitPage): wait_for_all_groups = True template_name = 'Coordination_Structure_6/MyWaitPage.html' after_all_players_arrive = 'carry_over_message' def is_displayed(self): return self.round_number == 1 body_text = "請等待其他受試者完成第一部分的實驗。" class StrategyMethodInitial(Page): def is_displayed(self): return self.round_number == 1 form_model = 'player' form_fields = ['Message1', 'Message2', 'Message3', 'Message4', 'Message5', 'Message6'] def js_vars(self): return dict( Message1=self.player.Message1, Message2=self.player.Message2, Message3=self.player.Message3, Message4=self.player.Message4, Message5=self.player.Message5, Message6=self.player.Message6, ) def before_next_page(self): if self.player.State_ball == 1: self.player.Message = self.player.Message1 elif self.player.State_ball == 2: self.player.Message = self.player.Message2 elif self.player.State_ball == 3: self.player.Message = self.player.Message3 elif self.player.State_ball == 4: self.player.Message = self.player.Message4 elif self.player.State_ball == 5: self.player.Message = self.player.Message5 else: self.player.Message = self.player.Message6 class StrategyMethod(Page): def is_displayed(self): return self.round_number != 1 form_model = 'player' form_fields = ['Message1', 'Message2', 'Message3', 'Message4', 'Message5', 'Message6'] def js_vars(self): return dict( Message1=self.player.Message1, Message2=self.player.Message2, Message3=self.player.Message3, Message4=self.player.Message4, Message5=self.player.Message5, Message6=self.player.Message6, ) def before_next_page(self): if self.player.State_ball == 1: self.player.Message = self.player.Message1 elif self.player.State_ball == 2: self.player.Message = self.player.Message2 elif self.player.State_ball == 3: self.player.Message = self.player.Message3 elif self.player.State_ball == 4: self.player.Message = self.player.Message4 elif self.player.State_ball == 5: self.player.Message = self.player.Message5 else: self.player.Message = self.player.Message6 class SendMessage(Page): form_model = 'player' form_fields = ['Message'] def vars_for_template(self): return dict( image_path_ball='Coordination_Structure_6/Pic/Symbol_{}.jpg'.format(self.player.State_ball) ) def js_vars(self): return dict( Message=self.player.Message, ) class MessagesWaitPage(WaitPage): body_text = "請等待其他組員發送訊息。" template_name = 'Coordination_Structure_6/MyWaitPage.html' class ReceiveMessage(Page): # timeout_seconds = 30 form_model = 'player' form_fields = ['Action_ball_1', 'Action_ball_2'] class ResultsWaitPage(WaitPage): template_name = 'Coordination_Structure_6/ResultsWaitPage.html' after_all_players_arrive = 'set_payoffs' body_text = "請等待其他組員做出猜測,與此同時,你可以先查看你猜測的結果。" def vars_for_template(self): if self.player.id_in_group == 1: p1 = 2 p2 = 3 elif self.player.id_in_group == 2: p1 = 1 p2 = 3 else: p1 = 1 p2 = 2 return dict( image_path_text_M_A1='Coordination_Structure_6/Pic/Symbol_{}.jpg'.format(self.player.Action_ball_1), image_path_text_M_A2='Coordination_Structure_6/Pic/Symbol_{}.jpg'.format(self.player.Action_ball_2), image_path_ball_S1='Coordination_Structure_6/Pic/Symbol_{}.jpg'.format( self.group.get_player_by_id(p1).State_ball), image_path_ball_S2='Coordination_Structure_6/Pic/Symbol_{}.jpg'.format( self.group.get_player_by_id(p2).State_ball), ) class Results(Page): def vars_for_template(self): match_payoff = self.player.Match * 4 if self.player.id_in_group == 1: p1 = 2 p2 = 3 elif self.player.id_in_group == 2: p1 = 1 p2 = 3 else: p1 = 1 p2 = 2 if self.player.Action_ball_1 == self.group.get_player_by_id(p1).State_ball: first_action_match = 2 else: first_action_match = 0 if self.player.Action_ball_2 == self.group.get_player_by_id(p2).State_ball: second_action_match = 2 else: second_action_match = 0 if self.player.id_in_group == 3: if self.group.get_player_by_id(p1).Action_ball_2 == self.player.State_ball: first_state_match = 2 else: first_state_match = 0 else: if self.group.get_player_by_id(p1).Action_ball_1 == self.player.State_ball: first_state_match = 2 else: first_state_match = 0 if self.player.id_in_group == 1: if self.group.get_player_by_id(p2).Action_ball_1 == self.player.State_ball: second_state_match = 2 else: second_state_match = 0 else: if self.group.get_player_by_id(p2).Action_ball_2 == self.player.State_ball: second_state_match = 2 else: second_state_match = 0 return dict( image_path_ball_M_S='Coordination_Structure_6/Pic/Symbol_{}.jpg'.format(self.player.State_ball), image_path_text_M_A1='Coordination_Structure_6/Pic/Symbol_{}.jpg'.format(self.player.Action_ball_1), image_path_text_M_A2='Coordination_Structure_6/Pic/Symbol_{}.jpg'.format(self.player.Action_ball_2), image_path_ball_S1='Coordination_Structure_6/Pic/Symbol_{}.jpg'.format( self.group.get_player_by_id(p1).State_ball), image_path_ball_S2='Coordination_Structure_6/Pic/Symbol_{}.jpg'.format( self.group.get_player_by_id(p2).State_ball), image_path_ball_A1='Coordination_Structure_6/Pic/Symbol_{}.jpg'.format( self.group.get_player_by_id(p1).Action_ball_2 if self.player.id_in_group == 3 else self.group.get_player_by_id(p1).Action_ball_1), image_path_ball_A2='Coordination_Structure_6/Pic/Symbol_{}.jpg'.format( self.group.get_player_by_id(p2).Action_ball_1 if self.player.id_in_group == 1 else self.group.get_player_by_id(p2).Action_ball_2), first_action_match=first_action_match, second_action_match=second_action_match, first_state_match=first_state_match, second_state_match=second_state_match, match_payoff=match_payoff ) def before_next_page(self): if self.round_number == 3: # carry over messages self.participant.vars['Message1'] = self.player.Message1 self.participant.vars['Message2'] = self.player.Message2 self.participant.vars['Message3'] = self.player.Message3 self.participant.vars['Message4'] = self.player.Message4 self.participant.vars['Message5'] = self.player.Message5 self.participant.vars['Message6'] = self.player.Message6 # decide change group import Levenshtein import random if self.group.id_in_subsession == 1: distance1 = [0, 0, 0] for i, j in [(2, 3), (1, 3), (1, 2)]: distance1[5 - i - j] += Levenshtein.distance(self.group.get_player_by_id(i).Message1_trans, self.group.get_player_by_id(j).Message1_trans) distance1[5 - i - j] += Levenshtein.distance(self.group.get_player_by_id(i).Message2_trans, self.group.get_player_by_id(j).Message2_trans) distance1[5 - i - j] += Levenshtein.distance(self.group.get_player_by_id(i).Message3_trans, self.group.get_player_by_id(j).Message3_trans) distance1[5 - i - j] += Levenshtein.distance(self.group.get_player_by_id(i).Message4_trans, self.group.get_player_by_id(j).Message4_trans) distance1[5 - i - j] += Levenshtein.distance(self.group.get_player_by_id(i).Message5_trans, self.group.get_player_by_id(j).Message5_trans) distance1[5 - i - j] += Levenshtein.distance(self.group.get_player_by_id(i).Message6_trans, self.group.get_player_by_id(j).Message6_trans) change_group1 = random.choice([i + 1 for i, x in enumerate(distance1) if x == min(distance1)]) self.session.vars['change_group1'] = change_group1 else: distance2 = [0, 0, 0] for i, j in [(2, 3), (1, 3), (1, 2)]: distance2[5 - i - j] += Levenshtein.distance(self.group.get_player_by_id(i).Message1_trans, self.group.get_player_by_id(j).Message1_trans) distance2[5 - i - j] += Levenshtein.distance(self.group.get_player_by_id(i).Message2_trans, self.group.get_player_by_id(j).Message2_trans) distance2[5 - i - j] += Levenshtein.distance(self.group.get_player_by_id(i).Message3_trans, self.group.get_player_by_id(j).Message3_trans) distance2[5 - i - j] += Levenshtein.distance(self.group.get_player_by_id(i).Message4_trans, self.group.get_player_by_id(j).Message4_trans) distance2[5 - i - j] += Levenshtein.distance(self.group.get_player_by_id(i).Message5_trans, self.group.get_player_by_id(j).Message5_trans) distance2[5 - i - j] += Levenshtein.distance(self.group.get_player_by_id(i).Message6_trans, self.group.get_player_by_id(j).Message6_trans) change_group2 = random.choice([i + 4 for i, x in enumerate(distance2) if x == min(distance2)]) self.session.vars['change_group2'] = change_group2 page_sequence = [FirstWaitPage, StrategyMethodInitial, StrategyMethod, SendMessage, MessagesWaitPage, ReceiveMessage, ResultsWaitPage, Results]