from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) author = 'Your name here' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'C3' players_per_group = 3 num_rounds = 3 class Subsession(BaseSubsession): def creating_session(self): import random if self.round_number == 1: for p in self.get_players(): symbols = ['#', '$', '%', '^', '&', '*'] random.shuffle(symbols) random_sym = symbols[:] p.participant.vars['random'] = ''.join(random_sym) for p in self.get_players(): if p.group.id_in_subsession == 1: p.State_ball = random.choice([1, 2, 3]) else: p.State_ball = random.choice([1, 3, 6]) class Group(BaseGroup): def set_payoffs(self): for i, j in [(1, 2), (1, 3), (2, 1)]: if self.get_player_by_id(i).State_ball == self.get_player_by_id(j).Action_ball_1: self.get_player_by_id(i).payoff += 2 self.get_player_by_id(j).payoff += 2 for i, j in [(2, 3), (3, 1), (3, 2)]: if self.get_player_by_id(i).State_ball == self.get_player_by_id(j).Action_ball_2: self.get_player_by_id(i).payoff += 2 self.get_player_by_id(j).payoff += 2 for p in self.get_players(): mydict = p.my_trans_dict() p.Message1_trans = ''.join([mydict.get(w) for w in list(p.Message1)]) p.Message2_trans = ''.join([mydict.get(w) for w in list(p.Message2)]) p.Message3_trans = ''.join([mydict.get(w) for w in list(p.Message3)]) if (self.get_player_by_id(1).Message1_trans == self.get_player_by_id( 2).Message1_trans == self.get_player_by_id(3).Message1_trans) & ( self.get_player_by_id(1).Message2_trans == self.get_player_by_id( 2).Message2_trans == self.get_player_by_id(3).Message2_trans) & ( self.get_player_by_id(1).Message3_trans == self.get_player_by_id( 2).Message3_trans == self.get_player_by_id(3).Message3_trans): self.get_player_by_id(1).payoff += 8 self.get_player_by_id(2).payoff += 8 self.get_player_by_id(3).payoff += 8 self.get_player_by_id(1).Match = 2 self.get_player_by_id(2).Match = 2 self.get_player_by_id(3).Match = 2 else: for i, j in [(1, 2), (2, 3), (1, 3)]: if (self.get_player_by_id(i).Message1_trans == self.get_player_by_id( j).Message1_trans) & ( self.get_player_by_id(i).Message2_trans == self.get_player_by_id( j).Message2_trans) & ( self.get_player_by_id(i).Message3_trans == self.get_player_by_id(j).Message3_trans): self.get_player_by_id(i).payoff += 4 self.get_player_by_id(j).payoff += 4 self.get_player_by_id(i).Match = 1 self.get_player_by_id(j).Match = 1 class Player(BasePlayer): State_ball = models.IntegerField() Message1 = models.StringField() Message2 = models.StringField() Message3 = models.StringField() def start(self): if self.round_number > 1: self.Message1 = self.in_round(self.round_number - 1).Message1 self.Message2 = self.in_round(self.round_number - 1).Message2 self.Message3 = self.in_round(self.round_number - 1).Message3 Message1_trans = models.StringField() Message2_trans = models.StringField() Message3_trans = models.StringField() Action_ball_1 = models.IntegerField(blank=True) Action_ball_2 = models.IntegerField(blank=True) Message = models.StringField() my_trans_message = models.StringField() Match = models.IntegerField(initial=0) def my_trans_dict(self): symbols = ['#', '$', '%', '^', '&', '*'] my_random = list(self.participant.vars['random']) mydictionary = dict(zip(my_random, symbols)) return mydictionary def my_trans_message(self): mydict = self.my_trans_dict() words = list(self.Message) trans = [mydict.get(w) for w in words] my_trans_message = ''.join(trans) return my_trans_message def other_trans_dict(self): symbols = ['#', '$', '%', '^', '&', '*'] my_random = list(self.participant.vars['random']) otdictionary = dict(zip(symbols, my_random)) return otdictionary def first_mess(self): message_received = [other.my_trans_message() for other in self.get_others_in_group()] first_mess = message_received[0] return first_mess def first_mess_trans(self): dict = self.other_trans_dict() words = list(self.first_mess()) trans = [dict.get(w) for w in words] first_mess_trans = ''.join(trans) return first_mess_trans def second_mess(self): message_received = [other.my_trans_message() for other in self.get_others_in_group()] second_mess = message_received[1] return second_mess def second_mess_trans(self): dict = self.other_trans_dict() words = list(self.second_mess()) trans = [dict.get(w) for w in words] second_mess_trans = ''.join(trans) return second_mess_trans def nickname(self): if self.id_in_group == 1: nickname = "成員甲" elif self.id_in_group == 2: nickname = "成員乙" else: nickname = "成員丙" return nickname def first_nickname(self): if self.id_in_group == 1: nickname = "成員乙" else: nickname = "成員甲" return nickname def second_nickname(self): if self.id_in_group == 3: nickname = "成員乙" else: nickname = "成員丙" return nickname