oTree Forum >

**#1
by
Thair_Ahmad
**

Hello! I am trying to design a public goods game where the first three players play the game simultaneously, and their payoffs are determined together. From the fourth player onwards, the game is sequential; nth player is matched with 2 random player's contributions (n-1 players who have already contributed) for the determination of their payoff. I have changed the constant players_per_group to None and tried to write a payoff function that considers the above condition. However, there are two problems: 1) the payoff for every player is showing zero irrespective of their contribution and 2) I need a add a waiting page only for first three players as the game is sequential from 4th player. Please help me. Thank you. Here is my code: from otree.api import * import random class C(BaseConstants): NAME_IN_URL = 'public_goods_simple' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 ENDOWMENT = cu(100) MULTIPLIER = 2 class Subsession(BaseSubsession): pass class Group(BaseGroup): total_contribution = models.CurrencyField() individual_share = models.CurrencyField() class Player(BasePlayer): contribution = models.CurrencyField( choices=[[0, '0'], [50, '50'], [100, '100']], label="How much will you contribute?", widget=widgets.RadioSelectHorizontal ) # FUNCTIONS def set_payoffs(player: Player): group = player.group players = group.get_players() contributions = [p.contribution for p in players if p.contribution is not None] group.total_contribution = sum(contributions) i = len(contributions) - 1 if i < 3: player.payoff = C.ENDOWMENT - player.contribution + ( group.total_contribution * C.MULTIPLIER / len(contributions)) else: selected_players = random.sample(players[:i], 2) selected_contributions = [sp.contribution for sp in selected_players] avg_contribution = (player.contribution + sum(selected_contributions)) / 3 player.payoff = C.ENDOWMENT - player.contribution + (avg_contribution * C.MULTIPLIER) # PAGES class Contribute(Page): form_model = 'player' form_fields = ['contribution'] class Results(Page): form_model = 'player' page_sequence = [Contribute, Results]