from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import random #Python default RNG from random import * author = 'Baptiste Obry' doc = """ Nullzählspiel """ class Constants(BaseConstants): # Sorgt für "Verschleierung" der Versuchsgruppe in der URL name_in_url = 'vjhglr' # Jede Versuchsgruppe besteht immer aus 2 Spielern players_per_group = 2 # Maximale Anzahl an Runden (relevant für Versuchsgruppe Anzahl, da hier so viele Tabellen bearbeitbar sein sollen, # wie in 15 Minuten möglich sind num_rounds = 120 # Legt Dimension (= Anzahl der Zeilen und Spalten) der quadratischen Tabelle fest tabelleGröße = 10 class Subsession(BaseSubsession): def creating_session(self): # Im Array self.session.vars[self.round_number + 200] werden für jede Runde # die einzelnen Einträge (0 oder 1) der Tabelle gespeichert self.session.vars[self.round_number + 200] = [[0 for i in range(Constants.tabelleGröße)] for i in range(Constants.tabelleGröße)] self.session.vars["ZeroCounter"] = 0 for zeile in range(0, Constants.tabelleGröße): for spalte in range(0, Constants.tabelleGröße): x = randint(0, 1) self.session.vars[self.round_number + 200][zeile][spalte] = x if x == 0: self.session.vars["ZeroCounter"] = self.session.vars["ZeroCounter"] + 1 # In self.session.vars[self.round_number] wird die Anzahl der Nullen der Tabelle in Runde round_number gespeichert self.session.vars[self.round_number] = self.session.vars["ZeroCounter"] # Die Zuordnung der Gruppen zu den Versuchsgruppen wird einmalig in Runde 1 vollzogen und das ganze Experiment # über nicht verändert. if self.round_number == 1: # Weißt die Teilnehmer:innen zufällig zu den Gruppen zu self.group_randomly() import itertools treatments = itertools.cycle(['Anzahl','Anzahl','Zeit','Zeit','AnzahlPeer','AnzahlPeer','ZeitPeer','ZeitPeer']) # Weist die zufällig gruppierten Gruppen der Reihe nach den Versuchsgruppen (= Treatments) zu # Zu beachten ist, dass beide Gruppenmitglieder:innen der gleichen Versuchsgruppe angehören. for group in self.get_groups(): group.get_player_by_id(1).participant.vars['treatment'] = next(treatments) group.get_player_by_id(2).participant.vars['treatment'] = next(treatments) else: self.group_like_round(1) # Um die Versuchsgruppen nicht nur im Participant Objekt gespeichert zu haben, werden die Versuchsgruppen hier # auch in den von Runde zu Runde verschiedenen Player Objekten gespeichert for group in self.get_groups(): for player in group.get_players(): player.treatment = group.get_player_by_id(1).participant.vars['treatment'] class Group(BaseGroup): None class Player(BasePlayer): # Varaiblen der Nullzählaufgabe treatment = models.StringField() count = models.IntegerField(min=0, label="Wie viele Nullen befinden sich in der Tabelle?") ergebnisAnzahl = models.IntegerField(min=0, max=60, label="Wie viele Tabellen haben Sie richtig gelöst?") ergebnisZeit = models.IntegerField(min=0, max=1800, label="Bitte geben Sie in das Feld die von Ihnen benötigte Zeit (in Sekunden) für das Lösen der Aufgaben ein:") RichtigeZeit = models.FloatField(min=0) treatmentHilfe = models.StringField() is_winner = models.BooleanField() total_rounds_correct = models.IntegerField(initial=0) current_round_correct_answer = models.IntegerField(initial=0) # Methode, die überprüft ob das eingegebene Ergebnis stimmt oder nicht def check_count(self): self.current_round_correct_answer = self.session.vars[self.round_number] print('Runde ', self.round_number, ', Richtige Antwort ist:', self.session.vars[self.round_number]) if self.count == self.session.vars[self.round_number]: self.is_winner = True print("Eingegebenes Ergebnis: ", self.count) print("Eingetragenes Ergebnis ist korrekt!", '\n') else: self.is_winner = False print("Eingegebenes Ergebnis: ", self.count) print("Eingetragenes Ergebnis ist falsch!", '\n') # Methode, die die Anzahl der insgesamt bearbeiteten Runden sowie die Anzahl der korrekt gelösten Runden berechnet def count_correct_rounds(self): if self.round_number == 1: self.participant.vars['AnzahlRunden'] = 1 self.participant.vars["korrekteRunden"] = 0 if self.is_winner: self.participant.vars["korrekteRunden"] = 1 if self.round_number != 1: self.participant.vars['AnzahlRunden'] = self.participant.vars['AnzahlRunden'] + 1 if self.is_winner: self.participant.vars["korrekteRunden"] = self.participant.vars["korrekteRunden"] + 1 # Methode, die die Bezahlung basierend auf der Angabe im Bezahlfeld (ergebnisAnzahl bzw. ergebnisZeit) berechnet def bezahlung(self): if (self.participant.vars['treatment']== "Anzahl") or (self.participant.vars['treatment']== "AnzahlPeer"): self.participant.vars['AngegebeneAnzahl']=self.in_round(self.round_number).ergebnisAnzahl self.participant.vars['Bezahlung']= round(self.in_round(self.round_number).ergebnisAnzahl *0.20,2) if (self.participant.vars['treatment']== "Zeit") or (self.participant.vars['treatment']== "ZeitPeer"): self.participant.vars['AngegebeneZeit'] = self.in_round(Constants.num_rounds).ergebnisZeit self.participant.vars['Bezahlung']= round(self.in_round(Constants.num_rounds).ergebnisZeit*(1/150), 2) # Variablen des Fragebogens alter = models.IntegerField(min=18,max=140, label = '') geschlecht = models.IntegerField(choices=[[0,'Weiblich'],[ 1,'Männlich'], [2,'Divers']],widget=widgets.RadioSelect, label ='') religion = models.StringField(label='') risikoavers = models.IntegerField(widget=widgets.RadioSelectHorizontal, choices=[[0,'0 '],[1, '1 '],[2, '2 '],[3, '3 '],[4, '4 '],[5, '5 '],[6, '6 '],[7, '7 '],[8, '8 '],[9, '9 '],[10, '10 ']],label='') believeBetrug = models.BooleanField(label='') beschäftigung = models.StringField(label='') def religion_choices(self): choices = ['Konfessionslos','Römisch-Katholisch', 'Protestantisch(Evangelisch)','Muslimisch','Orthodox', 'Jüdisch','Buddhistisch','Hinduistisch', 'Baptistisch','Andere'] return choices def beschäftigung_choices(self): choices = ['Student:in','Schüler:in','Auszubildende','Berufstätig','Rentner:in','Sonstige'] return choices # Big Five Persönlichkeitstest def make_q(self): return models.IntegerField(label=self, choices=[1, 2, 3, 4, 5], widget=widgets.RadioSelect) q1 = make_q('bin eher zurückhaltend, reserviert.') q2 = make_q('schenke anderen leicht Vertrauen, glaube an das Gute im Menschen.') q3 = make_q('bin bequem, neige zur Faulheit.') q4 = make_q('bin entspannt, lasse mich durch Stress nicht aus der Ruhe bringen.') q5 = make_q('habe nur wenig künstlerisches Interesse.') q6 = make_q('gehe aus mir heraus, bin gesellig.') q7 = make_q('neige dazu, andere zu kritisieren.') q8 = make_q('erledige Aufgaben gründlich.') q9 = make_q('werde leicht nervös und unsicher.') q10 = make_q('habe eine aktive Vorstellungskraft, bin phantasievoll.') # Die 5 Dimensionen des Big Five Persönlichkeitstests extraversion = models.FloatField() verträglichkeit = models.FloatField() gewissenhaftigkeit = models.FloatField() neurotizismus = models.FloatField() offenheit = models.FloatField() # Benutzerdefinierter Export der Daten (beinhaltet die Daten des Participant Objekts) def custom_export(players): yield ['group_number', 'id_in_group', 'round_number', 'treatment', 'count', 'current_round_correct_answer', 'is_winner', 'AnzahlRunden', 'korrekteRunden', 'TatsächlichDauerZeit', 'AngegebeneZeit', 'AngegebeneAnzahl', 'alter', 'geschlecht', 'religion', 'risikoavers', 'believeBetrug', 'beschäftigung', 'extraversion', 'verträglichkeit', 'gewissenhaftigkeit', 'neurotizismus', 'offenheit', 'participant_code' ] for p in players: yield [p.group.id_in_subsession, p.id_in_group, p.round_number, p.treatment , p.count, p.current_round_correct_answer, p.is_winner, p.participant.vars.get('AnzahlRunden', None), p.participant.vars.get('korrekteRunden', None), p.participant.vars.get('TatsächlichDauerZeit', None), p.participant.vars.get('AngegebeneZeit', None), p.participant.vars.get('AngegebeneAnzahl', None), p.alter, p.geschlecht, p.religion, p.risikoavers, p.believeBetrug, p.beschäftigung, p.extraversion, p.verträglichkeit, p.gewissenhaftigkeit, p.neurotizismus, p.offenheit, p.participant.code ]