from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random author = 'Mingxian Jin' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'cutcake_practice_IcutUchoose_random' players_per_group = 2 num_rounds = 1 class Subsession(BaseSubsession): A1 = models.IntegerField() A2 = models.IntegerField() A3 = models.IntegerField() A4 = models.IntegerField() A5 = models.IntegerField() A6 = models.IntegerField() A7 = models.IntegerField() A8 = models.IntegerField() WidthA1 = models.IntegerField() WidthA2 = models.IntegerField() WidthA3 = models.IntegerField() WidthA4 = models.IntegerField() B1 = models.IntegerField() B2 = models.IntegerField() B3 = models.IntegerField() B4 = models.IntegerField() B5 = models.IntegerField() B6 = models.IntegerField() WidthB1 = models.IntegerField() WidthB2 = models.IntegerField() WidthB3 = models.IntegerField() def creating_session(self): if self.round_number == 1: self.group_randomly() while True: list = [7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40, 41,42,43,44,45,46,47,48,49,50,51,52,53,54] A = sorted(random.sample(list, 8)) self.A1 = A[0] self.A2 = A[1] self.A3 = A[2] self.A4 = A[3] self.A5 = A[4] self.A6 = A[5] self.A7 = A[6] self.A8 = A[7] if self.A2-self.A1 + self.A4-self.A3 + self.A6-self.A5 + self.A8-self.A7==12: break self.A1 = self.A1*10 self.A2 = self.A2*10 self.A3 = self.A3*10 self.A4 = self.A4*10 self.A5 = self.A5*10 self.A6 = self.A6*10 self.A7 = self.A7*10 self.A8 = self.A8*10 self.WidthA1 = self.A2 - self.A1 self.WidthA2 = self.A4 - self.A3 self.WidthA3 = self.A6 - self.A5 self.WidthA4 = self.A8 - self.A7 while True: list = [7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40, 41,42,43,44,45,46,47,48,49,50,51,52,53,54] B = sorted(random.sample(list, 6)) self.B1 = B[0] self.B2 = B[1] self.B3 = B[2] self.B4 = B[3] self.B5 = B[4] self.B6 = B[5] if self.B2-self.B1 + self.B4-self.B3 + self.B6-self.B5==12: break self.B1 = self.B1*10 self.B2 = self.B2*10 self.B3 = self.B3*10 self.B4 = self.B4*10 self.B5 = self.B5*10 self.B6 = self.B6*10 self.WidthB1 = self.B2 - self.B1 self.WidthB2 = self.B4 - self.B3 self.WidthB3 = self.B6 - self.B5 class Group(BaseGroup): cut_value = models.IntegerField(initial=0) choice_piece = models.StringField() round_value = models.IntegerField(initial=1) choice = models.BooleanField( choices=[ [False, 'Left'], [True, 'Right'], ] ) class Player(BasePlayer): left_piece = models.IntegerField(initial=0) right_piece = models.IntegerField(initial=0) value_own_piece = models.IntegerField(initial=0) value_other_piece = models.IntegerField(initial=0) payoff_help = models.CurrencyField(initial=0) envy = models.BooleanField() truth_telling = models.BooleanField() def set_pieces(self): if self.id_in_group == 1: if self.group.cut_value <= self.subsession.A1: self.left_piece = 0 elif self.group.cut_value <= self.subsession.A2: self.left_piece = self.group.cut_value - self.subsession.A1 elif self.group.cut_value <= self.subsession.A3: self.left_piece = self.subsession.A2 - self.subsession.A1 elif self.group.cut_value <= self.subsession.A4: self.left_piece = self.group.cut_value - self.subsession.A3 + self.subsession.A2 - self.subsession.A1 elif self.group.cut_value <= self.subsession.A5: self.left_piece = self.subsession.A2 - self.subsession.A1 + self.subsession.A4 - self.subsession.A3 elif self.group.cut_value <= self.subsession.A6: self.left_piece = self.group.cut_value - self.subsession.A5 + self.subsession.A2 - self.subsession.A1 + self.subsession.A4 - self.subsession.A3 elif self.group.cut_value <= self.subsession.A7: self.left_piece = self.subsession.A6 - self.subsession.A5 + self.subsession.A2 - self.subsession.A1 + self.subsession.A4 - self.subsession.A3 elif self.group.cut_value <= self.subsession.A8: self.left_piece = self.group.cut_value - self.subsession.A7 + self.subsession.A6 - self.subsession.A5 + self.subsession.A2 - self.subsession.A1 + self.subsession.A4 - self.subsession.A3 else: self.left_piece = 120 if self.id_in_group == 2: if self.group.cut_value <= self.subsession.B1: self.left_piece = 0 elif self.group.cut_value <= self.subsession.B2: self.left_piece = self.group.cut_value - self.subsession.B1 elif self.group.cut_value <= self.subsession.B3: self.left_piece = self.subsession.B2 - self.subsession.B1 elif self.group.cut_value <= self.subsession.B4: self.left_piece = self.group.cut_value - self.subsession.B3 + self.subsession.B2 - self.subsession.B1 elif self.group.cut_value <= self.subsession.B5: self.left_piece = self.subsession.B2 - self.subsession.B1 + self.subsession.B4 - self.subsession.B3 elif self.group.cut_value <= self.subsession.B6: self.left_piece = self.group.cut_value - self.subsession.B5 + self.subsession.B2 - self.subsession.B1 + self.subsession.B4 - self.subsession.B3 else: self.left_piece = 120 self.right_piece = 120 - self.left_piece def set_payoff(self): if self.group.choice: self.group.choice_piece = 'Right' else: self.group.choice_piece = 'Left' if self.id_in_group == 1: if self.group.choice: self.value_own_piece = self.left_piece self.value_other_piece = self.right_piece else: self.value_own_piece = self.right_piece self.value_other_piece = self.left_piece elif self.id_in_group == 2: if self.group.choice: self.value_own_piece = self.right_piece self.value_other_piece = self.left_piece else: self.value_own_piece = self.left_piece self.value_other_piece = self.right_piece def set_envy(self): if self.value_own_piece >= self.value_other_piece: self.envy = False else: self.envy = True def set_truthtelling(self): if self.id_in_group == 1: if self.left_piece <= 65 and self.left_piece >= 55: self.truth_telling = True else: self.truth_telling = False elif self.id_in_group == 2: if self.value_own_piece >= self.value_other_piece: self.truth_telling = True else: self.truth_telling = False