#1 by Vasu (edited )
Hi,
I am designing a game (akin to risk elicitation with a choice list of 10 scenarios with two options; Option A is a fixed payoff while B is a payoff based on chance with the chance varying across the 10 scenarios). There are 2 players in a group and they make choices sequentially. Player 1 makes their choice for 10 scenarios, it is then displayed to player 2 post which they make their own set of choices. Till this point, the game is working fine.
Now I need to implement payoffs by randomly selecting one of the choices for each group. Say scenario 2 is selected for the group and then based on the choices of players in the group, their payoff is determined.
Here is the logic for payoff determination: if both players choose the first option (Option A), then they get a certain payoff while if either of them or both choose the second option (Option B), they get a probabilistic payoff based on a coin flip as the scenario suggests.
I am facing an issue in my set_payoffs function and somehow the random choice is not getting assigned to the players and the group. I am new to the oTree platform so any help regarding this will be much appreciated.
The following code snippet is where I suspect my issue is coming up!
class Group(BaseGroup):
# Initialize payoff variables
random_choice = models.IntegerField()
selected_scenario = models.StringField()
@staticmethod
def set_payoffs(group):
# Select a random choice index for the group
random_choice = random.randint(0, 9)
probability = C.COIN_FLIP_PROBABILITIES[random_choice]
# Now set this random choice in each player's participant vars
for p in group.get_players():
p.participant.vars[
'random_choice'] = random_choice # This ensures all players in the group get the same random choice
players = group.get_players()
choices = [getattr(p, f'c{random_choice}') for p in players]
if choices == [0, 0]:
payoff = Currency(50) # Both chose option 0
else:
# Coin flip with the probability specific to the choice
coin_flip = random.random() < probability
if coin_flip:
payoff = Currency(77) # Higher payoff
else:
payoff = Currency(2) # Lower payoff
for p in players:
p.payoff = payoff
p.participant.vars['random_choice'] = random_choice # Store for access in templates
class Results(Page):
@staticmethod
def vars_for_template(player):
return {
'selected_scenario': player.participant.vars['random_choice'],
'payoff': player.payoff
}
P.S. this is how I define coin_flip under BaseConstants:
COIN_FLIP_PROBABILITIES = {
1: 0.1, # 10% chance of True for choice 1
2: 0.2, # 20% chance of True for choice 2
3: 0.3, # And so on...
4: 0.4,
5: 0.5, # Fair coin for choice 5
6: 0.6,
7: 0.7,
8: 0.8,
9: 0.9,
10: 1.0 # Always True for choice 10
}