from otree.api import * doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'monopoly' PLAYERS_PER_GROUP = 4 NUM_ROUNDS = 3 prices = [4, 14, 24] max_bottles = 200 max_price = 30 def creating_session(self): self.group_randomly() for p in self.get_players(): p.get_role_of_player() class Subsession(BaseSubsession): pass class Group(BaseGroup): total_bottles_sold = models.PositiveIntegerField(initial=0, doc="""Total Number of bottles sold this round""") price = models.PositiveIntegerField(initial=0, doc="""Wine producer sale-price""") def set_payoff(group: Group): players = group.get_players() for p in players: if p.role_of_player != 'Seller': group.total_bottles_sold += p.number_of_bottles else: group.price = p.sell_price for p in players: if p.role_of_player == 'Seller': p.payoff = (p.sell_price) * sum(p.number_of_bottles for p in players if p.role_of_player != 'Seller') else: p.payoff = (p.buy_price - sum(p.sell_price for p in players if p.role_of_player == 'Seller')) * p.number_of_bottles pass class Player(BasePlayer): student_ID = models.IntegerField(label="Please enter your student ID to proceed") role_of_player = models.StringField(doc="""Role in group""") sell_price = models.PositiveIntegerField(min=0, max=C.max_price, doc="""Price seller chooses to sell wine at""") buy_price = models.PositiveIntegerField(choices = C.prices, doc="""Price buyer will buy the wine at""") number_of_bottles = models.PositiveIntegerField(min=0, max=C.max_bottles, doc="""Number of bottles""") def get_role_of_player(player): if player.id_in_group == 1: player.role_of_player = 'Seller' elif player.id_in_group == 2: player.role_of_player = 'Buyer 1' player.buy_price = C.prices[0] elif player.id_in_group == 3: player.role_of_player = 'Buyer 2' player.buy_price = C.prices[1] elif player.id_in_group == 4: player.role_of_player = 'Buyer 3' player.buy_price = C.prices[2] # PAGES class ID_Entry(Page): form_model = 'player' form_fields = ['student_ID'] @staticmethod def is_displayed(subsession): return subsession.round_number == 1 class Info(Page): pass class WinePricePage(Page): form_model = 'player' form_fields = ['sell_price'] @staticmethod def is_displayed(player): return player.role_of_player == 'Seller' class WaitForAll(WaitPage): wait_for_all_groups = True class WineBuyPage(Page): form_model = 'player' form_fields = ['number_of_bottles'] @staticmethod def is_displayed(player): return player.role_of_player != 'Seller' class ResultsWaitPage(WaitPage): after_all_players_arrive = set_payoff class Results(Page): pass page_sequence = [ID_Entry, Info, WinePricePage, WaitForAll, WineBuyPage, ResultsWaitPage, Results]