from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) author = 'Mingxian Jin' doc = """ Your app description """ C = [1000] A = [0] import random class Constants(BaseConstants): name_in_url = 'cutcake_leftmost_2' players_per_group = 2 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 class Player(BasePlayer): cut_value = models.IntegerField(initial=0) dropout = models.IntegerField() leftmostvalue_1 = models.IntegerField() firstcut = models.IntegerField() whatsleft = models.IntegerField() payoff_help = models.CurrencyField(initial= 0) envy = models.BooleanField() planned_leftpiece = models.IntegerField() truth_telling = 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) 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) def dim_check_dropout(self): if self.id_in_group == 1: A.pop(2) elif self.id_in_group == 2: 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 <= 210: self.leftmostvalue_1 = 0 elif self.firstcut <= 260: self.leftmostvalue_1 = self.firstcut - 210 elif self.firstcut <= 270: self.leftmostvalue_1 = 50 elif self.firstcut <= 280: self.leftmostvalue_1 = self.firstcut - 270 + 50 elif self.firstcut <= 290: self.leftmostvalue_1 = 60 elif self.firstcut <= 320: self.leftmostvalue_1 = self.firstcut - 290 + 60 elif self.firstcut <= 340: self.leftmostvalue_1 = 90 elif self.firstcut <= 370: self.leftmostvalue_1 = self.firstcut - 340 + 90 else: self.leftmostvalue_1 = 120 if self.id_in_group == 2: if self.firstcut <= 100: self.leftmostvalue_1 = 0 elif self.firstcut <= 130: self.leftmostvalue_1 = self.firstcut - 100 elif self.firstcut <= 150: self.leftmostvalue_1 = 30 elif self.firstcut <= 180: self.leftmostvalue_1 = self.firstcut - 150 + 30 elif self.firstcut <= 210: self.leftmostvalue_1 = 60 elif self.firstcut <= 240: self.leftmostvalue_1 = self.firstcut - 210 + 60 elif self.firstcut <= 320: self.leftmostvalue_1 = 90 elif self.firstcut <= 350: self.leftmostvalue_1 = self.firstcut - 320 + 90 else: self.leftmostvalue_1 = 120 def dim_find_min(self): if self.id_in_group == 1: C.pop(2) elif self.id_in_group == 2: C.pop(1) def get_whatsleft(self): self.whatsleft = 120 - self.leftmostvalue_1 def get_payoff(self): if self.dropout == 1: self.payoff = c(self.leftmostvalue_1) else: self.payoff = c(self.whatsleft) def set_envy(self): if self.dropout == 1: if self.leftmostvalue_1 >= self.whatsleft: self.envy = False else: self.envy = True else: if self.leftmostvalue_1 >= self.whatsleft: self.envy = True else: self.envy = False 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(self): if self.id_in_group == 1: if self.cut_value <= 210: self.planned_leftpiece = 0 elif self.cut_value <= 260: self.planned_leftpiece = self.cut_value - 210 elif self.cut_value <= 270: self.planned_leftpiece = 50 elif self.cut_value <= 280: self.planned_leftpiece = self.cut_value - 270 + 50 elif self.cut_value <= 290: self.planned_leftpiece = 60 elif self.cut_value <= 320: self.planned_leftpiece = self.cut_value - 290 + 60 elif self.cut_value <= 340: self.planned_leftpiece = 90 elif self.cut_value <= 370: self.planned_leftpiece = self.cut_value - 340 + 90 else: self.planned_leftpiece = 120 if self.id_in_group == 2: if self.cut_value <= 100: self.planned_leftpiece = 0 elif self.cut_value <= 130: self.planned_leftpiece = self.cut_value - 100 elif self.cut_value <= 150: self.planned_leftpiece = 30 elif self.cut_value <= 180: self.planned_leftpiece = self.cut_value - 150 + 30 elif self.cut_value <= 210: self.planned_leftpiece = 60 elif self.cut_value <= 240: self.planned_leftpiece = self.cut_value - 210 + 60 elif self.cut_value <= 320: self.planned_leftpiece = 90 elif self.cut_value <= 350: self.planned_leftpiece = self.cut_value - 320 + 90 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