from otree.api import * c = cu doc = 'Coding up the game first to 21 wins, by taking turn. See Basu book.' class C(BaseConstants): NAME_IN_URL = 'Flag_game_21' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 11 FLAGS = 21 STAKES = cu(100) class Subsession(BaseSubsession): pass class Group(BaseGroup): Player_1_Flags1 = models.IntegerField(label='How many flags will you take in this round?', max=3, min=1) Player_2_Flags1 = models.IntegerField(label='How many flags will you take in this round?', max=3, min=1) Flagsleftp1 = models.IntegerField(initial=21, min=0) Flagsleftp2 = models.IntegerField(initial=21, min=0) last_round_player2flags = models.IntegerField() is_winner = models.BooleanField(initial=False) def set_payoffs(group: Group): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) if group.Flagsleftp2 < 1: p1.is_winner = True elif group.Flagsleftp1 < 1: p2.is_winner = True for p in [p1, p2]: if p.is_winner: p.payoff = C.STAKES else: p.payoff = cu(0) def Player_1_Flags1_max(group: Group): if group.round_number > 1: prev_player = group.in_round(group.round_number - 1) return min(prev_player.Flagsleftp1,3) elif group.round_number == 1: return 3 def Player_2_Flags1_max(group: Group): return min(group.Flagsleftp2,3) class Player(BasePlayer): is_winner = models.BooleanField(initial=False) class Player1_r1(Page): form_model = 'group' form_fields = ['Player_1_Flags1'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 1 @staticmethod def vars_for_template(player: Player): group = player.group if group.round_number == 1: return dict( flagsleft1=C.FLAGS ) elif group.round_number > 1: prev_player = group.in_round(group.round_number - 1) return dict( lastroundplayer2flags=prev_player.Player_2_Flags1, flagsleft1=prev_player.Flagsleftp1 ) @staticmethod def before_next_page(player: Player, timeout_happened): group = player.group if group.round_number == 1: group.Flagsleftp2=C.FLAGS-group.Player_1_Flags1 elif group.round_number > 1: prev_player = group.in_round(group.round_number - 1) group.Flagsleftp2=prev_player.Flagsleftp1-group.Player_1_Flags1 class WaitForP1_1(WaitPage): pass class ResultsWaitPage1(WaitPage): after_all_players_arrive = set_payoffs class Results1(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): group = player.group return group.Flagsleftp1 < 1 or group.Flagsleftp2 < 1 class WaitForp2(WaitPage): pass class Player2_r1(Page): form_model = 'group' form_fields = ['Player_2_Flags1'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 2 @staticmethod def vars_for_template(player: Player): group = player.group if group.round_number == 1: return dict( flagsleft2=C.FLAGS-group.Player_1_Flags1 ) elif group.round_number > 1: prev_player = group.in_round(group.round_number - 1) return dict( flagsleft2=prev_player.Flagsleftp1-group.Player_1_Flags1 ) @staticmethod def before_next_page(player: Player, timeout_happened): group = player.group if group.round_number == 1: group.Flagsleftp1=C.FLAGS-group.Player_2_Flags1-group.Player_1_Flags1 elif group.round_number > 1: group.Flagsleftp1=group.Flagsleftp2-group.Player_2_Flags1 class ResultsWaitPage(WaitPage): after_all_players_arrive = set_payoffs class Results(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): group = player.group return group.Flagsleftp1 < 1 or group.Flagsleftp2 < 1 page_sequence = [Player1_r1, WaitForP1_1, ResultsWaitPage1, Results1, WaitForp2, Player2_r1, ResultsWaitPage, Results]