from random import random from otree.api import * from otree.models import subsession doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'monty_hall' players_per_group = None num_rounds = 5 num_doors = 3 num_rows = 1 win_payoff = cu(10) commit_win_payoff = cu(11) lose_payoff = cu(0) class Subsession(BaseSubsession): answer = models.IntegerField() class Group(BaseGroup): pass class Player(BasePlayer): is_winner = models.BooleanField(initial=False) first_choice = models.IntegerField(initial=101) old_choice = models.IntegerField(initial=101) final_choice = models.IntegerField(initial=101) switch = models.BooleanField() confirm = models.BooleanField(initial=False) game_over = models.BooleanField(initial=False) open = models.BooleanField(initial=False) second_stage = models.BooleanField(initial=False) first_stage_correct = models.BooleanField(initial=False) door_keep = models.IntegerField(initial=101) commit = models.IntegerField(initial = 0, choices=[[0, "No"], [1, "Yes, I want to commit to switch."], [2, "Yes, I want to commit to stay."]], widget=widgets.RadioSelect) temp_payoff = models.CurrencyField(initial=cu(0)) hollow = models.BooleanField(initial=True) def creating_session(subsession: Subsession): import random subsession.answer = random.randint(1, Constants.num_doors) class Game(Page): def is_displayed(player): participant = player.participant if player.round_number == 1 and player.game_over == False: participant.vars['monty_hall_cmt'] = 0 player.commit = participant.vars['monty_hall_cmt'] return player.first_choice == 101 @staticmethod def js_vars(player: Player): subsession = player.subsession return dict(num_doors = Constants.num_doors, num_rows = Constants.num_rows, answer = subsession.answer) @staticmethod def live_method(player: Player, data): import random subsession = player.subsession participant = player.participant print('data:', data) if (data and data == 'final_choice'): if player.final_choice == subsession.answer: player.is_winner = True # set payoff. Chose payoff or temp_payoff if player.commit == 0: player.payoff = Constants.win_payoff else: player.payoff = Constants.commit_win_payoff player.game_over = True # Record whether the player switched if player.first_choice == player.final_choice: player.switch = False else: player.switch = True if (data and data in range(1,101)): if (player.second_stage == False): player.old_choice = player.first_choice player.first_choice = data else: player.old_choice = player.final_choice player.final_choice = data player.confirm = True player.hollow = False if (data and data == 'opened'): player.second_stage = True # player.old_choice = player.first_choice if (data and data == 'open'): player.open = True # temporarily set final_choice as first_choice, player can switch later player.final_choice = player.first_choice player.old_choice = player.first_choice if player.first_choice == subsession.answer: player.first_stage_correct = True player.door_keep = player.first_choice while player.door_keep == player.first_choice: player.door_keep = random.randint(1, Constants.num_doors) else: player.door_keep = subsession.answer print("answer:", subsession.answer) print("door keep:", player.door_keep) print("old choice:", player.old_choice) print("first choice:", player.first_choice) print("final choice:", player.final_choice) print("old choice:", player.old_choice) print("second stage:", player.second_stage) print("----------------") return { player.id_in_group: dict( game_over=player.game_over, first_choice = player.first_choice, final_choice = player.final_choice, old_choice = player.old_choice, open = player.open, second_stage = player.second_stage, first_stage_correct = player.first_stage_correct, door_keep = player.door_keep, # commit = player.commit, commit = participant.monty_hall_cmt, confirm = player.confirm, hollow = player.hollow ) } class ResultsWaitPage(WaitPage): pass class Commit(Page): form_model = 'player' form_fields = ['commit'] def is_displayed(player): return player.commit == 0 def before_next_page(player: Player, timeout_happened): participant = player.participant participant.monty_hall_cmt = player.commit @staticmethod def js_vars(player: Player): return dict(switch = player.switch) class Results(Page): def is_displayed(player): return player.commit != 0 page_sequence = [Game, Results, Commit]