from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, Page, WaitPage ) cu = c doc = '' class Constants(BaseConstants): name_in_url = 'lending_joint3' players_per_group = 3 num_rounds = 10 borrower_role = 'Borrower' lender_role = 'Lender' class Subsession(BaseSubsession): pass def monitoring_logic(group): session = group.session subsession = group.subsession import random if group.lending: p1 = group.get_player_by_id(2) p2 = group.get_player_by_id(3) p1.initial_project = 'S' if group.borrower1 else 'R' p2.initial_project = 'S' if group.borrower2 else 'R' if group.monitoring1: if random.random() <= 0.8: # 80% of times it goes through p2.final_project = 'S' else: p2.final_project = p2.initial_project else: p2.final_project = p2.initial_project if group.monitoring2: if random.random() <= 0.8: # 80% of times it goes through p1.final_project = 'S' else: p1.final_project = p1.initial_project else: p1.final_project = p1.initial_project if subsession.round_number == 1: session.vars['result'] = [] if group.lending: current = [subsession.round_number, group.lending, p1.initial_project, group.monitoring1, p1.final_project, p2.initial_project, group.monitoring2, p2.final_project] else: current = [subsession.round_number, group.lending,None,None,None, None,None ,None] session.vars['result'].append(current) def leaderboard_logic(group): session = group.session subsession = group.subsession p1 = group.get_player_by_id(2) p2 = group.get_player_by_id(3) score1 = 0 score2 = 0 score3 = 0 if not group.lending: score1 = score1 + 1.5 score2 = score2 score3 = score3 if group.lending: if p1.final_project == 'S' and p2.final_project == 'S': score1 = score1 + 2.5 score2 = score2 + 2 score3 = score3 + 2 elif p1.final_project == 'R' and p2.final_project == 'R': score1 = score1 + 0 score2 = score2 + 0 score3 = score3 + 0 elif p1.final_project == 'S' and p2.final_project == 'R': score1 = score1 + 2 score2 = score2 + 0 score3 = score3 + 3 elif p1.final_project == 'R' and p2.final_project == 'S': score1 = score1 + 2 score2 = score2 + 3 score3 = score3 + 0 maxScore = 0.00 if subsession.round_number == Constants.num_rounds: if score1 >= score2: maxScore = score1 else: maxScore = score2 if score3 > maxScore: maxScore = score3 winner = '' if maxScore == score1: winner = 'The Lender' group.winner = winner elif maxScore == score2: winner = 'Borrower 1' group.winner = winner else: winner = 'Borrower 2' group.winner = winner class Group(BaseGroup): lending = models.BooleanField(choices=[[True, 'lend'], [False, "don't lend"]]) borrower1 = models.BooleanField(choices=[[True, 'Project S'], [False, 'Project R']]) borrower2 = models.BooleanField(choices=[[True, 'Project S'], [False, 'Project R']]) monitoring1 = models.BooleanField(choices=[[True, 'Monitor'], [False, "Don't Monitor"]]) monitoring2 = models.BooleanField(choices=[[True, 'Monitor'], [False, "Don't monitor"]]) winner = models.StringField(choices=[['The Lender', 'The Lender'], ['Borrower 1', 'Borrower 1'], ['Borrower 2', 'Borrower 2']]) monitoring_logic = monitoring_logic leaderboard_logic = leaderboard_logic def my_function(player): pass class Player(BasePlayer): initial_project = models.StringField() final_project = models.StringField() my_function = my_function