from __future__ import division import random from otree.api import * from .models import C, Player WIN_PROB = 0.40 GAME_PARAMS = [ {"multiplier": 1.2, "prob": 0.2969}, {"multiplier": 1.5, "prob": 0.2714}, {"multiplier": 2.0, "prob": 0.2375}, {"multiplier": 1.3, "prob": 0.2879}, {"multiplier": 1.8, "prob": 0.25}, ] def get_language(player): return player.session.config.get('language', 'en') == 'en' class a_Instructions(Page): form_model = 'player' form_fields = ['comprehension_check_1', 'comprehension_check_2'] def is_displayed(player): return player.round_number == 1 def error_message(player, values): err = ( 'Your answer is incorrect. Please read the instructions again.' if get_language(player) else 'Jawaban Anda belum tepat. Silakan baca kembali instruksi permainan.' ) errors = {} if values['comprehension_check_1'] != '3': errors['comprehension_check_1'] = err if values['comprehension_check_2'] != '3': errors['comprehension_check_2'] = err return errors def vars_for_template(player): return dict( en=get_language(player) ) class b3_Decision(Page): form_model = 'player' form_fields = ['bet_amount', 'choice'] def is_displayed(player): return ( player.participant.vars.get('balance', 0) > 0 and player.participant.vars.get('play_next_round', True) ) def error_message(player, values): balance = player.participant.vars.get('balance', 0) if not values.get('bet_amount'): return ( 'Please select your desired bet amount.' if get_language(player) else 'Pilihlah nominal pertaruhan yang Anda inginkan.' ) if values['bet_amount'] <= 0: return ( 'The bet amount must be greater than zero.' if get_language(player) else 'Jumlah taruhan tidak boleh negatif.' ) if values['bet_amount'] > balance: return ( 'You cannot bet more than your available balance.' if get_language(player) else 'Anda tidak dapat bertaruh lebih dari saldo yang Anda miliki.' ) if not values.get('choice'): return ( 'Please choose Heads or Tails.' if get_language(player) else 'Pilihlah Kepala atau Ekor koin.' ) def vars_for_template(player): index = (player.round_number - 1) % len(GAME_PARAMS) params = GAME_PARAMS[index] return dict( multiplier=params["multiplier"], en=get_language(player), ) class c_Results(Page): def is_displayed(self): player = self.player return player.participant.vars.get('balance', 0) > 0 and player.participant.vars.get('play_next_round', True) def vars_for_template(self): p = self.player if p.field_maybe_none('coin_result') is None: balance = p.participant.vars.get('balance', 0) # Determine rotating game parameters index = (p.round_number - 1) % len(GAME_PARAMS) params = GAME_PARAMS[index] multiplier = params["multiplier"] win_prob = params["prob"] # Override probability for first 2 rounds if p.round_number <= 2: win_prob = 0.8 p.multiplier = multiplier p.win_probability = win_prob # Draw outcome if random.random() < win_prob: p.round_win = True p.coin_result = p.choice p.round_payoff = int(p.bet_amount * multiplier) else: p.round_win = False p.coin_result = 'T' if p.choice == 'H' else 'H' p.round_payoff = int(-p.bet_amount) balance += p.round_payoff p.participant.vars['balance'] = balance return dict( coin=p.coin_result, win=p.round_win, balance=p.participant.vars['balance'], multiplier=p.multiplier, en=get_language(self), ) class d_Exit(Page): def is_displayed(player): return ( not player.participant.vars.get('play_next_round', True) or player.participant.vars.get('balance', 0) <= 0 ) def vars_for_template(player): final_balance = player.participant.vars.get('balance', 0) player.final_balance = final_balance return dict( final_balance=final_balance, en=get_language(player), ) def app_after_this_page(player, upcoming_apps): return upcoming_apps[0] class f_belief_elicit(Page): form_model = 'player' form_fields = ['belief_elicit_1', 'belief_elicit_2'] def is_displayed(player): return ( (not player.play_round) or player.participant.vars.get('balance', 0) <= 0 ) def vars_for_template(player): return dict( en=get_language(player) ) def app_after_this_page(player, upcoming_apps): return upcoming_apps[0] page_sequence = [ a_Instructions, b3_Decision, c_Results, d_Exit, ]