from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random author = 'Maxim Ott' doc = """ Experiment for the lecture "Strategische Interaktion" by Prof. Dr. Sandra Ludwig. Penalty shoot. """ class Constants(BaseConstants): name_in_url = 'SI_exp10' players_per_group = None num_rounds = 1 payoff_aufbauen_unternehmer = c(4) payoff_aufbauen_zulieferer = c(3) payoff_option1_unternehmer = c(1) payoff_option1_zulieferer = c(9) payoff_option2_unternehmer = c(5) payoff_option2_zulieferer = c(5) class Subsession(BaseSubsession): def creating_session(self): # self.group_randomly() import itertools roles = itertools.cycle(['Unternehmer', 'Zulieferer']) for p in self.get_players(): p.custom_role = next(roles) print(p.custom_role) # Note: Stupid python list indexing[start=zero, end=exclusive!] # Only needed if this experiment is done as a stand-alone experiment # if self.round_number == 1: # pass def set_payoffs(self): # Filter by role alle_unternehmer = [] alle_zulieferer = [] for p in self.get_players(): if p.custom_role == "Unternehmer": alle_unternehmer.append(p) elif p.custom_role == "Zulieferer": alle_zulieferer.append(p) else: print("This should never happen") # Select two random players unternehmer = random.choice(alle_unternehmer) zulieferer = random.choice(alle_zulieferer) if unternehmer.choice_unternehmer == 1: unternehmer.payoff = Constants.payoff_aufbauen_unternehmer zulieferer.payoff = Constants.payoff_aufbauen_zulieferer else: if zulieferer.choice_zulieferer == 1: unternehmer.payoff = Constants.payoff_option1_unternehmer zulieferer.payoff = Constants.payoff_option1_zulieferer else: unternehmer.payoff = Constants.payoff_option2_unternehmer zulieferer.payoff = Constants.payoff_option2_zulieferer # Save payoffs for live payout self.session.vars['exp10_paying_players_payoff'] = [ unternehmer.payoff, zulieferer.payoff ] self.session.vars['exp10_paying_players_labels'] = [ unternehmer.participant.label, zulieferer.participant.label ] # for player in self.get_players(): # player.participant.vars['exp10_my_choice'] = ('Ja' if player.choice_unternehmer == 1 else 'Nein') if player.role() == 'Unternehmer' else ('Option 1' if player.choice_zulieferer == 1 else 'Option 2') # player.participant.vars['exp10_others_choice'] = ('Ja' if player.choice_unternehmer == 1 else 'Nein') if player.role() == 'Zulieferer' else ('Option 1' if player.choice_zulieferer == 1 else 'Option 2') # player.participant.vars['exp10_my_payoff'] = player.payoff # player.participant.vars['exp10_my_role'] = player.role(), # player.participant.vars['exp10_others_role'] = 'Unternehmer' if player.role() == 'Zulieferer' else 'Zulieferer', # player.participant.vars['exp10_others_payoff'] = self.get_player_by_id(player.id_in_group % 2 + 1).payoff, def vars_for_admin_report(self): # Filter by role alle_unternehmer = [] alle_zulieferer = [] for p in self.get_players(): if p.custom_role == "Unternehmer": alle_unternehmer.append(p) elif p.custom_role == "Zulieferer": alle_zulieferer.append(p) else: print("This should never happen") all_choices_unternehmer = sorted([p.choice_unternehmer for p in alle_unternehmer]) count_unternehmer_y = all_choices_unternehmer.count(1) count_unternehmer_n = all_choices_unternehmer.count(0) choices_unternehmer = [count_unternehmer_y, count_unternehmer_n] all_choices_zulieferer = sorted([p.choice_zulieferer for p in alle_zulieferer]) count_zulieferer_1 = all_choices_zulieferer.count(1) count_zulieferer_2 = all_choices_zulieferer.count(2) choices_zulieferer = [count_zulieferer_1, count_zulieferer_2] return {'choices_unternehmer': [choices_unternehmer[0],100*choices_unternehmer[0]/(count_unternehmer_y+count_unternehmer_n)], 'choices_zulieferer': [choices_zulieferer[0],100*choices_zulieferer[0]/(count_zulieferer_1+count_zulieferer_2)], 'paying_players': [ self.session.vars['exp10_paying_players_labels'][0], self.session.vars['exp10_paying_players_payoff'][0], self.session.vars['exp10_paying_players_labels'][1], self.session.vars['exp10_paying_players_payoff'][1], ] } # {'choices_shooter_ind': choices_shooter_ind, # 'choices_goalie_ind': choices_goalie_ind, # 'choices_shooter_ind_p': [100*item/sum(choices_shooter_ind) for item in choices_shooter_ind], # 'choices_goalie_ind_p': [100*item/sum(choices_goalie_ind) for item in choices_goalie_ind], # } class Group(BaseGroup): pass class Player(BasePlayer): custom_role = models.StringField() choice_unternehmer = models.IntegerField( choices=[ [1, 'Ja'], [0, 'Nein'] ], label = 'Bauen Sie eine Geschäftsbeziehung zu einem weiteren Zulieferer auf?', widget=widgets.RadioSelect ) choice_zulieferer = models.IntegerField( choices=[ [1, 'Option 1'], [2, 'Option 2'] ], label = 'Entscheiden Sie sich für Option 1 oder 2, wenn U zu keinem weiteren Zulieferer eine Geschäftsbeziehung aufbaut?', widget=widgets.RadioSelect ) def role(self): return self.custom_role