from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) #from otree_tools.widgets import AdvancedSliderWidget import random from operator import itemgetter, attrgetter author = 'Your name here' doc = """ Experiment for the lecture "Strategische Interaktion" by Prof. Dr. Sandra Ludwig. Split pot. """ class Constants(BaseConstants): name_in_url = 'SI_exp06' players_per_group = None num_rounds = 1 winner_payoff = c(8) loser_payoff = c(0) equal_payoff = c(4) preferences = [ [10, 12, 14, 16, 17, 18, 19, 21, 23, 25], [12, 8, 6, 15, 7, 3, 25, 14, 7, 3] ] class Subsession(BaseSubsession): def creating_session(self): self.group_randomly() # Note: Stupid python list indexing[start=zero, end=exclusive!] if self.round_number == 1: self.session.vars['exp06_paying_players'] = random.sample(range(0,self.session.num_participants,1), 2) # print('set the paying players to', self.session.vars['exp1_paying_players']) 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(0),reverse=True) all_choices_tab = sorted(all_choices_tab,key=itemgetter(1),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, 'paying_players': [ self.get_players()[self.session.vars['exp06_paying_players'][0]].participant.label, self.get_players()[self.session.vars['exp06_paying_players'][0]].payoff, self.get_players()[self.session.vars['exp06_paying_players'][1]].participant.label, self.get_players()[self.session.vars['exp06_paying_players'][1]].payoff ]} def set_payoffs(self): for p in self.get_players(): p.payoff = 0 p1 = self.get_players()[self.session.vars['exp06_paying_players'][0]] p2 = self.get_players()[self.session.vars['exp06_paying_players'][1]] if p1.choice == p2.choice: p1.payoff = Constants.equal_payoff p2.payoff = Constants.equal_payoff p1.support = p2.support = 87.5 p1.message = 'mit einem Unentschieden beendet' p2.message = 'mit einem Unentschieden beendet' else: for index in range(len(Constants.preferences[0])): if abs(p1.choice - Constants.preferences[0][index]) == abs(p2.choice - Constants.preferences[0][index]): p1.support = p1.support + 0.5 * Constants.preferences[1][index] p2.support = p2.support + 0.5 * Constants.preferences[1][index] elif abs(p1.choice - Constants.preferences[0][index]) < abs(p2.choice - Constants.preferences[0][index]): p1.support = p1.support + Constants.preferences[1][index] else: p2.support = p2.support + Constants.preferences[1][index] if p1.support > p2.support: p1.payoff = Constants.winner_payoff p2.payoff = Constants.loser_payoff p1.message = 'gewonnen' p2.message = 'verloren' elif p1.support == p2.support: p1.payoff = Constants.equal_payoff p2.payoff = Constants.equal_payoff p1.message = 'mit einem Unentschieden beendet' p2.message = 'mit einem Unentschieden beendet' else: p1.payoff = Constants.loser_payoff p2.payoff = Constants.winner_payoff p1.message = 'verloren' p2.message = 'gewonnen' # for player in self.get_players(): # player.participant.vars['exp06_my_choice'] = player.choice # player.participant.vars['exp06_others_choice'] = self.get_player_by_id(player.id_in_group % 2 + 1).choice # player.participant.vars['exp06_my_payoff'] = player.payoff # player.participant.vars['exp06_my_support'] = player.support # player.participant.vars['exp06_others_support'] = self.get_player_by_id(player.id_in_group % 2 + 1).support # player.participant.vars['exp06_win'] = player.message # # Save payoffs for live payout # self.session.vars['exp06_paying_players_payoff'] = [ # self.get_players()[self.session.vars['exp06_paying_players'][0]].payoff, # self.get_players()[self.session.vars['exp06_paying_players'][1]].payoff # ] class Group(BaseGroup): pass class Player(BasePlayer): choice = models.FloatField( min = 0, max = 100, label = "Auf welchen Steuersatz würden Sie sich festlegen?", initial = None) support = models.FloatField(initial = 0) message = models.StringField()