from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random doc = """ 2 firms complete in a market by setting prices for homogenous goods. See "Kruse, J. B., Rassenti, S., Reynolds, S. S., & Smith, V. L. (1994). Bertrand-Edgeworth competition in experimental markets. Econometrica: Journal of the Econometric Society, 343-371." """ class Constants(BaseConstants): players_per_group = 2 name_in_url = 'class_bertrand' num_rounds = 1 instructions_template = 'class_bertrand/Instructions.html' maximum_price = c(100) class Subsession(BaseSubsession): pass class Group(BaseGroup): winning_price1 = models.CurrencyField() winning_price2 = models.CurrencyField() winning_price3 = models.CurrencyField() def set_payoffs(self): players = self.get_players() self.winning_price1 = min([p.price1 for p in players]) winners1 = [p for p in players if p.price1 == self.winning_price1] winner1 = random.choice(winners1) for p in players: if p == winner1: p.is_winner1 = True p.payoff1 = p.price1 else: p.is_winner1 = False p.payoff1 = c(0) def set_payoffs2(self): players = self.get_players() self.winning_price2 = min([p.price2 for p in players]) winners2 = [p for p in players if p.price2 == self.winning_price2] winner2 = random.choice(winners2) for p in players: if p == winner2: p.is_winner2 = True p.payoff2 = p.price2 else: p.is_winner2 = False p.payoff2 = c(0) def set_payoffs3(self): players = self.get_players() self.winning_price3 = min([p.price3 for p in players]) winners3 = [p for p in players if p.price3 == self.winning_price3] winner3 = random.choice(winners3) for p in players: if p == winner3: p.is_winner3 = True p.payoff3 = p.price3 else: p.is_winner3 = False p.payoff3 = c(0) class Player(BasePlayer): price1 = models.CurrencyField( min=0, max=Constants.maximum_price, doc="""Price player offers to sell product for""" ) price2 = models.CurrencyField( min=0, max=Constants.maximum_price, doc="""Price player offers to sell product for""" ) price3 = models.CurrencyField( min=0, max=Constants.maximum_price, doc="""Price player offers to sell product for""" ) is_winner1 = models.BooleanField() is_winner2 = models.BooleanField() is_winner3 = models.BooleanField() payoff1 = models.CurrencyField() payoff2 = models.CurrencyField() payoff3 = models.CurrencyField() fullname = models.StringField()