from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) doc = '' class Constants(BaseConstants): name_in_url = 'BC_I' players_per_group = 3 num_rounds = 4 jackpot = c(6) guess_max = 100 instructions_individuell_template = 'BC_I/instructions_individuell.html' class Subsession(BaseSubsession): two_thirds_avg = models.FloatField(initial=0) num_winners = models.IntegerField() best_guess = models.FloatField() def calc_payoffs(self): groups = self.get_groups() guesses = [] for g in groups: if g.group_guess <= Constants.guess_max: guesses.append(g.group_guess) else: print("101 von der Gruppe") two_thirds_avg = (2 / 3) * (sum(guesses) / len(guesses)) self.two_thirds_avg = round(two_thirds_avg, 2) self.best_guess = min( guesses, key=lambda guess: abs(guess - self.two_thirds_avg) ) winners = [] for g in groups: if g.group_guess == self.best_guess: winners.append(g) self.num_winners = len(winners) for g in winners: g.is_winner = True g.payoff = Constants.jackpot / self.num_winners def two_thirds_avg_history(self): return [s.two_thirds_avg for s in self.in_previous_rounds()] def set_groups(self): ''' Assigns Participants to a group on a random basis. Replaces the round page used in: GroupDissWaitPage ''' if self.round_number == 1: self.group_randomly(fixed_id_in_group = True) else: self.group_like_round(1) class Group(BaseGroup): is_winner = models.BooleanField(initial=False) payoff = models.CurrencyField(initial=0, min=0) group_guess = models.FloatField(initial=101, min=0) def dis_payoff(self): winners = self.get_players() for p in winners: p.p_payoff += (self.payoff / len(winners)) def set_payoff(self): self.subsession.calc_payoffs() def set_guess(self): import random players = self.get_players() i = 0 guesses = [] #Wenn die Spieler einen legitimen Wert abgeben, wird er zu den Optionen hinzugefügt for p in players: if p.guess == "": p.guess = 101 if p.guess <= Constants.guess_max: i += 1 guesses.append(p.guess) #Auswahl des Gruppenwertes if i > 0: y = random.randint(0, i-1) self.group_guess = guesses[y] else: print("Error! Group didn't choose anything") self.group_guess = 101 #Um den Prozess transparent zu gestalten, werden alle abgegebenen Werte gespeichert for p in players: p.participant.vars['guesses'] = guesses class Player(BasePlayer): guess_before_discussion = models.FloatField(initial=101, max=100, min=0) guess = models.FloatField(blank=True, initial=101, max=Constants.guess_max, min=0) is_winner = models.BooleanField(initial=False) p_payoff = models.CurrencyField(initial=0, min=0) vp_alter = models.StringField(initial='') vp_gender = models.StringField(choices=[['m', 'männlich'], ['w', 'weiblich'], ['d', 'divers']], initial='', widget=widgets.RadioSelect) vp_code = models.StringField(initial='') vp_stunden = models.StringField(choices=[['vph', '1 VP-Stunde'], ['geld', '4€ Teilnehmerbetrag']], widget=widgets.RadioSelect) vp_complCode = models.StringField(initial='') condition = models.StringField(initial='I') expertise = models.BooleanField(choices=[[True, 'Ja'], [False, 'Nein']], widget=widgets.RadioSelect) vp_helpCode = models.StringField(initial='')