from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) author = 'Mingxian Jin' doc = """ Your app description """ C = [1000] D = [1000] A = [0] B = [0] import random class Constants(BaseConstants): name_in_url = 'cutcake_leftmost_3' players_per_group = 3 num_rounds = 7 class Subsession(BaseSubsession): def creating_session(self): if self.round_number == 1: self.group_randomly() else: self.group_like_round(1) class Group(BaseGroup): def check_overlapping_1(self): e = 0 f = [] for value in A: e += value if e != 1: for i in self.get_players(): if i.dropout == 1: f.append(i.id_in_group) g = random.sample(f,1) for i in self.get_players(): if [i.id_in_group] == g : i.dropout = 1 else: i.dropout = 0 def check_overlapping_2(self): k = 0 l = [] for value in B: k += value if k != 1: for i in self.get_players(): if i.seconddropout == 1: l.append(i.id_in_group) m = random.sample(l, 1) for i in self.get_players(): if [i.id_in_group] == m: i.seconddropout = 1 else: i.seconddropout = 0 class Player(BasePlayer): cut_value = models.IntegerField(initial=0) dropout = models.IntegerField() leftmostvalue_1 = models.IntegerField() firstcut = models.IntegerField() secondcut_value = models.IntegerField(initial = 2000) seconddropout = models.IntegerField(initial = 0) secondcut = models.IntegerField() leftmostvalue_2 = models.IntegerField() whatsleft = models.IntegerField() payoff_help = models.CurrencyField(initial= 0) envy = models.BooleanField() planned_leftpiece_1 = models.IntegerField() truth_telling_1st_stage = models.BooleanField() planned_leftpiece_2 = models.IntegerField() truth_telling_2nd_stage = models.BooleanField() def find_min(self): if self.id_in_group == 1: C.insert(1,self.cut_value) elif self.id_in_group == 2: C.insert(2,self.cut_value) elif self.id_in_group == 3: C.insert(3, self.cut_value) def find_leftmost(self): if self.cut_value == min(C): self.dropout = 1 else: self.dropout = 0 def check_dropout(self): if self.id_in_group == 1: A.insert(1,self.dropout) elif self.id_in_group == 2: A.insert(2, self.dropout) elif self.id_in_group == 3: A.insert(3, self.dropout) def dim_check_dropout(self): if self.id_in_group == 1: A.pop(3) elif self.id_in_group == 2: A.pop(2) elif self.id_in_group == 3: A.pop(1) def find_firstcut(self): self.firstcut = min(C) def find_leftmostvalue_1(self): if self.id_in_group == 1: if self.firstcut <= 70: self.leftmostvalue_1 = 0 elif self.firstcut <= 110: self.leftmostvalue_1 = self.firstcut - 70 elif self.firstcut <= 120: self.leftmostvalue_1 = 40 elif self.firstcut <= 160: self.leftmostvalue_1 = self.firstcut - 120 + 40 elif self.firstcut <= 270: self.leftmostvalue_1 = 80 elif self.firstcut <= 310: self.leftmostvalue_1 = self.firstcut - 270 + 80 else: self.leftmostvalue_1 = 120 if self.id_in_group == 2: if self.firstcut <= 120: self.leftmostvalue_1 = 0 elif self.firstcut <= 130: self.leftmostvalue_1 = self.firstcut - 120 elif self.firstcut <= 410: self.leftmostvalue_1 = 10 elif self.firstcut <= 430: self.leftmostvalue_1 = self.firstcut - 410 + 10 elif self.firstcut <= 450: self.leftmostvalue_1 = 30 elif self.firstcut <= 540: self.leftmostvalue_1 = self.firstcut - 450 + 30 else: self.leftmostvalue_1 = 120 if self.id_in_group == 3: if self.firstcut <= 120: self.leftmostvalue_1 = 0 elif self.firstcut <= 150: self.leftmostvalue_1 = self.firstcut - 120 elif self.firstcut <= 170: self.leftmostvalue_1 = 30 elif self.firstcut <= 180: self.leftmostvalue_1 = self.firstcut - 170 + 30 elif self.firstcut <= 190: self.leftmostvalue_1 = 40 elif self.firstcut <= 200: self.leftmostvalue_1 = self.firstcut - 190 + 40 elif self.firstcut <= 310: self.leftmostvalue_1 = 50 elif self.firstcut <= 380: self.leftmostvalue_1 = self.firstcut - 310 + 50 else: self.leftmostvalue_1 = 120 def dim_find_min(self): if self.id_in_group == 1: C.pop(3) elif self.id_in_group == 2: C.pop(2) elif self.id_in_group == 3: C.pop(1) def find_min_2(self): if self.id_in_group == 1: D.insert(1, self.secondcut_value) elif self.id_in_group == 2: D.insert(2, self.secondcut_value) elif self.id_in_group == 3: D.insert(3, self.secondcut_value) def find_leftmost_2(self): if self.secondcut_value == min(D): self.seconddropout = 1 else: self.seconddropout = 0 def check_seconddropout(self): if self.id_in_group == 1: B.insert(1, self.seconddropout) elif self.id_in_group == 2: B.insert(2, self.seconddropout) elif self.id_in_group == 3: B.insert(3, self.seconddropout) def dim_check_seconddropout(self): if self.id_in_group == 1: B.pop(3) elif self.id_in_group == 2: B.pop(2) elif self.id_in_group == 3: B.pop(1) def find_secondcut(self): self.secondcut = min(D) def find_leftmostvalue_2(self): if self.id_in_group == 1: if self.secondcut <= 70: self.leftmostvalue_2 = 0 elif self.secondcut <= 110: self.leftmostvalue_2 = max(self.secondcut - 70 - self.leftmostvalue_1,0) elif self.secondcut <= 120: self.leftmostvalue_2 = max(40 - self.leftmostvalue_1,0) elif self.secondcut <= 160: self.leftmostvalue_2 = max(self.secondcut - 120 + 40 - self.leftmostvalue_1,0) elif self.secondcut <= 270: self.leftmostvalue_2 = max(80 - self.leftmostvalue_1,0) elif self.secondcut <= 310: self.leftmostvalue_2 = max(self.secondcut - 270 + 80 - self.leftmostvalue_1,0) else: self.leftmostvalue_2 = 120 - self.leftmostvalue_1 if self.id_in_group == 2: if self.secondcut <= 120: self.leftmostvalue_2 = 0 elif self.secondcut <= 130: self.leftmostvalue_2 = max(self.secondcut - 120 - self.leftmostvalue_1,0) elif self.secondcut <= 410: self.leftmostvalue_2 = max(10 - self.leftmostvalue_1,0) elif self.secondcut <= 430: self.leftmostvalue_2 = max(self.secondcut - 410 + 10 - self.leftmostvalue_1,0) elif self.secondcut <= 450: self.leftmostvalue_2 = max(30 - self.leftmostvalue_1,0) elif self.secondcut <= 540: self.leftmostvalue_2 = max(self.secondcut - 450 + 30 - self.leftmostvalue_1,0) else: self.leftmostvalue_2 = 120 - self.leftmostvalue_1 if self.id_in_group == 3: if self.secondcut <= 120: self.leftmostvalue_2 = 0 elif self.secondcut <= 150: self.leftmostvalue_2 = max(self.secondcut - 120 - self.leftmostvalue_1,0) elif self.secondcut <= 170: self.leftmostvalue_2 = max(30 - self.leftmostvalue_1,0) elif self.secondcut <= 180: self.leftmostvalue_2 = max(self.secondcut - 170 + 30 - self.leftmostvalue_1,0) elif self.secondcut <= 190: self.leftmostvalue_2 = max(40 - self.leftmostvalue_1,0) elif self.secondcut <= 200: self.leftmostvalue_2 = max(self.secondcut - 190 + 40 - self.leftmostvalue_1,0) elif self.secondcut <= 310: self.leftmostvalue_2 = max(50 - self.leftmostvalue_1,0) elif self.secondcut <= 380: self.leftmostvalue_2 = max(self.secondcut - 310 + 50 - self.leftmostvalue_1,0) else: self.leftmostvalue_2 = 120 - self.leftmostvalue_1 def dim_find_min_2(self): if self.id_in_group == 1: D.pop(3) elif self.id_in_group == 2: D.pop(2) elif self.id_in_group == 3: D.pop(1) def get_whatsleft(self): self.whatsleft = 120 - self.leftmostvalue_1 - self.leftmostvalue_2 def get_payoff(self): if self.dropout == 1: self.payoff = c(self.leftmostvalue_1) elif self.seconddropout == 1: self.payoff = c(self.leftmostvalue_2) else: self.payoff = c(self.whatsleft) def set_envy(self): if self.dropout == 1: if self.leftmostvalue_1 >= self.leftmostvalue_2 and self.leftmostvalue_1 >= self.whatsleft: self.envy = False else: self.envy = True elif self.seconddropout == 1: if self.leftmostvalue_2 >= self.leftmostvalue_1 and self.leftmostvalue_2 >= self.whatsleft: self.envy = False else: self.envy = True else: if self.whatsleft >= self.leftmostvalue_1 and self.whatsleft >= self.leftmostvalue_2: self.envy = False else: self.envy = True def score_calculation(self): self.payoff_help = self.in_round(1).payoff + self.in_round(2).payoff + self.in_round( 3).payoff + self.in_round(4).payoff + self.in_round(5).payoff + self.in_round(6).payoff + self.in_round(7).payoff def set_planned_leftpiece_1(self): if self.id_in_group == 1: if self.cut_value <= 70: self.planned_leftpiece_1 = 0 elif self.cut_value <= 110: self.planned_leftpiece_1 = self.cut_value - 70 elif self.cut_value <= 120: self.planned_leftpiece_1 = 40 elif self.cut_value <= 160: self.planned_leftpiece_1 = self.cut_value - 120 + 40 elif self.cut_value <= 270: self.planned_leftpiece_1 = 80 elif self.cut_value <= 310: self.planned_leftpiece_1 = self.cut_value - 270 + 80 else: self.planned_leftpiece_1 = 120 if self.id_in_group == 2: if self.cut_value <= 120: self.planned_leftpiece_1 = 0 elif self.cut_value <= 130: self.planned_leftpiece_1 = self.cut_value - 120 elif self.cut_value <= 410: self.planned_leftpiece_1 = 10 elif self.cut_value <= 430: self.planned_leftpiece_1 = self.cut_value - 410 + 10 elif self.cut_value <= 450: self.planned_leftpiece_1 = 30 elif self.cut_value <= 540: self.planned_leftpiece_1 = self.cut_value - 450 + 30 else: self.planned_leftpiece_1 = 120 if self.id_in_group == 3: if self.cut_value <= 120: self.planned_leftpiece_1 = 0 elif self.cut_value <= 150: self.planned_leftpiece_1 = self.cut_value - 120 elif self.cut_value <= 170: self.planned_leftpiece_1 = 30 elif self.cut_value <= 180: self.planned_leftpiece_1 = self.cut_value - 170 + 30 elif self.cut_value <= 190: self.planned_leftpiece_1 = 40 elif self.cut_value <= 200: self.planned_leftpiece_1 = self.cut_value - 190 + 40 elif self.cut_value <= 310: self.planned_leftpiece_1 = 50 elif self.cut_value <= 380: self.planned_leftpiece_1 = self.cut_value - 310 + 50 else: self.planned_leftpiece_1 = 120 def set_truthtelling_1(self): if self.planned_leftpiece_1 <= 45 and self.planned_leftpiece_1 >= 35: self.truth_telling_1st_stage = True else: self.truth_telling_1st_stage = False def set_planned_leftpiece_2(self): if self.id_in_group == 1 and self.dropout == 0: if self.secondcut_value <= 70: self.planned_leftpiece_2 = 0 elif self.secondcut_value <= 110: self.planned_leftpiece_2 = max(self.secondcut_value - 70 - self.leftmostvalue_1, 0) elif self.secondcut_value <= 120: self.planned_leftpiece_2 = max(40 - self.leftmostvalue_1, 0) elif self.secondcut_value <= 160: self.planned_leftpiece_2 = max(self.secondcut_value - 120 + 40 - self.leftmostvalue_1, 0) elif self.secondcut_value <= 270: self.planned_leftpiece_2 = max(80 - self.leftmostvalue_1, 0) elif self.secondcut_value <= 310: self.planned_leftpiece_2 = max(self.secondcut_value - 270 + 80 - self.leftmostvalue_1, 0) else: self.planned_leftpiece_2 = 120 - self.leftmostvalue_1 if self.id_in_group == 2 and self.dropout == 0: if self.secondcut_value <= 120: self.planned_leftpiece_2 = 0 elif self.secondcut_value <= 130: self.planned_leftpiece_2 = max(self.secondcut_value - 120 - self.leftmostvalue_1, 0) elif self.secondcut_value <= 410: self.planned_leftpiece_2 = max(10 - self.leftmostvalue_1, 0) elif self.secondcut_value <= 430: self.planned_leftpiece_2 = max(self.secondcut_value - 410 + 10 - self.leftmostvalue_1, 0) elif self.secondcut_value <= 450: self.planned_leftpiece_2 = max(30 - self.leftmostvalue_1, 0) elif self.secondcut_value <= 540: self.planned_leftpiece_2 = max(self.secondcut_value - 450 + 30 - self.leftmostvalue_1, 0) else: self.planned_leftpiece_2 = 120 - self.leftmostvalue_1 if self.id_in_group == 3 and self.dropout == 0: if self.secondcut_value <= 120: self.planned_leftpiece_2 = 0 elif self.secondcut_value <= 150: self.planned_leftpiece_2 = max(self.secondcut_value - 120 - self.leftmostvalue_1,0) elif self.secondcut_value <= 170: self.planned_leftpiece_2 = max(30 - self.leftmostvalue_1, 0) elif self.secondcut_value <= 180: self.planned_leftpiece_2 = max(self.secondcut_value - 170 + 30 - self.leftmostvalue_1, 0) elif self.secondcut_value <= 190: self.planned_leftpiece_2 = max(40 - self.leftmostvalue_1, 0) elif self.secondcut_value <= 200: self.planned_leftpiece_2 = max(self.secondcut_value - 190 + 40 - self.leftmostvalue_1, 0) elif self.secondcut_value <= 310: self.planned_leftpiece_2 = max(50 - self.leftmostvalue_1, 0) elif self.secondcut_value <= 380: self.planned_leftpiece_2 = max(self.secondcut_value - 310 + 50 - self.leftmostvalue_1, 0) else: self.planned_leftpiece_2 = 120 - self.leftmostvalue_1 def set_truthtelling_2(self): if self.dropout == 0 and self.planned_leftpiece_2 >= int((120 - self.leftmostvalue_1)/2) - 5 and self.planned_leftpiece_2 <= int((120 - self.leftmostvalue_1)/2) + 5: self.truth_telling_2nd_stage = True elif self.dropout == 0 and self.planned_leftpiece_2 < int((120 - self.leftmostvalue_1)/2) - 5 or self.dropout == 0 and self.planned_leftpiece_2 > int((120 - self.leftmostvalue_1)/2) + 5: self.truth_telling_2nd_stage = False