from otree.api import *
import random
doc = """
In a common value auction game, players simultaneously bid on the item being
auctioned.
Prior to bidding, they are given an estimate of the actual value of the item.
This actual value is revealed after the bidding.
Bids are private. The player with the highest bid wins the auction, but
payoff depends on the bid amount and the actual value.
"""
class C(BaseConstants):
NAME_IN_URL = 'common_value_auction_CHINESE'
PLAYERS_PER_GROUP = 2
NUM_ROUNDS = 4
INSTRUCTIONS_TEMPLATE = 'common_value_auction_CHINESE/instructions.html'
BID_MIN = cu(0)
BID_MAX = cu(600)
# Error margin for the value estimates shown to the players
BID_NOISE = cu(1)
class Subsession(BaseSubsession):
def creating_session(self):
self.group_randomly()
class Group(BaseGroup):
item_value = models.CurrencyField(
doc="""Common value of the item to be auctioned, random for treatment"""
)
# highest_bid = models.CurrencyField()
number_1 = models.IntegerField()
number_2 = models.IntegerField()
number_3 = models.IntegerField()
number_4 = models.IntegerField()
class Player(BasePlayer):
item_value_estimate = models.CurrencyField(
doc="""Estimate of the common value, may be different for each player"""
)
bid_amount0 = models.CurrencyField(
min=C.BID_MIN,
max=C.BID_MAX,
doc="""Amount bidded by the player""",
label="Bid amount",
)
bid_amount1 = models.CurrencyField(
min=C.BID_MIN,
max=C.BID_MAX,
doc="""Amount bidded by the player""",
label="Bid amount",
)
bid_amount2 = models.CurrencyField(
min=C.BID_MIN,
max=C.BID_MAX,
doc="""Amount bidded by the player""",
label="Bid amount",
)
bid_amount3 = models.CurrencyField(
min=C.BID_MIN,
max=C.BID_MAX,
doc="""Amount bidded by the player""",
label="Bid amount",
)
bid_amount4 = models.CurrencyField(
min=C.BID_MIN,
max=C.BID_MAX,
doc="""Amount bidded by the player""",
label="Bid amount",
)
is_winner = models.BooleanField(
initial=False, doc="""Indicates whether the player is the winner"""
)
sum_of_numbers = models.IntegerField()
number_entered = models.IntegerField()
# FUNCTIONS
def creating_session(subsession: Subsession):
subsession.group_randomly(fixed_id_in_group=True)
for g in subsession.get_groups():
import random
item_value = random.uniform(C.BID_MIN, C.BID_MAX)
g.item_value = round(item_value, 1)
g.number_1 = random.randint(1,100)
g.number_2 = random.randint(1,100)
g.number_3 = random.randint(1, 100)
g.number_4 = random.randint(1, 100)
# def set_winner(group: Group):
# import random
#
# players = group.get_players()
# group.highest_bid = max([p.bid_amount for p in players])
# players_with_highest_bid = [p for p in players if p.bid_amount == group.highest_bid]
# winner = random.choice(
# players_with_highest_bid
# ) # if tie, winner is chosen at random
# winner.is_winner = True
# for p in players:
# set_payoff(p)
def generate_value_estimate(group: Group):
import random
estimate = group.item_value + random.uniform(-C.BID_NOISE, C.BID_NOISE)
estimate = round(estimate, 1)
if estimate < C.BID_MIN:
estimate = C.BID_MIN
if estimate > C.BID_MAX:
estimate = C.BID_MAX
return estimate
def set_payoff(player: Player):
group = player.group
# if player.is_winner:
# player.payoff = group.item_value - player.bid_amount
# if player.payoff < 0:
# player.payoff = 0
# else:
# player.payoff = 0
# PAGES
class Introduction(Page):
@staticmethod
def before_next_page(player: Player, timeout_happened):
group = player.group
player.item_value_estimate = generate_value_estimate(group)
class Bid0(Page):
form_model = 'player'
form_fields = ['bid_amount0']
@staticmethod
def vars_for_template(player: Player):
if player.id_in_group == 1:
number_1 = player.group.number_1
player.sum_of_numbers = number_1
return {
"number_1": number_1,
"sum_of_number": player.sum_of_numbers
}
else:
number_1 = player.group.number_4
player.sum_of_numbers = number_1
return {
"number_1": number_1,
"sum_of_number": player.sum_of_numbers
}
class Bid1(Page):
form_model = 'player'
form_fields = ['bid_amount1']
@staticmethod
def vars_for_template(player: Player):
if player.id_in_group == 1:
number_1 = player.group.number_1
player.sum_of_numbers = number_1
return {
"number_1":number_1,
"sum_of_number":player.sum_of_numbers
}
else:
number_1 = player.group.number_4
player.sum_of_numbers = number_1
return {
"number_1":number_1,
"sum_of_number":player.sum_of_numbers
}
class Bid2(Page):
form_model = 'player'
form_fields = ['bid_amount2']
@staticmethod
def vars_for_template(player: Player):
if player.id_in_group == 1:
number_1 = player.group.number_1
number_2 = player.group.number_2
player.sum_of_numbers = number_1+number_2
return {
"number_1":number_1,
"number_2":number_2,
"sum_of_number":player.sum_of_numbers
}
else:
number_1 = player.group.number_4
number_2 = player.group.number_3
player.sum_of_numbers = number_1+number_2
return {
"number_1":number_1,
"number_2":number_2,
"sum_of_number":player.sum_of_numbers
}
class Bid3(Page):
form_model = 'player'
form_fields = ['bid_amount3']
@staticmethod
def vars_for_template(player: Player):
if player.id_in_group == 1:
number_1 = player.group.number_1
number_2 = player.group.number_2
number_3 = player.group.number_3
player.sum_of_numbers = number_1+number_2+number_3
return {
"number_1":number_1,
"number_2":number_2,
"number_3":number_3,
"sum_of_number":player.sum_of_numbers
}
else:
number_1 = player.group.number_4
number_2 = player.group.number_3
number_3 = player.group.number_2
player.sum_of_numbers = number_1+number_2+number_3
return {
"number_1":number_1,
"number_2":number_2,
"number_3":number_3,
"sum_of_number":player.sum_of_numbers
}
class Bid4(Page):
form_model = 'player'
form_fields = ['bid_amount4']
@staticmethod
def vars_for_template(player: Player):
if player.id_in_group == 1:
number_1 = player.group.number_1
number_2 = player.group.number_2
number_3 = player.group.number_3
number_4 = player.group.number_4
player.sum_of_numbers = number_1+number_2+number_3+number_4
return {
"number_1":number_1,
"number_2":number_2,
"number_3":number_3,
"number_4":number_4,
"sum_of_number":player.sum_of_numbers
}
else:
number_1 = player.group.number_4
number_2 = player.group.number_3
number_3 = player.group.number_2
number_4 = player.group.number_1
player.sum_of_numbers = number_1+number_2+number_3+number_4
return {
"number_1":number_1,
"number_2":number_2,
"number_3":number_3,
"number_4":number_4,
"sum_of_number":player.sum_of_numbers
}
class ResultsWaitPage(WaitPage):
pass
# after_all_players_arrive = set_winner
class Results(Page):
@staticmethod
def vars_for_template(player: Player):
group = player.group
# return dict(is_greedy=group.item_value - player.bid_amount < 0)
page_sequence = [Introduction, Bid0, Bid1, Bid2, Bid3, Bid4, ResultsWaitPage]