from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) author = 'Yinhai' doc = """ Classical PGG with four players in a group, multiplier is 2. """ class Constants(BaseConstants): name_in_url = 'my_public_goods' players_per_group = 2 num_rounds = 3 endowment = c(100) multiplier =2 class Subsession(BaseSubsession): pass class Group(BaseGroup): total_contribution = models.CurrencyField() individual_share = models.CurrencyField() def set_payoffs(self): players = self.get_players() contributions = [p.contribution for p in players] self.total_contribution = sum(contributions) self.individual_share = ( self.total_contribution * Constants.multiplier / Constants.players_per_group ) # for p in palyers: # p.payoff_received=p.contribution + self.individual_share if self.round_number ==1: for p in players: p.payoff = Constants.endowment - p.contribution + self.individual_share # p.payoff_last_round = p.payoff else: for p in players: p.payoff = p.in_round( self.round_number -1 ).payoff - p.contribution + self.individual_share # p.payoff_last_round = p.in_round( self.round_number -1 ).payoff def total_contribution_history(self): return [g.total_contribution for g in self.in_previous_rounds()] class Player(BasePlayer): #payoff_last_round = models.CurrencyField() contribution = models.CurrencyField( min = 0, max = Constants.endowment, label = "How much will you contribute?" ) # payoff_in_last_round=models.CurrencyField() def payoff_last_round(self): # if self.round_number == 1: # return [p.payoff for p in self.group.get_players()] if self.round_number >= 2: return [self.in_round(self.round_number - 1).payoff] # def payoff_last_round(self): # if self.round_number == 1: # payoff_last_round = self.group.p.payoff # else: # payoff_last_round = self.group.p.in_round( self.round_number -1 ).payoff