# TODO Dokument mit erklärung der einzelnen Variablen # TODO Timer über alle Fragenseiten # TODO Fragen erstellen (lassen) # TODO Skala # TODO fake Timer in der Bewertung # TODO Payoff import random from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) # TODO Documentation und Beschreibung erstellen author = '' doc = """ """ class Constants(BaseConstants): name_in_url = 'Fix_nichtAnonym' # Anzahl der Runden und Spieler einstellen num_rounds = 2 players_per_group = 3 # erstellt eine Frage und mischt die Antwortmöglichkeiten def commonon_knowledge(frage, richtig, falsch1, falsch2, falsch3): choices = [[1, richtig], [0, falsch1], [0, falsch2], [0, falsch3]] random.shuffle(choices) return models.IntegerField(label=frage, widget=widgets.RadioSelect, blank=True, choices=choices) # Was sind die Antwortmöglichkeiten für Spieler beim Geben von Feedback # TODO Skala def feedback_skala(): return [0, 25, 50, 75, 100] class Subsession(BaseSubsession): pass class Group(BaseGroup): # für jeden Spieler wird individuell der Score und die real points berechnet def calculate_score_real(self): for p in self.get_players(): p.calculate_score() p.calculate_real_points() # die Durschnittsbewertung wird ermittelt die jeder Spieler erhalten hat def calculate_average(self): for p in self.get_players(): p.calculate_average() class Player(BasePlayer): # Name, den sich der Nutzer selber gibt # initial Wert nur für Testzwecke nickname = models.StringField(initial='ExperimentTeilnehmer') # Punkte die andere Spieler vergeben # Blank muss True sein, sodass man sich selbst keine Punkte geben kann rating_for_p1 = models.IntegerField(initial=0, blank=True, choices=feedback_skala(), label="Punkte für Spieler 1", widget=widgets.RadioSelectHorizontal) rating_for_p2 = models.IntegerField(initial=0, blank=True, choices=feedback_skala(), label="Punkte für Spieler 2", widget=widgets.RadioSelectHorizontal) rating_for_p3 = models.IntegerField(initial=0, blank=True, choices=feedback_skala(), label="Punkte für Spieler 3", widget=widgets.RadioSelectHorizontal) rating_for_p4 = models.IntegerField(initial=0, blank=True, choices=feedback_skala(), label="Punkte für Spieler 4", widget=widgets.RadioSelectHorizontal) rating_for_p5 = models.IntegerField(initial=0, blank=True, choices=feedback_skala(), label="Punkte für Spieler 5", widget=widgets.RadioSelectHorizontal) rating_for_p6 = models.IntegerField(initial=0, blank=True, choices=feedback_skala(), label="Punkte für Spieler 6", widget=widgets.RadioSelectHorizontal) # Richtig beantwortete Fragen jeder Runde -> score score = models.IntegerField(initial=0) # Wie viele Punkte hätten die Spieler bei ehrlicher Bewertung erhalten real_points = models.IntegerField(initial=0) # Wie viele Punkte hat der Spieler jede Runde im Durschnitt bekommen average = models.FloatField(initial=0) # Fragensammlung q1 = commonon_knowledge('Wie heißt der Bürgermeister von Wesel?', 'Esel', 'Beutelratte', 'Affe', 'Mäusebussard') q2 = commonon_knowledge('Wo wurde Papst Benedikt XVI. geboren?', 'Deutschland', 'Polen', 'Argentinien', 'Ägypten') q3 = commonon_knowledge('Wann endete der zweite Weltkrieg in Europa?', '08.05.1945', '30.01.1933', '08.02.1942', '11.11.1918') q4 = commonon_knowledge('Wer hat das Buch 1984 geschrieben?', 'George Orwell', 'Benedict Cumberbatch', 'Stephen King', 'Kaiser Willhelm, der II.') # Weitere Fragen def get_Nickname(self): # gibt den Namen der in der ersten Runde vergeben wurde zurück if self.round_number == 1: return self.nickname else: return self.in_round(1).nickname def calculate_score(self): # TODO auf die anzahl der Runden anpassen # fragen der jeweiligen Runden fragen_1 = [self.q1, self.q2] fragen_2 = [self.q3, self.q4] # aktuelle runde round = self.round_number # welche runde if round == 1: # score zu beginn auf 0 self.score = 0 # für jede frage der runde for q in fragen_1: # wenn frage beantwortet wurde if q is not None: # addiere 0 bzw. 1 zum score self.score += q elif round == 2: self.score = 0 for q in fragen_2: if q is not None: self.score += q # weitere Runden # TODO Skala def calculate_real_points(self): if self.score == 0: self.real_points = 25 elif self.score == 1: self.real_points = 50 elif self.score == 2: self.real_points = 75 def calculate_average(self): summe = 0 players = Constants.players_per_group for p in self.get_others_in_group(): if self.id_in_group == 1: summe += p.rating_for_p1 elif self.id_in_group == 2: summe += p.rating_for_p2 elif self.id_in_group == 3: summe += p.rating_for_p3 self.average = round(summe / (players-1), 2)