from otree.api import * c = cu doc = '\nKaushik Basu\'s famous traveler\'s dilemma (\n\n AER 1994\n).\nIt is a 2-player game. The game is framed as a traveler\'s dilemma and intended\nfor classroom/teaching use.\n' class C(BaseConstants): NAME_IN_URL = 'traveler_dilemma' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 1 ADJUSTMENT_ABS = cu(2) MAX_AMOUNT = cu(100) MIN_AMOUNT = cu(2) INSTRUCTIONS_TEMPLATE = 'traveler_dilemma/instructions.html' class Subsession(BaseSubsession): pass class Group(BaseGroup): lower_claim = models.CurrencyField() def set_payoffs(group: Group): p1, p2 = group.get_players() if p1.claim == p2.claim: group.lower_claim = p1.claim for p in [p1, p2]: p.payoff = group.lower_claim p.adjustment = cu(0) else: if p1.claim < p2.claim: winner = p1 loser = p2 else: winner = p2 loser = p1 group.lower_claim = winner.claim winner.adjustment = C.ADJUSTMENT_ABS loser.adjustment = -C.ADJUSTMENT_ABS winner.payoff = group.lower_claim + winner.adjustment loser.payoff = group.lower_claim + loser.adjustment class Player(BasePlayer): claim = models.CurrencyField(doc='Each player s claim', label='How much will you claim for your antique', max=C.MAX_AMOUNT, min=C.MIN_AMOUNT) adjustment = models.CurrencyField() def other_player(player: Player): group = player.group return player.get_others_in_group()[0] class Introduction(Page): form_model = 'player' class Claim(Page): form_model = 'player' form_fields = ['claim'] class ResultsWaitPage(WaitPage): after_all_players_arrive = set_payoffs class Results(Page): form_model = 'player' @staticmethod def vars_for_template(player: Player): return dict(other_player_claim=other_player(player).claim) page_sequence = [Introduction, Claim, ResultsWaitPage, Results]