from otree.api import * c = cu doc = '' class C(BaseConstants): NAME_IN_URL = 'practice_take' PLAYERS_PER_GROUP = 6 NUM_ROUNDS = 1 TRANSFER = cu(4) RANK_PAY = (cu(60), cu(56), cu(52), cu(48), cu(44), cu(40)) class Subsession(BaseSubsession): transfer = models.CurrencyField() def creating_session(subsession: Subsession): session = subsession.session subsession.group_randomly() subsession.transfer = C.TRANSFER * session.config['treatment'] class Group(BaseGroup): chosen_decision = models.IntegerField() chosen_choice = models.IntegerField() def set_payoff(group: Group): for p in group.get_players(): p.rank = len([i for i in group.get_players() if i.score_tiebreaking >= p.score_tiebreaking]) p.pay = C.RANK_PAY[p.rank - 1] def set_payoff2(group: Group): session = group.session subsession = group.subsession import random group.chosen_decision = random.randint(1, C.PLAYERS_PER_GROUP) p = group.get_player_by_id(group.chosen_decision) if p.rank <= 3: group.chosen_choice = p.transfer_high if p.transfer_high == 1: target = [i for i in group.get_players() if i.rank == p.rank + 1][0] target.pay -= subsession.transfer else: target = [i for i in group.get_players() if i.rank == p.rank + 2][0] target.pay -= subsession.transfer elif p.rank > 3: group.chosen_choice = p.transfer_low if p.transfer_low == 1: target = [i for i in group.get_players() if i.rank == p.rank - 1][0] target.pay -= subsession.transfer else: target = [i for i in group.get_players() if i.rank == p.rank - 2][0] target.pay -= subsession.transfer class Player(BasePlayer): sum_score = models.IntegerField(initial=0) correct_answer = models.IntegerField(initial=-1) rank = models.IntegerField() score_tiebreaking = models.FloatField() transfer_high = models.IntegerField(choices=[[1, 'A: 排名比我低一位的参与者'], [2, 'B: 排名比我低两位的参与者']], label='我选择从___那里拿走收益:', widget=widgets.RadioSelect) transfer_low = models.IntegerField(choices=[[1, 'A: 排名比我高一位的参与者'], [2, 'B: 排名比我高两位的参与者']], label='我选择从___那里拿走收益:', widget=widgets.RadioSelect) pay = models.CurrencyField() def live_sum(player: Player, data): group = player.group import random if data == player.correct_answer: player.sum_score += 1 n1 = random.randint(10, 99) n2 = random.randint(10, 99) n3 = random.randint(10, 99) player.correct_answer = n1 + n2 + n3 question = '+'.join([str(i) for i in [n1, n2, n3]]) response = dict(score = player.sum_score, question = question) return {player.id_in_group: response} class Instruction(Page): form_model = 'player' @staticmethod def vars_for_template(player: Player): session = player.session if session.config['treatment'] == 1: transfer = 4 else: transfer = 8 return dict(transfer=transfer) class Summation(Page): form_model = 'player' timeout_seconds = 60 live_method = 'live_sum' @staticmethod def before_next_page(player: Player, timeout_happened): import random player.score_tiebreaking = player.sum_score + random.random() class MyWaitPage(WaitPage): after_all_players_arrive = set_payoff class Feedback(Page): form_model = 'player' class Decision_High(Page): form_model = 'player' form_fields = ['transfer_high'] @staticmethod def vars_for_template(player: Player): session = player.session treatment = 'nr' if session.config['treatment'] == 1 else 'r' filename = 'take_pic/' + treatment + '_d_r' + '3' return dict(filename1 = filename + '_1.png', filename2 = filename + '_2.png') class Decision_Low(Page): form_model = 'player' form_fields = ['transfer_low'] @staticmethod def vars_for_template(player: Player): session = player.session treatment = 'nr' if session.config['treatment'] == 1 else 'r' filename = 'take_pic/' + treatment + '_d_r' + '4' return dict(filename1 = filename + '_1.png', filename2 = filename + '_2.png') class MyWaitPage2(WaitPage): after_all_players_arrive = set_payoff2 class Decision_Results(Page): form_model = 'player' @staticmethod def vars_for_template(player: Player): session = player.session treatment = 'nr' if session.config['treatment'] == 1 else 'r' filename1 = 'take_pic/' + treatment + '_r_r' + '3' + '_' + str(player.transfer_high) + '.png' filename2 = 'take_pic/' + treatment + '_r_r' + '4' + '_' + str(player.transfer_low) + '.png' return dict(filename1 = filename1, filename2 = filename2) page_sequence = [Instruction, Summation, MyWaitPage, Feedback, Decision_High, Decision_Low, MyWaitPage2, Decision_Results]