from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random from operator import itemgetter, attrgetter author = 'Maxim Ott' doc = """ Experiment for the lecture "Strategische Interaktion" by Prof. Dr. Sandra Ludwig. Ultimatum game, simple strategy. """ class Constants(BaseConstants): name_in_url = 'SI_exp11' players_per_group = None num_rounds = 1 pot = c(10) class Subsession(BaseSubsession): def creating_session(self): # self.group_randomly() import itertools roles = itertools.cycle(['Spieler1', 'Spieler2']) 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 # print('in creating_session: SI_exp01') # if self.round_number == 1: # self.session.vars['exp11_paying_players'] = random.sample(range(0,self.session.num_participants,1), 2) def set_payoffs(self): # Filter by role alle_spieler1 = [] alle_spieler2 = [] for p in self.get_players(): if p.custom_role == "Spieler1": alle_spieler1.append(p) elif p.custom_role == "Spieler2": alle_spieler2.append(p) else: print("This should never happen") # Select two random players spieler1 = random.choice(alle_spieler1) # Legt Schwelle fest spieler2 = random.choice(alle_spieler2) # Macht Angebot if spieler2.choice >= spieler1.choice: spieler1.payoff = spieler2.choice spieler2.payoff = Constants.pot - spieler2.choice else: spieler1.payoff = spieler2.payoff = c(0) # Save payoffs for live payout self.session.vars['exp11_paying_players_payoff'] = [ spieler1.payoff, spieler2.payoff ] self.session.vars['exp11_paying_players_labels'] = [ spieler1.participant.label, spieler2.participant.label ] # for player in self.get_players(): # player.participant.vars['exp11_my_choice'] = player.choice # player.participant.vars['exp11_others_choice'] = self.get_player_by_id(player.id_in_group % 2 + 1).choice # player.participant.vars['exp11_my_payoff'] = player.payoff # player.participant.vars['exp11_my_role'] = player.role(), # player.participant.vars['exp11_others_role'] = 'Spieler1' if player.role() == 'Spieler2' else 'Spieler1', # player.participant.vars['exp11_others_payoff'] = self.get_player_by_id(player.id_in_group % 2 + 1).payoff, def vars_for_admin_report(self): # Filter by role alle_spieler1 = [] alle_spieler2 = [] for p in self.get_players(): if p.custom_role == "Spieler1": alle_spieler1.append(p) elif p.custom_role == "Spieler2": alle_spieler2.append(p) else: print("This should never happen") all_choices_spieler1_ind = sorted([s.choice for s in alle_spieler1]) all_choices_spieler2_ind = sorted([g.choice for g in alle_spieler2]) all_choices_schwelle = all_choices_spieler1_ind all_choices_angebot = all_choices_spieler2_ind all_schwellen_tab = [] for choice in all_choices_schwelle: count = all_choices_schwelle.count(choice) all_schwellen_tab.append([choice,count]) all_schwellen_tab = [list(t) for t in set(map(tuple, all_schwellen_tab))] all_schwellen_tab = sorted(all_schwellen_tab,key=itemgetter(1),reverse=True) all_schwellen_tab = sorted(all_schwellen_tab,key=itemgetter(0),reverse=True) schwellen_amounts = [str(item[0]) for item in all_schwellen_tab] schwellen_counts = [item[1] for item in all_schwellen_tab] print('Alle Schwellen:') print(all_schwellen_tab) all_angebote_tab = [] for choice in all_choices_angebot: count = all_choices_angebot.count(choice) all_angebote_tab.append([choice,count]) all_angebote_tab = [list(t) for t in set(map(tuple, all_angebote_tab))] all_angebote_tab = sorted(all_angebote_tab,key=itemgetter(1),reverse=True) all_angebote_tab = sorted(all_angebote_tab,key=itemgetter(0),reverse=True) angebote_amounts = [str(item[0]) for item in all_angebote_tab] angebote_counts = [item[1] for item in all_angebote_tab] print('Alle Angebote:') print(all_angebote_tab) return {'all_schwellen_tab': str(all_schwellen_tab), 'schwellen_amounts': str(schwellen_amounts), 'schwellen_counts': schwellen_counts, 'schwellen_avg': sum([item[0] for item in all_schwellen_tab])/len(all_schwellen_tab), 'all_angebote_tab': str(all_angebote_tab), 'angebote_amounts': str(angebote_amounts), 'angebote_counts': angebote_counts, 'angebote_avg': sum([item[0] for item in all_angebote_tab])/len(all_angebote_tab), 'paying_players': [ self.session.vars['exp11_paying_players_labels'][0], self.session.vars['exp11_paying_players_payoff'][0], self.session.vars['exp11_paying_players_labels'][1], self.session.vars['exp11_paying_players_payoff'][1], ]} class Group(BaseGroup): pass class Player(BasePlayer): custom_role = models.StringField() choice = models.CurrencyField( min = c(0), max = Constants.pot, label='' ) def role(self): return self.custom_role