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. Dictator game. """ class Constants(BaseConstants): name_in_url = 'SI_exp12' 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(['Dictator', 'Receiver']) for p in self.get_players(): p.custom_role = next(roles) print(p.custom_role) def set_payoffs(self): # Filter by role dictators = [] receivers = [] for p in self.get_players(): if p.custom_role == "Dictator": dictators.append(p) if p.custom_role == "Receiver": receivers.append(p) else: print("This should never happen") # Select two random players dictator = random.choice(dictators) receiver = random.choice(receivers ) spieler1 = dictator # Legt Aufteilung fest spieler2 = receiver # Macht nichts spieler1.payoff = spieler1.choice spieler2.payoff = Constants.pot - spieler1.choice # Save payoffs for live payout self.session.vars['exp12_paying_players_payoff'] = [ spieler1.payoff, spieler2.payoff ] self.session.vars['exp12_paying_players_labels'] = [ spieler1.participant.label, spieler2.participant.label ] # for player in self.get_players(): # player.participant.vars['exp12_my_choice'] = player.choice # player.participant.vars['exp12_others_choice'] = self.get_player_by_id(player.id_in_group % 2 + 1).choice # player.participant.vars['exp12_my_payoff'] = player.payoff # player.participant.vars['exp12_my_role'] = player.role(), # player.participant.vars['exp12_others_role'] = 'Spieler1' if player.role() == 'Spieler2' else 'Spieler2', # player.participant.vars['exp12_others_payoff'] = self.get_player_by_id(player.id_in_group % 2 + 1).payoff, def vars_for_admin_report(self): all_choices_ind = sorted([p.choice for p in self.get_players()]) all_choices_tab = [] for choice in all_choices_ind: count = all_choices_ind.count(choice) all_choices_tab.append([choice,count]) all_choices_tab = [list(t) for t in set(map(tuple, all_choices_tab))] all_choices_tab = sorted(all_choices_tab,key=itemgetter(1),reverse=True) all_choices_tab = sorted(all_choices_tab,key=itemgetter(0),reverse=True) amounts = [str(item[0]) for item in all_choices_tab] counts = [item[1] for item in all_choices_tab] print('Sorted choices:') print(all_choices_tab) return {'all_choices_tab': str(all_choices_tab), 'amounts': str(amounts), 'counts': counts, 'choice_avg': sum([item[0] for item in all_choices_tab])/len(all_choices_tab), 'paying_players': [ self.session.vars['exp12_paying_players_labels'][0], self.session.vars['exp12_paying_players_payoff'][0], self.session.vars['exp12_paying_players_labels'][1], self.session.vars['exp12_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