from otree.api import * import random from datetime import datetime doc = """ Live volunteer's dilemma (first player to click moves everyone forward). """ class C(BaseConstants): NAME_IN_URL = 'Dilemmaspel_demo' PLAYERS_PER_GROUP = None REWARD = cu(100) VOLUNTEER_COST = cu(20) NUM_ROUNDS = 2 TIMEOUT= 60 MIN_EARNINGS = cu(60) VOLUNTEER_REWARD= REWARD - VOLUNTEER_COST standard_group_size = 3 bot_probability = 0.1 class Subsession(BaseSubsession): # Här delas gruppen in i 2 män och en kvinna. Går att ändra så det blir error vid färre män. def creating_session(self): pass class Group(BaseGroup): has_volunteer = models.BooleanField(initial=False) class Player(BasePlayer): is_volunteer = models.BooleanField(initial=False) volunteer_id = models.IntegerField() age = models.IntegerField(label="Ålder",choices=range(18,65,1)) gender = models.CharField(label="Kön", choices = ["Man", "Kvinna"], widget = widgets.RadioSelect ) is_male = models.BooleanField(initial=False) if gender == 'Kvinna': is_male = False elif gender=='Man': is_male=True tel = models.IntegerField(label="Telefonnummer", blank=True) start_time_on_page = models.IntegerField(initial=0) # PAGES class PlayersInfo(Page): @staticmethod def is_displayed(self): if self.round_number == 1: return True else: prev = self.in_previous_rounds()[-1] self.age = prev.age self.gender = prev.gender self.tel = prev.field_maybe_none("tel") return False form_model='player' form_fields=['gender','age'] class MyPage(Page): timeout_seconds = C.TIMEOUT timer_text = 'Tid kvar för att göra ditt val' @staticmethod def is_displayed(player: Player): group = player.group return not group.has_volunteer @staticmethod def live_method(player: Player, data): group = player.group if data.get('volunteer'): print("DATA.GET(VOLUNTEER)") group.has_volunteer = True # mark all other players as non-volunteers for p in player.get_others_in_group(): p.payoff = C.REWARD p.is_volunteer = False # mark myself as a volunteer player.is_volunteer = True player.payoff = C.REWARD - C.VOLUNTEER_COST # broadcast to the group that the game is finished. return {0: dict(finished=True)} else: for p in group.get_players(): p.payoff = C.MIN_EARNINGS if data.get("time"): if len(group.get_players()) < C.standard_group_size: print(f"less3: {player.start_time_on_page}") if player.start_time_on_page == 0: player.start_time_on_page = data.get("time") print(f"start: {player.start_time_on_page}") else: print(data.get("time") - player.start_time_on_page) if data.get("time") - player.start_time_on_page > 5000: p = random.random() if p < (C.standard_group_size - len(group.get_players()))*C.bot_probability: group.has_volunteer = True for p in group.get_players(): p.payoff = C.REWARD p.is_volunteer = False return {0: dict(finished=True)} def vars_for_template(self): return { "group_len": len(self.group.get_players()) } form_fields=['timeSpent'] class CustomWaitPage(WaitPage): body_text = "Inväntar andra deltagare" class Results(Page): pass class Introduction(Page): @staticmethod def is_displayed(self): return self.round_number == 1 class Decision(Page): @staticmethod def is_displayed(self): return self.round_number == 1 class Earnings(Page): def is_displayed(self): if self.round_number == 1: return True else: return False class ShuffleWaitPage(WaitPage): wait_for_all_groups = True body_text = "Inväntar andra deltagare" def after_all_players_arrive(self): print("ShuffleWaitPage") players = self.subsession.get_players() print(f"Alla: {players}") M_players=[p for p in players if p.gender == 'Man'] F_players=[p for p in players if p.gender == 'Kvinna'] random.shuffle(M_players) random.shuffle(F_players) group_matrix = [] new_group = [] while F_players: new_group.append(F_players.pop()) if len(M_players) >= C.standard_group_size-1: new_group.append(M_players.pop()) new_group.append(M_players.pop()) elif M_players: new_group.append(M_players.pop()) group_matrix.append(new_group) new_group = [] while len(M_players) >= 1: new_group.append(M_players.pop()) if len(new_group) == C.standard_group_size: group_matrix.append(new_group) new_group = [] if len(new_group) > 0: group_matrix.append(new_group) self.subsession.set_group_matrix(group_matrix) class secondintro(Page): pass def is_notfemale(self): if self.gender == "Kvinna": print("Albert och Lasse") else: print("Albert och Maggie") class finalpage(Page): pass class seconddes(Page): pass page_sequence = [PlayersInfo, Introduction, Decision, Earnings, ShuffleWaitPage, MyPage,CustomWaitPage,Results,seconddes, secondintro, ShuffleWaitPage, MyPage,CustomWaitPage,Results, finalpage]