import random from otree.api import * """ Sim for 'Acquiring a Company' game """ class Constants(BaseConstants): name_in_url = 'company' players_per_group = 2 num_rounds = 2 instructions_template = 'company/instructions.html' buyer_role = 'Buyer' seller_role = 'Seller' class Subsession(BaseSubsession): pass class Group(BaseGroup): value = models.CurrencyField(initial=0) buyer_value = models.CurrencyField(initial=0) class Player(BasePlayer): price = models.CurrencyField(min=0, initial=0, label='') # FUNCTIONS def creating_session(subsession: Subsession): subsession.group_randomly() for group in subsession.get_groups(): group.value = cu(random.uniform(0, 100)) def other_player(player: Player): return player.get_others_in_group()[0] def set_payoff(group: Group): buyer = group.get_player_by_role(Constants.buyer_role) seller = group.get_player_by_role(Constants.seller_role) group.buyer_value = 1.5 * group.value if buyer.price >= seller.price: buyer.payoff = 1.5 * group.value - buyer.price seller.payoff = buyer.price else: buyer.payoff = 0 seller.payoff = group.value # PAGES class Introduction(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Main(Page): form_model = 'player' form_fields = ['price'] class ResultsWaitPage(WaitPage): after_all_players_arrive = set_payoff class Results(Page): @staticmethod def vars_for_template(player: Player): opponent = player.get_others_in_group()[0] group = player.group return { 'opponent': opponent, 'sold': group.get_player_by_role(Constants.buyer_role).price >= group.get_player_by_role(Constants.seller_role).price, } page_sequence = [Introduction, Main, ResultsWaitPage, Results]