from otree.api import Currency as c, currency_range from . import pages from ._builtin import Bot from .models import Constants from otree.api import expect, SubmissionMustFail, Submission import random class PlayerBot(Bot): # case1: uneven group numbers -> too many get kicked out # case2: player C does not make choice # case3: player B does not make choice # case4: not enough (<5) means, because uneven participant numbers, because player C/B did not make choice # case5: player does not make guessing choice def play_round(self): p = self.player pid = p.id_in_group bools = [False, False, False, False, True, False, False, False] no_choice = random.choice(bools) no_guess = random.choice(bools) if not p.is_redundant: yield pages.Hinweise yield pages.Aufgabe1 if pid == 1: yield pages.EntscheidungA elif pid == 2: if no_choice: print("\nPLAYER B ", self.player.id_in_subsession, "MADE NO CHOICE\n") yield Submission(pages.EntscheidungB, timeout_happened=True) yield pages.Abbrecher elif p.session.config['name'] == 'algorithm2': yield pages.EntscheidungB, dict(takeb=Constants.take_choices[random.randint(0, 10)][0]) elif p.session.config['name'] == 'algorithm3': yield pages.EntscheidungB, dict(take=Constants.take_choices[random.randint(0, 10)][0]) elif p.session.config['name'] == 'algorithm1': yield pages.EntscheidungB, dict(takeb1=Constants.take_choices[random.randint(0, 1)][0], takeb2=Constants.take_choices[random.randint(0, 2)][0], takeb3=Constants.take_choices[random.randint(0, 3)][0], takeb4=Constants.take_choices[random.randint(0, 4)][0], takeb5=Constants.take_choices[random.randint(0, 5)][0], takeb6=Constants.take_choices[random.randint(0, 6)][0], takeb7=Constants.take_choices[random.randint(0, 7)][0], takeb8=Constants.take_choices[random.randint(0, 8)][0], takeb9=Constants.take_choices[random.randint(0, 9)][0], takeb10=Constants.take_choices[random.randint(0, 10)][0]) expect(p.ecu1, '!=', None) if not self.group.hasDropout: yield pages.Aufgabe2 if no_guess: print("\nPLAYER ", self.player.id_in_subsession, "MADE NO GUESS\n") yield Submission(pages.Schaetzung, timeout_happened=True) expect(self.player.isDropout, True) expect(self.group.hasDropout, True) expect(self.player.guess, None) yield pages.Abbrecher else: yield pages.Schaetzung, dict(guess=random.uniform(0, 10)) expect(p.ecu1, '!=', None) nr_takes = self.nr_takes(self.player.session.config['name']) if nr_takes < 5 or self.group.hasDropout: yield pages.Opfer else: yield pages.Fragen yield pages.Fragen0, dict(birthyear=random.randint(1940, 2010), gender=Constants.gender[random.randint(0, 2)][0], isStudent=random.choice([True, False])) if self.player.isStudent: yield pages.Fragen1, dict(school="TUM", enrolled=random.randint(2005, 2021)) else: yield pages.Fragen1, dict(job=Constants.jobs[random.randint(0, 4)][0]) yield pages.Fragen2, dict(test=random.randint(0, 10)) yield pages.Anmerkungen, dict(comment="comment") expect('None', 'not in', self.html) yield pages.Verguetung elif self.player.isDropout: yield pages.Abbrecher elif self.group.hasDropout: yield pages.Opfer else: yield pages.Ueberfluessige def nr_takes(self, treatment): counter = 0 for g in self.player.subsession.get_groups(): if treatment == 'algorithm1': take = g.takeb10 elif treatment == 'algorithm2': take = g.takeb elif treatment == 'algorithm3': take = g.take else: take = None if g != self.group and take is not None and not g.is_redundant(): counter += 1 print("Anzahl gültiger Takes von B für Gruppe", self.player.group.id_in_subsession, ": ", counter) return counter