from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random import itertools doc = """ This is the signaling game from Cho and Kreps (1987) """ class Constants(BaseConstants): name_in_url = 'signaling' players_per_group = 2 num_rounds = 5 instructions_template = 'signaling/IntroductionA.html' class Subsession(BaseSubsession): def creating_session(self): # Nature's draw of Player A's type for group in self.get_groups(): group.type = random.uniform(0,1) if group.type <= 0.1: group.weak = 1 group.announcement ='weak' else: group.strong = 1 group.announcement = 'strong' class Group(BaseGroup): type = models.FloatField() weak = models.IntegerField(initial=0) strong = models.IntegerField(initial=0) announcement = models.StringField() beer = models.BooleanField( doc="Player A has beer for breakfast", widget=widgets.RadioSelect, choices=( (True, 'beer'), (False, 'quiche'), ) ) duel = models.BooleanField( doc="Player B chooses to duel" ) #def set_groups(self): def set_payoffs(self): player_a = self.get_player_by_role('A') player_b = self.get_player_by_role('B') if not self.duel: if not self.beer: player_a.payoff = self.weak+2 player_b.payoff = self.strong else: player_a.payoff = self.strong+2 player_b.payoff = self.strong else: if not self.beer: player_a.payoff = self.weak player_b.payoff = self.weak else: player_a.payoff = self.strong player_b.payoff = self.weak class Player(BasePlayer): def role(self): if self.id_in_group == 1: return 'A' if self.id_in_group == 2: return 'B'