from otree.api import * from settings import PARTICIPANT_FIELDS doc = """ Ihre App-Beschreibung """ class C(BaseConstants): NAME_IN_URL = 'Mystery_Word_deutsch' NUM_ROUNDS = 8 PLAYERS_PER_GROUP = 4 MYSTERY_WORDS = ['Raum','Taube', 'Golf', 'Elektrizitaet', 'Leiter', 'Schraube', 'Ende', 'Sombrero'] LANGUAGE_CODE = 'de' STEM_WORDS_1 = ['raum', 'raeum'] STEM_WORDS_2 = ['taub', 'taeub'] STEM_WORDS_3 = ['golf'] STEM_WORDS_4 = ['elektr'] STEM_WORDS_5 = ['leit'] STEM_WORDS_6 = ['schraub'] STEM_WORDS_7 = ['end'] STEM_WORDS_8 = ['sombrero'] STEM_WORDS = [STEM_WORDS_1, STEM_WORDS_2, STEM_WORDS_3, STEM_WORDS_4, STEM_WORDS_5, STEM_WORDS_6, STEM_WORDS_7, STEM_WORDS_8] class Subsession(BaseSubsession): pass class Group(BaseGroup): payoff = models.IntegerField(initial=1000) class Player(BasePlayer): def role(player): if player.round_number % 4 == 1: return {1: 'Ratender', 2: 'Hinweisgebende', 3: 'Hinweisgebende', 4: 'Hinweisgebende'}[player.id_in_group] if player.round_number % 4 == 2: return {1: 'Hinweisgebende', 2: 'Ratender', 3: 'Hinweisgebende', 4: 'Hinweisgebende'}[player.id_in_group] if player.round_number % 4 == 3: return {1: 'Hinweisgebende', 2: 'Hinweisgebende', 3: 'Ratender', 4: 'Hinweisgebende'}[player.id_in_group] if player.round_number % 4 == 0: return {1: 'Hinweisgebende', 2: 'Hinweisgebende', 3: 'Hinweisgebende', 4: 'Ratender'}[player.id_in_group] guess = models.StringField(label="Ihre Vermutung:", initial='') clues = models.StringField(label="Ihr finaler Hinweis:", initial='') score = models.IntegerField() result = models.StringField() incentive = models.IntegerField() known = models.StringField(choices=[['Ja', 'Ja'], ['Nein', 'Nein']], label='1. Kennen Sie das Spiel "Just One"?', widget=widgets.RadioSelect) role_question = models.StringField(choices=[['Hinweisgebende', 'Hinweisgebende'], ['Ratender', 'Ratender']], label='3. In welcher Rolle haben sie sich wohler gefühlt?', widget=widgets.RadioSelect) understanding = models.StringField(choices=[['stimme vollkommen zu', 'stimme vollkommen zu'], ['stimme zu', 'stimme zu'], ['neutral', 'neutral'], ['stimme nicht zu', 'stimme nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='2. "Ich habe die Verfahrensweise und die Regeln schnell verstanden."', widget=widgets.RadioSelectHorizontal) comments = models.LongStringField(label="4. Welche Strategie haben sie als Hinweisgebende verfolgt?", initial='', max_length=500, blank=True) comments_2 = models.LongStringField(label="5. Welche Strategie haben sie als Ratender verfolgt?", initial='', max_length=500, blank=True) freda_1 = models.StringField(choices=[['stimme voll zu', 'stimme voll zu'], ['stimme eher zu', 'stimme eher zu'], ['weder noch', 'weder noch'], ['stimme eher nicht zu', 'stimme eher nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='1. "In meiner Familie werden Werte und Familienrituale über Generationen weitergegeben."', widget=widgets.RadioSelectHorizontal) freda_2 = models.StringField(choices=[['stimme voll zu', 'stimme voll zu'], ['stimme eher zu', 'stimme eher zu'], ['weder noch', 'weder noch'], ['stimme eher nicht zu', 'stimme eher nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='2. "Die Zuneigung und Unterstützung meiner Eltern hängen davon ab, inwiefern ich ihre Erwartungen erfülle."', widget=widgets.RadioSelectHorizontal) freda_3 = models.StringField(choices=[['stimme voll zu', 'stimme voll zu'], ['stimme eher zu', 'stimme eher zu'], ['weder noch', 'weder noch'], ['stimme eher nicht zu', 'stimme eher nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='3. "Ich weiß besser, was gut für mein (künftiges) Kind ist, als mein (künftiges) Kind selbst."', widget=widgets.RadioSelectHorizontal) freda_4 = models.StringField(choices=[['stimme voll zu', 'stimme voll zu'], ['stimme eher zu', 'stimme eher zu'], ['weder noch', 'weder noch'], ['stimme eher nicht zu', 'stimme eher nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='4. "Ich möchte, dass mein (künftiges) Kind wie ich ist, wenn es erwachsen ist."', widget=widgets.RadioSelectHorizontal) freda_5 = models.StringField(choices=[['stimme voll zu', 'stimme voll zu'], ['stimme eher zu', 'stimme eher zu'], ['weder noch', 'weder noch'], ['stimme eher nicht zu', 'stimme eher nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='5. "Es gibt eine gute Übereinstimmung zwischen dem, was mein Job mir bietet, und dem, was ich von einem Job erwarte."', widget=widgets.RadioSelectHorizontal) freda_6 = models.StringField(choices=[['stimme voll zu', 'stimme voll zu'], ['stimme eher zu', 'stimme eher zu'], ['weder noch', 'weder noch'], ['stimme eher nicht zu', 'stimme eher nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='6. "In meinem Job lerne ich häufig dazu, indem ich mich zum Beispiel auf den neuesten Stand bringe oder neue Aufgaben praktisch durchführe (“learning by doing”)."', widget=widgets.RadioSelectHorizontal) freda_7 = models.StringField(choices=[['stimme voll zu', 'stimme voll zu'], ['stimme eher zu', 'stimme eher zu'], ['weder noch', 'weder noch'], ['stimme eher nicht zu', 'stimme eher nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='7. "Meine Eltern gaben mir immer alle Freiheiten."', widget=widgets.RadioSelectHorizontal) freda_8 = models.StringField(choices=[['stimme voll zu', 'stimme voll zu'], ['stimme eher zu', 'stimme eher zu'], ['weder noch', 'weder noch'], ['stimme eher nicht zu', 'stimme eher nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='8. "Ich versuche, meinem (künftigen) Kind so viele Freiheiten zu geben, wie ich von meinen Eltern erhalten habe."', widget=widgets.RadioSelectHorizontal) understand_1 = models.StringField(choices=[['false', 'Die Hinweise werden dem Ratenden gezeigt'], ['true', 'Die Hinweise werden entfernt, bevor der Ratende sie sieht'], ['false', 'Die Hinweise zählen doppelt'],['false', 'Der Gewinn der Gruppe wird verdoppelt']], label='Frage 1: Was passiert, wenn Spielende identische Hinweise geben?', widget=widgets.RadioSelect) understand_2 = models.StringField(choices=[['false', 'Unbegrenzt viele Versuche'],['false', 'Zwei Versuche'],['false', 'Drei Versuche'],['true', 'Nur einen Versuch']], label='Frage 2: Wie viele Versuche hat der Ratende, um das geheime Wort zu erraten?', widget=widgets.RadioSelect) understand_3 = models.StringField(choices=[['false,','Zwei'],['false', 'Drei'],['true', 'Vier'],['false', 'Fünf']], label='Frage 3: Wie viele Spielerinnen und Spieler bilden zusammen eine Gruppe?', widget=widgets.RadioSelect) understand_4 = models.StringField(choices=[['true', '10 Euro fix für die Teilnahme an allen Runden'],['false', '5 Euro fix plus 5 Euro Bonus für die meisten Ideen'],['false', '5 Euro fix plus 5 Euro Bonus für die meisten erratenen geheimen Wörter'],['false','5 Euro fix plus 5 Euro Bonus für die originellsten Hinweise, die zur richtigen Erratung des Wortes führen']], label='Frage 4: Wie viel Geld können Sie maximal in diesem Experiment verdienen?', widget=widgets.RadioSelect) understand_5 = models.StringField(choices=[['false', 'Time'], ['false', 'Zeitpunkt'],['false', 'ist Geld'],['false', 'Zeeeit'],['true', 'keiner der oben genannten Hinweise']], label='Frage 5: Welcher der folgenden Hinweise wäre ein gültiger Hinweis für das geheime Wort "Zeit"?', widget=widgets.RadioSelect) strategy = models.StringField(choices=[['stimme vollkommen zu', 'stimme vollkommen zu'], ['stimme zu', 'stimme zu'], ['neutral', 'neutral'], ['stimme nicht zu', 'stimme nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='6. "Ich habe ständig nur daran gedacht, welche Hinweise meine Mitspielenden abgeben."', widget=widgets.RadioSelectHorizontal) strategy_2 = models.StringField(choices=[['stimme vollkommen zu', 'stimme vollkommen zu'], ['stimme zu', 'stimme zu'], ['neutral', 'neutral'], ['stimme nicht zu', 'stimme nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='7. "Erst möglichst viele Ideen aufzuschreiben, hilft mir dabei, später bessere Hinweise zu geben."', widget=widgets.RadioSelectHorizontal) strategy_3 = models.StringField(choices=[['stimme vollkommen zu', 'stimme vollkommen zu'], ['stimme zu', 'stimme zu'], ['neutral', 'neutral'], ['stimme nicht zu', 'stimme nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='8. "Ich habe versucht, möglichst originelle und einzigartige Hinweise zu geben, damit ich keine identischen Hinweise wie meine Mitspielenden abgebe."', widget=widgets.RadioSelectHorizontal) strategy_4 = models.StringField(choices=[['stimme vollkommen zu', 'stimme vollkommen zu'], ['stimme zu', 'stimme zu'], ['neutral', 'neutral'], ['stimme nicht zu', 'stimme nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='9. "Ich habe versucht, eindeutige und naheliegende Hinweise zu geben, auch auf die Gefahr hin, dass meine Mitspielenden identische Hinweise abgeben."', widget=widgets.RadioSelectHorizontal) strategy_5 = models.StringField(choices=[['stimme vollkommen zu', 'stimme vollkommen zu'], ['stimme zu', 'stimme zu'], ['neutral', 'neutral'], ['stimme nicht zu', 'stimme nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='10. "Ein Wettkampf mit anderen Gruppen würde mich motivieren, möglichst gute Hinweise zu geben und das geheime Wort zu erraten."', widget=widgets.RadioSelectHorizontal) strategy_6 = models.StringField(choices=[['stimme vollkommen zu', 'stimme vollkommen zu'], ['stimme zu', 'stimme zu'], ['neutral', 'neutral'], ['stimme nicht zu', 'stimme nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='11. "Eine Bonuszahlung geknüpft an unsere Gruppenperformance würde mich motivieren, möglichst gute Hinweise zu geben und das geheime Wort zu erraten."', widget=widgets.RadioSelectHorizontal) individualism_1 = models.IntegerField(choices=[-3, -2, -1, 0, 1, 2, 3], widget=widgets.RadioSelect) individualism_2 = models.IntegerField(choices=[-3, -2, -1, 0, 1, 2, 3], widget=widgets.RadioSelect) individualism_3 = models.IntegerField(choices=[-3, -2, -1, 0, 1, 2, 3], widget=widgets.RadioSelect) individualism_4 = models.IntegerField(choices=[-3, -2, -1, 0, 1, 2, 3], widget=widgets.RadioSelect) individualism_5 = models.IntegerField(choices=[-3, -2, -1, 0, 1, 2, 3], widget=widgets.RadioSelect) future_1 = models.StringField(choices=[['mindestens einmal täglich', 'mindestens einmal täglich'], ['mindestens einmal wöchentlich', 'mindestens einmal wöchentlich'], ['mindestens einmal monatlich', 'mindestens einmal monatlich'], ['seltener als einmal im Monat', 'seltener als einmal im Monat']], label='6. Wie oft denken Sie darüber nach, wie der Klimawandel Ihre persönliche Zukunft beeinflusst?', widget=widgets.RadioSelect) future_2 = models.StringField(choices=[['mindestens einmal täglich', 'mindestens einmal täglich'], ['mindestens einmal wöchentlich', 'mindestens einmal wöchentlich'], ['mindestens einmal monatlich', 'mindestens einmal monatlich'], ['seltener als einmal im Monat', 'seltener als einmal im Monat']], label='7. Wie oft denken Sie darüber nach, wie der Klimawandel die Zukunft der Gesellschaft beeinflusst?', widget=widgets.RadioSelect) Idea1 = models.StringField(label= '', initial='', blank=True) Idea2 = models.StringField(label= '', initial='', blank=True) Idea3 = models.StringField(label= '', initial='', blank=True) Idea4 = models.StringField(label= '', initial='', blank=True) Idea5 = models.StringField(label= '', initial='', blank=True) Idea6 = models.StringField(label= '', initial='', blank=True) Idea7 = models.StringField(label= '', initial='', blank=True) Idea8 = models.StringField(label= '', initial='', blank=True) Idea9 = models.StringField(label= '', initial='', blank=True) Idea10 = models.StringField(label= '', initial='', blank=True) word1 = models.StringField(label= '', initial='', blank=False) word2 = models.StringField(label= '', initial='', blank=False) word3 = models.StringField(label= '', initial='', blank=False) word4 = models.StringField(label= '', initial='', blank=False) word5 = models.StringField(label= '', initial='', blank=False) word6 = models.StringField(label= '', initial='', blank=False) word7 = models.StringField(label= '', initial='', blank=False) word8 = models.StringField(label= '', initial='', blank=False) word9 = models.StringField(label= '', initial='', blank=False) word10 = models.StringField(label= '', initial='', blank=False) gender = models.IntegerField(choices=[[1, 'Männlich'],[2, 'Weiblich'],[3, 'Divers'],], label='Geschlecht:') age = models.IntegerField(min=18, max=100, label='Alter:') study = models.StringField(choices=[['Geisteswissenschaften', 'Geisteswissenschaften'],['Sport', 'Sport'],['Rechts-, Wirtschafts- und Sozialwissenschaften', 'Rechts-, Wirtschafts- und Sozialwissenschaften'],['Mathematik, Naturwissenschaften', 'Mathematik, Naturwissenschaften'],['Humanmedizin, Gesundheitswissenschaften', 'Humanmedizin, Gesundheitswissenschaften'],['Agrar-, Forst- und Ernährungswissenschaften, Veterinärmedizin', 'Agrar-, Forst- und Ernährungswissenschaften, Veterinärmedizin'], ['Ingenieurwissenschaften', 'Ingenieurwissenschaften'],['Kunst, Kunstwissenschaft', 'Kunst, Kunstwissenschaft'],['Sonstiges', 'Sonstiges'],], label='Studienbereich:', widget=widgets.RadioSelect) identical = models.BooleanField() invalid = models.BooleanField() missing = models.BooleanField() guess_missing = models.BooleanField() quantity = models.IntegerField() invalid_DAT = models.BooleanField def creating_session(subsession: Subsession): session = subsession.session for player in subsession.get_players(): participant = player.participant participant.vars['treatment'] = session.config['treatment'] player.incentive = participant.vars['treatment'] # PAGES class GroupWaitPage(WaitPage): template_name = 'justone_deutsch/GroupWaitPage.html' group_by_arrival_time = True def is_displayed(player): return player.round_number == 1 class Introduction(Page): def is_displayed(player): return player.round_number == 1 class Intro(Page): timeout_seconds = 150 def is_displayed(player): return player.round_number == 1 class Intro2(Page): timeout_seconds = 150 def is_displayed(player): return player.round_number == 1 class Rules(Page): timeout_seconds = 90 def is_displayed(player): return player.round_number == 1 class DAT(Page): timeout_seconds = 300 def is_displayed(player): return player.round_number == C.NUM_ROUNDS form_model = 'player' form_fields = ['word1', 'word2', 'word3', 'word4', 'word5', 'word6', 'word7', 'word8', 'word9', 'word10', 'gender', 'age', 'study'] def before_next_page(player, timeout_happened): if timeout_happened: player.invalid_DAT = True return player.invalid_DAT else: player.invalid_DAT = False return player.invalid_DAT class Instructions(Page): timeout_seconds = 150 def is_displayed(player): return player.round_number == 1 class Instructions_2(Page): timeout_seconds = 150 def is_displayed(player): return player.round_number == 1 class Round(Page): timeout_seconds = 30 def vars_for_template(player): round_number = player.round_number remaining_rounds = C.NUM_ROUNDS - round_number group = player.group # get payoff from last round if round_number > 1: group.payoff = group.in_round(round_number - 1).payoff return dict(round_number = round_number, remaining_rounds = remaining_rounds) class Clue_Page(Page): timeout_seconds = 210 def is_displayed(player): return player.role() == 'Hinweisgebende' form_model = 'player' form_fields = ['clues', 'Idea1', 'Idea2', 'Idea3', 'Idea4', 'Idea5', 'Idea6', 'Idea7', 'Idea8', 'Idea9', 'Idea10'] def vars_for_template(player): mystery_word = C.MYSTERY_WORDS[player.round_number - 1] return dict(mystery_word = mystery_word) def before_next_page(player, timeout_happened): if timeout_happened: player.clues = 'Kein Hinweis gegeben' else: player.clues = player.clues.lower() return player.clues def wordlength(player, value): value = value.lower() if len(value) > 18: return True def clues_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def Idea1_error_message(player, value): if wordlength(player, value) == True: return 'Ihre Idee darf nicht länger als 18 Zeichen sein!' def Idea2_error_message(player, value): if wordlength(player, value) == True: return 'Ihre Idee darf nicht länger als 18 Zeichen sein!' def Idea3_error_message(player, value): if wordlength(player, value) == True: return 'Ihre Idee darf nicht länger als 18 Zeichen sein!' def Idea4_error_message(player, value): if wordlength(player, value) == True: return 'Ihre Idee darf nicht länger als 18 Zeichen sein!' def Idea5_error_message(player, value): if wordlength(player, value) == True: return 'Ihre Idee darf nicht länger als 18 Zeichen sein!' def Idea6_error_message(player, value): if wordlength(player, value) == True: return 'Ihre Idee darf nicht länger als 18 Zeichen sein!' def Idea7_error_message(player, value): if wordlength(player, value) == True: return 'Ihre Idee darf nicht länger als 18 Zeichen sein!' def Idea8_error_message(player, value): if wordlength(player, value) == True: return 'Ihre Idee darf nicht länger als 18 Zeichen sein!' def Idea9_error_message(player, value): if wordlength(player, value) == True: return 'Ihre Idee darf nicht länger als 18 Zeichen sein!' def Idea10_error_message(player, value): if wordlength(player, value) == True: return 'Ihre Idee darf nicht länger als 18 Zeichen sein!' class CluegiverWaitPage(WaitPage): title_text = "Vielen Dank für Ihren Hinweis!" body_text = "Bitte warten Sie, bis alle ihre Hinweise abgegeben haben und diese dem Ratenden angezeigt werden." def is_displayed(player): return player.role() == 'Hinweisgebende' class GuesserWaitPage(WaitPage): title_text = "Sie können Ihren Tipp bald abgeben" body_text = "Bitte warten Sie, bis die anderen Spielenden ihre Hinweise für Sie abgegeben haben. Dies kann ein paar Minuten dauern." def is_displayed(player): return player.role() == 'Ratender' class ResultsWaitPage(WaitPage): title_text = "Ihre Gruppe ist fertig!" body_text = "Bitte warten Sie, bis alle Gruppen ihre Hinweise und Tipps abgegeben haben." wait_for_all_groups = True class Guess_Page(Page): timeout_seconds = 120 def is_displayed(player): return player.role() == 'Ratender' def vars_for_template(player): mystery_word = C.MYSTERY_WORDS[player.round_number - 1] mystery_word = mystery_word.lower() stem_words = C.STEM_WORDS[player.round_number - 1] clues_group = [p.clues for p in player.get_others_in_group()] special_char_map = {ord('ä'):'ae', ord('ü'):'ue', ord('ö'):'oe', ord('ß'):'ss'} clues_group[0] = clues_group[0].translate(special_char_map) clues_group[1] = clues_group[1].translate(special_char_map) clues_group[2] = clues_group[2].translate(special_char_map) if (clues_group[0] in clues_group[1] or clues_group[1] in clues_group[0]) and (clues_group[0] in clues_group[2] or clues_group[2] in clues_group[0]) and (clues_group[1] in clues_group[2] or clues_group[2] in clues_group[1]): clues_group[0] = 'Identischer Hinweis' clues_group[1] = 'Identischer Hinweis' clues_group[2] = 'Identischer Hinweis' if clues_group[0] in clues_group[1] or clues_group[1] in clues_group[0]: clues_group[0] = 'Identischer Hinweis' clues_group[1] = 'Identischer Hinweis' if clues_group[0] in clues_group[2] or clues_group[2] in clues_group[0]: clues_group[0] = 'Identischer Hinweis' clues_group[2] = 'Identischer Hinweis' if clues_group[1] in clues_group[2] or clues_group[2] in clues_group[1]: clues_group[1] = 'Identischer Hinweis' clues_group[2] = 'Identischer Hinweis' if ' ' in clues_group[0] and clues_group[0] != 'Identischer Hinweis' and clues_group[0] != 'Kein Hinweis gegeben': more = clues_group[0].split() if len(more)>1: clues_group[0] = 'Ungültiger Hinweis' if ' ' in clues_group[1] and clues_group[1] != 'Identischer Hinweis' and clues_group[1] != 'Kein Hinweis gegeben': more = clues_group[1].split() if len(more)>1: clues_group[1] = 'Ungültiger Hinweis' if ' ' in clues_group[2] and clues_group[2] != 'Identischer Hinweis' and clues_group[2] != 'Kein Hinweis gegeben': more = clues_group[2].split() if len(more)>1: clues_group[2] = 'Ungültiger Hinweis' import re if re.search("[^a-zA-Z0-9s]", clues_group[0]) and clues_group[0] != 'Identischer Hinweis' and clues_group[0] != 'Kein Hinweis gegeben': clues_group[0] = 'Ungültiger Hinweis' if re.search("[^a-zA-Z0-9s]", clues_group[1]) and clues_group[1] != 'Identischer Hinweis' and clues_group[1] != 'Kein Hinweis gegeben': clues_group[1] = 'Ungültiger Hinweis' if re.search("[^a-zA-Z0-9s]", clues_group[2]) and clues_group[2] != 'Identischer Hinweis' and clues_group[2] != 'Kein Hinweis gegeben': clues_group[2] = 'Ungültiger Hinweis' for i in range(len(stem_words)): if stem_words[i] in clues_group[0] or clues_group[0] in stem_words[i]: clues_group[0] = 'Ungültiger Hinweis' if stem_words[i] in clues_group[1] or clues_group[1] in stem_words[i]: clues_group[1] = 'Ungültiger Hinweis' if stem_words[i] in clues_group[2] or clues_group[2] in stem_words[i]: clues_group[2] = 'Ungültiger Hinweis' def num_there(s): return any(i.isdigit() for i in s) if num_there(clues_group[0]) == True: clues_group[0] = 'Ungültiger Hinweis' if num_there(clues_group[1]) == True: clues_group[1] = 'Ungültiger Hinweis' if num_there(clues_group[2]) == True: clues_group[2] = 'Ungültiger Hinweis' with open("wordlist-german.txt", 'r') as file: text = file.read() wordlist= text.split() if clues_group[0] != 'Identischer Hinweis' and clues_group[0] != 'Kein Hinweis gegeben': if clues_group[0] not in wordlist: clues_group[0] = 'Ungültiger Hinweis' if clues_group[1] != 'Identischer Hinweis' and clues_group[1] != 'Kein Hinweis gegeben': if clues_group[1] not in wordlist: clues_group[1] = 'Ungültiger Hinweis' if clues_group[2] != 'Identischer Hinweis' and clues_group[2] != 'Kein Hinweis gegeben': if clues_group[2] not in wordlist: clues_group[2] = 'Ungültiger Hinweis' return dict(clues = clues_group) form_model = 'player' form_fields = ['guess'] def before_next_page(player, timeout_happened): if timeout_happened: player.guess = 'Kein Tipp gegeben' else: player.guess = player.guess.lower() special_char_map = {ord('ä'):'ae', ord('ü'):'ue', ord('ö'):'oe', ord('ß'):'ss'} player.guess = player.guess.translate(special_char_map) return player.guess class Results(Page): timeout_seconds = 45 def vars_for_template(player): mystery_word = C.MYSTERY_WORDS[player.round_number - 1] mystery_word = mystery_word.lower() stem_words = C.STEM_WORDS[player.round_number - 1] if player.role() == 'Hinweisgebende': own_clue = player.clues special_char_map = {ord('ä'):'ae', ord('ü'):'ue', ord('ö'):'oe', ord('ß'):'ss'} own_clue = own_clue.translate(special_char_map) clues = [p.clues for p in player.get_others_in_group()] guess = [p.guess for p in player.get_others_in_group()] while '' in clues: clues.remove('') while '' in guess: guess.remove('') guess = guess[0] player.missing = False player.guess_missing = False player.identical = False player.invalid = False identical = '' invalid = '' missing = '' guess_missing = '' if own_clue == 'Kein Hinweis gegeben': player.missing = True missing = 'Achtung! Sie haben keinen Hinweis gegeben.' else: if own_clue in clues[0] or clues[0] in own_clue or own_clue in clues[1] or clues[1] in own_clue: player.identical = True identical = 'Achtung! Sie haben einen identischen Hinweis gegeben.' for i in range(len(stem_words)): if own_clue in stem_words[i] or stem_words[i] in own_clue: player.invalid = True invalid = 'Achtung! Ihr Hinweis war ungültig (gleiche Wortfamilie wie das geheimnisvolle Wort).' if ' ' in own_clue and player.invalid == False: more = own_clue.split() if len(more)>1: player.invalid = True invalid = 'Achtung! Ihr Hinweis war ungültig (mehr als ein Wort).' import re if re.search("[^a-zA-Z0-9s]", own_clue) and player.invalid == False: player.invalid = True invalid = 'Achtung! Ihr Hinweis war ungültig (Verwendung von Sonderzeichen).' def num_there(s): return any(i.isdigit() for i in s) if num_there(own_clue) == True and player.invalid == False: player.invalid = True invalid = 'Achtung! Ihr Hinweis war ungültig (Verwendung von Zahlen).' with open("wordlist-german.txt", 'r') as file: text = file.read() wordlist= text.split() if own_clue not in wordlist and player.invalid == False: player.invalid = True invalid = 'Achtung! Ihr Hinweis war ungültig (Rechtschreibfehler oder kein echtes Wort).' clues.append(own_clue) player.Idea1 = player.Idea1.lower() player.Idea2 = player.Idea2.lower() player.Idea3 = player.Idea3.lower() player.Idea4 = player.Idea4.lower() player.Idea5 = player.Idea5.lower() player.Idea6 = player.Idea6.lower() player.Idea7 = player.Idea7.lower() player.Idea8 = player.Idea8.lower() player.Idea9 = player.Idea9.lower() player.Idea10 = player.Idea10.lower() own_ideas = [player.Idea1, player.Idea2, player.Idea3, player.Idea4, player.Idea5, player.Idea6, player.Idea7, player.Idea8, player.Idea9, player.Idea10] while '' in own_ideas: own_ideas.remove('') if len(own_ideas) > 0: for i in range(len(own_ideas)): special_char_map = {ord('ä'):'ae', ord('ü'):'ue', ord('ö'):'oe', ord('ß'):'ss'} own_ideas[i] = own_ideas[i].translate(special_char_map) if ' ' in own_ideas[i]: more = own_ideas[i].split() if len(more)>1: own_ideas[i] = 'false' if len(own_ideas) > 0: for i in range(len(own_ideas)): for j in range(len(stem_words)): if own_ideas[i] in stem_words[j] or stem_words[j] in own_ideas[i]: own_ideas[i] = 'false' with open("wordlist-german.txt", 'r') as file: text = file.read() wordlist= text.split() if len(own_ideas) > 0: for i in range(len(own_ideas)): if own_ideas[i] not in wordlist: own_ideas[i] = 'false' import re if len(own_ideas) > 0: for i in range(len(own_ideas)): if re.search("[^a-zA-Z0-9s]", own_ideas[i]): own_ideas[i] = 'false' def has_numbers(s): return bool(re.search(r'\d',s)) if len(own_ideas) > 0: for i in range(len(own_ideas)): if has_numbers(own_ideas[i]) == True: own_ideas[i] = 'false' while 'false' in own_ideas: own_ideas.remove('false') own_ideas = list(dict.fromkeys(own_ideas)) player.quantity = len(own_ideas) if player.role() == 'Ratender': player.missing = False player.identical = False player.invalid = False player.quantity = 0 player.guess_missing = False identical = '' invalid = '' missing = '' guess_missing = '' guess = player.guess clues = [p.clues for p in player.get_others_in_group()] if guess == 'Kein Tipp gegeben': player.guess_missing = True guess_missing = 'Achtung! Sie haben keinen Tipp abgegeben.' if mystery_word == guess: player.result = 'richtig' player.payoff = 1 else: player.result = 'falsch' player.payoff = 0 player.score = int(player.participant.payoff) player.group.payoff = player.score if player.participant.treatment == 1: player.group.payoff = 1000 return dict(mystery_word = mystery_word, clues = clues, guess = guess, result = player.result, identical = identical, invalid = invalid, missing = missing, guess_missing = guess_missing, number_ideas = player.quantity) def score(group: Group): subsession = group.subsession groups = subsession.get_groups() overall_score = [] for group in groups: overall_score.append(group.payoff) if group.payoff == 1000: overall_score.remove(1000) sorted_overall_score = sorted(overall_score, reverse = True) return sorted_overall_score class Score(Page): timeout_seconds = 30 def is_displayed(player): return player.participant.treatment == 3 def vars_for_template(player): player.score = int(player.participant.payoff) overall_score = score(player.group) rank = 0 if player.score == overall_score[0]: rank = 1 if player.score == overall_score[1] and player.score != overall_score[0]: rank = 2 if len(overall_score) > 2: if player.score == overall_score[2] and player.score != overall_score[0] and player.score != overall_score[1]: rank = 3 if len(overall_score) > 3: if player.score == overall_score[3] and player.score != overall_score[0] and player.score != overall_score[1] and player.score != overall_score[2]: rank = 4 if len(overall_score) > 4: if player.score == overall_score[4] and player.score != overall_score[0] and player.score != overall_score[1] and player.score != overall_score[2] and player.score != overall_score[3]: rank = 5 number_groups = len(overall_score) return dict(overall_score = overall_score, score = player.score, rank = rank, number_groups = number_groups) class TestQuestions(Page): template_name = 'justone_deutsch/TestQuestions.html' timeout_seconds = 270 def is_displayed(player): return player.round_number == C.NUM_ROUNDS form_model = 'player' form_fields = ['known', 'understanding', 'role_question', 'comments', 'comments_2', 'strategy', 'strategy_2', 'strategy_3', 'strategy_4', 'strategy_5', 'strategy_6'] class FredaQuestions(Page): template_name = 'justone_deutsch/FredaQuestions.html' timeout_seconds = 150 def is_displayed(player): return player.round_number == C.NUM_ROUNDS form_model = 'player' form_fields = ['freda_1', 'freda_2', 'freda_3', 'freda_4', 'freda_5', 'freda_6', 'freda_7', 'freda_8'] class IndividualismQuestions(Page): template_name = 'justone_deutsch/IndividualismQuestions.html' timeout_seconds = 150 def is_displayed(player): return player.round_number == C.NUM_ROUNDS form_model = 'player' form_fields = ['individualism_1', 'individualism_2', 'individualism_3', 'individualism_4', 'individualism_5', 'future_1', 'future_2'] class UnderstandPage(Page): template_name = 'justone_deutsch/UnderstandPage.html' timeout_seconds = 150 def is_displayed(player): return player.round_number == 1 form_model = 'player' form_fields = ['understand_1', 'understand_2', 'understand_3', 'understand_4', 'understand_5'] def error_message(player, values): if values['understand_1'] == 'false': return 'Falsche Antwort bei Frage 1! Versuchen Sie es noch einmal.' if values['understand_2'] == 'false': return 'Falsche Antwort bei Frage 2! Versuchen Sie es noch einmal.' if values['understand_3'] == 'false': return 'Falsche Antwort bei Frage 3! Versuchen Sie es noch einmal.' if values['understand_4'] == 'false': return 'Falsche Antwort bei Frage 4! Versuchen Sie es noch einmal.' if values['understand_5'] == 'false': return 'Falsche Antwort bei Frage 5! Versuchen Sie es noch einmal.' class FinalPage(Page): def is_displayed(player): return player.round_number == C.NUM_ROUNDS page_sequence = [GroupWaitPage, Intro, Intro2, Rules, Instructions, Instructions_2, UnderstandPage, Round, Clue_Page, GuesserWaitPage, Guess_Page, CluegiverWaitPage, ResultsWaitPage, Results, Score, TestQuestions, FredaQuestions, IndividualismQuestions, DAT, FinalPage]