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_cutmiddle_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() A9 = models.IntegerField() A10 = models.IntegerField() WidthA1 = models.IntegerField() WidthA2 = models.IntegerField() WidthA3 = models.IntegerField() WidthA4 = models.IntegerField() WidthA5 = models.IntegerField() B1 = models.IntegerField() B2 = models.IntegerField() B3 = models.IntegerField() B4 = models.IntegerField() B5 = models.IntegerField() B6 = models.IntegerField() B7 = models.IntegerField() B8 = models.IntegerField() B9 = models.IntegerField() B10 = models.IntegerField() WidthB1 = models.IntegerField() WidthB2 = models.IntegerField() WidthB3 = models.IntegerField() WidthB4 = models.IntegerField() WidthB5 = 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, 10)) 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] self.A9 = A[8] self.A10 = A[9] if self.A2-self.A1 + self.A4-self.A3 + self.A6-self.A5 + self.A8-self.A7 + self.A10 - self.A9==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.A9 = self.A9*10 self.A10 = self.A10*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 self.WidthA5 = self.A10 - self.A9 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, 10)) self.B1 = B[0] self.B2 = B[1] self.B3 = B[2] self.B4 = B[3] self.B5 = B[4] self.B6 = B[5] self.B7 = B[6] self.B8 = B[7] self.B9 = B[8] self.B10 = B[9] if self.B2-self.B1 + self.B4-self.B3 + self.B6-self.B5 + self.B8-self.B7 + self.B10-self.B9==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.B7 = self.B7*10 self.B8 = self.B8*10 self.B9 = self.B9*10 self.B10 = self.B10*10 self.WidthB1 = self.B2 - self.B1 self.WidthB2 = self.B4 - self.B3 self.WidthB3 = self.B6 - self.B5 self.WidthB4 = self.B8 - self.B7 self.WidthB5 = self.B10 - self.B9 class Group(BaseGroup): resolving_cut = models.IntegerField(initial=0) def delete_overlapping(self): choice_list = [p.choice for p in self.get_players()] e = 0 for value in choice_list: e += value if e != 1: players = [p.id_in_group for p in self.get_players() ] random_right = random.sample(players, 1) for i in self.get_players(): if [i.id_in_group] == random_right: i.choice = 1 else: i.choice = 0 class Player(BasePlayer): cut_value = models.IntegerField(initial=0) 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) choice = models.IntegerField() payoff_help = models.CurrencyField(initial=0) planned_leftpiece = models.IntegerField() truth_telling = models.BooleanField() envy = models.BooleanField() def set_cut_value(self): self.group.resolving_cut = int(sum(p.cut_value for p in self.group.get_players())/Constants.players_per_group) def decide_side(self): if self.cut_value > self.group.resolving_cut: self.choice = 1 else: self.choice = 0 def set_pieces(self): if self.id_in_group == 1: if self.group.resolving_cut <= self.subsession.A1: self.left_piece = 0 elif self.group.resolving_cut <= self.subsession.A2: self.left_piece = self.group.resolving_cut - self.subsession.A1 elif self.group.resolving_cut <= self.subsession.A3: self.left_piece = self.subsession.A2 - self.subsession.A1 elif self.group.resolving_cut <= self.subsession.A4: self.left_piece = self.group.resolving_cut - self.subsession.A3 + self.subsession.A2 - self.subsession.A1 elif self.group.resolving_cut <= self.subsession.A5: self.left_piece = self.subsession.A2 - self.subsession.A1 + self.subsession.A4 - self.subsession.A3 elif self.group.resolving_cut <= self.subsession.A6: self.left_piece = self.group.resolving_cut - self.subsession.A5 + self.subsession.A2 - self.subsession.A1 + self.subsession.A4 - self.subsession.A3 elif self.group.resolving_cut <= 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.resolving_cut <= self.subsession.A8: self.left_piece = self.group.resolving_cut - self.subsession.A7 + self.subsession.A6 - self.subsession.A5 + self.subsession.A2 - self.subsession.A1 + self.subsession.A4 - self.subsession.A3 elif self.group.resolving_cut <= self.subsession.A9: self.left_piece = self.subsession.A8 - self.subsession.A7 + self.subsession.A6 - self.subsession.A5 + self.subsession.A2 - self.subsession.A1 + self.subsession.A4 - self.subsession.A3 elif self.group.resolving_cut <= self.subsession.A10: self.left_piece = self.group.resolving_cut - self.subsession.A9 + self.subsession.A8 - 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.resolving_cut <= self.subsession.B1: self.left_piece = 0 elif self.group.resolving_cut <= self.subsession.B2: self.left_piece = self.group.resolving_cut - self.subsession.B1 elif self.group.resolving_cut <= self.subsession.B3: self.left_piece = self.subsession.B2 - self.subsession.B1 elif self.group.resolving_cut <= self.subsession.B4: self.left_piece = self.group.resolving_cut - self.subsession.B3 + self.subsession.B2 - self.subsession.B1 elif self.group.resolving_cut <= self.subsession.B5: self.left_piece = self.subsession.B4 - self.subsession.B3 + self.subsession.B2 - self.subsession.B1 elif self.group.resolving_cut <= self.subsession.B6: self.left_piece = self.group.resolving_cut - self.subsession.B5 + self.subsession.B4 - self.subsession.B3 + self.subsession.B2 - self.subsession.B1 elif self.group.resolving_cut <= self.subsession.B7: self.left_piece = self.subsession.B6 - self.subsession.B5 + self.subsession.B4 - self.subsession.B3 + self.subsession.B2 - self.subsession.B1 elif self.group.resolving_cut <= self.subsession.B8: self.left_piece = self.group.resolving_cut - self.subsession.B7 + self.subsession.B6 - self.subsession.B5 + self.subsession.B4 - self.subsession.B3 + self.subsession.B2 - self.subsession.B1 elif self.group.resolving_cut <= self.subsession.B9: self.left_piece = self.subsession.B8 - self.subsession.B7 + self.subsession.B6 - self.subsession.B5 + self.subsession.B4 - self.subsession.B3 + self.subsession.B2 - self.subsession.B1 elif self.group.resolving_cut <= self.subsession.B10: self.left_piece = self.group.resolving_cut - self.subsession.B9 + self.subsession.B8 - self.subsession.B7 + self.subsession.B6 - self.subsession.B5 + self.subsession.B4 - self.subsession.B3 + self.subsession.B2 - self.subsession.B1 else: self.left_piece = 120 self.right_piece = 120 - self.left_piece def set_own_piece(self): if self.choice == 0: 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 self.payoff = c(self.value_own_piece) def set_envy(self): if self.value_own_piece >= self.value_other_piece: self.envy = False else: self.envy = True def set_planned_leftpiece(self): if self.id_in_group == 1: if self.cut_value <= self.subsession.A1: self.planned_leftpiece = 0 elif self.cut_value <= self.subsession.A2: self.planned_leftpiece = self.cut_value - self.subsession.A1 elif self.cut_value <= self.subsession.A3: self.planned_leftpiece = self.subsession.A2 - self.subsession.A1 elif self.cut_value <= self.subsession.A4: self.planned_leftpiece = self.cut_value - self.subsession.A3 + self.subsession.A2 - self.subsession.A1 elif self.cut_value <= self.subsession.A5: self.planned_leftpiece = self.subsession.A4 - self.subsession.A3 + self.subsession.A2 - self.subsession.A1 elif self.cut_value <= self.subsession.A6: self.planned_leftpiece = self.cut_value - self.subsession.A5 + self.subsession.A4 - self.subsession.A3 + self.subsession.A2 - self.subsession.A1 elif self.cut_value <= self.subsession.A7: self.planned_leftpiece = self.subsession.A6 - self.subsession.A5 + self.subsession.A4 - self.subsession.A3 + self.subsession.A2 - self.subsession.A1 elif self.cut_value <= self.subsession.A8: self.planned_leftpiece = self.cut_value - self.subsession.A7 + self.subsession.A6 - self.subsession.A5 + self.subsession.A4 - self.subsession.A3 + self.subsession.A2 - self.subsession.A1 elif self.group.resolving_cut <= self.subsession.A9: self.planned_leftpiece = self.subsession.A8 - self.subsession.A7 + self.subsession.A6 - self.subsession.A5 + self.subsession.A4 - self.subsession.A3 + self.subsession.A2 - self.subsession.A1 elif self.cut_value <= self.subsession.A10: self.planned_leftpiece = self.cut_value - self.subsession.A9 + self.subsession.A8 - self.subsession.A7 + self.subsession.A6 - self.subsession.A5 + self.subsession.A4 - self.subsession.A3 + self.subsession.A2 - self.subsession.A1 else: self.planned_leftpiece = 120 if self.id_in_group == 2: if self.cut_value <= self.subsession.B1: self.planned_leftpiece = 0 elif self.cut_value <= self.subsession.B2: self.planned_leftpiece = self.cut_value - self.subsession.B1 elif self.cut_value <= self.subsession.B3: self.planned_leftpiece = self.subsession.B2 - self.subsession.B1 elif self.cut_value <= self.subsession.B4: self.planned_leftpiece = self.cut_value - self.subsession.B3 + self.subsession.B2 - self.subsession.B1 elif self.cut_value <= self.subsession.B5: self.planned_leftpiece = self.subsession.B4 - self.subsession.B3 + self.subsession.B2 - self.subsession.B1 elif self.cut_value <= self.subsession.B6: self.planned_leftpiece = self.cut_value - self.subsession.B5 + self.subsession.B4 - self.subsession.B3 + self.subsession.B2 - self.subsession.B1 elif self.cut_value <= self.subsession.B7: self.planned_leftpiece = self.subsession.B6 - self.subsession.B5 + self.subsession.B4 - self.subsession.B3 + self.subsession.B2 - self.subsession.B1 elif self.cut_value <= self.subsession.B8: self.planned_leftpiece = self.cut_value - self.subsession.B7 + self.subsession.B6 - self.subsession.B5 + self.subsession.B4 - self.subsession.B3 + self.subsession.B2 - self.subsession.B1 elif self.cut_value <= self.subsession.B9: self.planned_leftpiece = self.subsession.B8 - self.subsession.B7 + self.subsession.B6 - self.subsession.B5 + self.subsession.B4 - self.subsession.B3 + self.subsession.B2 - self.subsession.B1 elif self.cut_value <= self.subsession.B10: self.planned_leftpiece = self.cut_value - self.subsession.B9 + self.subsession.B8 - self.subsession.B7 + self.subsession.B6 - self.subsession.B5 + self.subsession.B4 - self.subsession.B3 + self.subsession.B2 - self.subsession.B1 else: self.planned_leftpiece = 120 def set_truthtelling(self): if self.planned_leftpiece <= 65 and self.planned_leftpiece>= 55: self.truth_telling = True else: self.truth_telling = False