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. L or R, with message. """ class Constants(BaseConstants): name_in_url = 'SI_exp05' players_per_group = None num_rounds = 1 payoff_meyou_LL = c(9) payoff_meyou_RR = c(7) payoff_meyou_LR = c(-10) payoff_meyou_RL = c(8) B1 = 'Botschaft 1: "Ich wähle auf jeden Fall Strategie L. Mach das auch!"' B2 = 'Botschaft 2: "Strategie L ist mir zu riskant. Darum werde ich Strategie R wählen. Aber ich freue mich natürlich, wenn Du Strategie L wählst."' class Subsession(BaseSubsession): def creating_session(self): self.group_randomly() # Note: Stupid python list indexing[start=zero, end=exclusive!] print('In creating_session(): SI_05') if self.round_number == 1: self.session.vars['exp05_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_B1_choices = sorted([p.choice_B1 for p in self.get_players()]) all_B2_choices = sorted([p.choice_B2 for p in self.get_players()]) message_choices = sorted([p.message for p in self.get_players()]) B1_L = all_B1_choices.count('L') B1_R = all_B1_choices.count('R') B2_L = all_B2_choices.count('L') B2_R = all_B2_choices.count('R') B1 = message_choices.count(1) B2 = message_choices.count(2) return {'B1_L': [B1_L,100*B1_L/(B1_L+B1_R)], 'B1_R': [B1_R,100*B1_R/(B1_L+B1_R)], 'B2_L': [B2_L,100*B2_L/(B2_L+B2_R)], 'B2_R': [B2_R,100*B2_R/(B2_L+B2_R)], 'B1': [B1,100*B1/(B1+B2)], 'B2': [B2,100*B2/(B1+B2)], 'paying_players': [ self.get_players()[self.session.vars['exp05_paying_players'][0]].participant.label, self.get_players()[self.session.vars['exp05_paying_players'][0]].payoff, self.get_players()[self.session.vars['exp05_paying_players'][1]].participant.label, self.get_players()[self.session.vars['exp05_paying_players'][1]].payoff ]} def set_payoffs(self): for p in self.get_players(): p.payoff = 0 print('in set_payoffs') p1 = self.get_players()[self.session.vars['exp05_paying_players'][0]] p2 = self.get_players()[self.session.vars['exp05_paying_players'][1]] p1.choice = p1.choice_B1 if p2.message == 1 else p1.choice_B2 p2.choice = p2.choice_B1 if p1.message == 1 else p2.choice_B2 if p1.choice == p2.choice == 'L': p1.payoff = Constants.payoff_meyou_LL p2.payoff = Constants.payoff_meyou_LL elif p1.choice == p2.choice == 'R': p1.payoff = Constants.payoff_meyou_RR p2.payoff = Constants.payoff_meyou_RR elif p1.choice == 'L' and p2.choice == 'R': p1.payoff = Constants.payoff_meyou_LR p2.payoff = Constants.payoff_meyou_RL elif p1.choice == 'R' and p2.choice == 'L': p1.payoff = Constants.payoff_meyou_RL p2.payoff = Constants.payoff_meyou_LR # for player in self.get_players(): # player.participant.vars['exp05_my_choice'] = player.choice # player.participant.vars['exp05_others_choice'] = self.get_player_by_id(player.id_in_group % 2 + 1).choice # player.participant.vars['exp05_my_payoff'] = player.payoff # player.participant.vars['exp05_other_message'] = Constants.B1 if self.get_player_by_id(player.id_in_group % 2 + 1).message == 1 else Constants.B2 # player.participant.vars['exp05_player_message'] = Constants.B1 if player.message == 1 else Constants.B2 # # Save payoffs for live payout # self.session.vars['exp05_paying_players_payoff'] = [ # self.get_players()[self.session.vars['exp05_paying_players'][0]].payoff, # self.get_players()[self.session.vars['exp05_paying_players'][1]].payoff # ] class Group(BaseGroup): pass class Player(BasePlayer): message = models.IntegerField( choices=[ [1, Constants.B1], [2, Constants.B2], ], label = "Welche Botschaft möchten Sie senden?", widget=widgets.RadioSelect ) choice_B1 = models.StringField( choices=['L', 'R'], label = "Für was entscheiden Sie sich, wenn Sie Botschaft 1 erhalten?", widget=widgets.RadioSelect ) choice_B2 = models.StringField( choices=['L', 'R'], label = "Für was entscheiden Sie sich, wenn Sie Botschaft 2 erhalten?", widget=widgets.RadioSelect ) choice = models.StringField( choices=['L', 'R'], label = "DIESES LABEL SOLLTE MAN NICHT SEHEN. NUR ZUM RECHNEN.", widget=widgets.RadioSelect )