from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random doc = """ This is symmetric Volunteer's Dilemma game based on Diekmann & Przepiorka (2016). """ class Constants(BaseConstants): name_in_url = 'SYMVODKO' players_per_group = 2 num_rounds = 24 num_other_players = players_per_group - 1 # """Payoff for each player if at least one volunteers""" general_benefit = c(80) # """Payoff for each player if no one volunteers""" no_benefit = c(0) # """Cost incurred by volunteering player""" volunteer_cost_weak = c(50) volunteer_cost_strong = c(50) class Subsession(BaseSubsession): pass class Group(BaseGroup): p1_volunteer = models.StringField( choices=['True', 'False'] ) p2_volunteer = models.StringField( choices=['True', 'False'] ) p1payoff = models.CurrencyField() p2payoff = models.CurrencyField() allpayoff = models.CurrencyField() def set_payoffs(self): p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) if self.p1_volunteer == "True" and self.p2_volunteer == "True": p1.payoff = Constants.general_benefit - Constants.volunteer_cost_strong p2.payoff = Constants.general_benefit - Constants.volunteer_cost_weak elif self.p1_volunteer == "True": p1.payoff = Constants.general_benefit - Constants.volunteer_cost_strong p2.payoff = Constants.general_benefit elif self.p2_volunteer == "True": p1.payoff = Constants.general_benefit p2.payoff = Constants.general_benefit - Constants.volunteer_cost_weak else: p1.payoff = Constants.no_benefit p2.payoff = Constants.no_benefit self.p1payoff = p1.payoff self.p2payoff = p2.payoff self.allpayoff = p1.payoff + p2.payoff p1totalpayoff = models.CurrencyField() p2totalpayoff = models.CurrencyField() alltotalpayoff = models.CurrencyField() p1totalvolunteer = models.CurrencyField() p2totalvolunteer = models.CurrencyField() def set_totalpayoffs(self): p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) self.p1totalpayoff = sum([p1.payoff for p1 in p1.in_all_rounds()]) self.p2totalpayoff = sum([p2.payoff for p2 in p2.in_all_rounds()]) self.alltotalpayoff = self.p1totalpayoff + self.p2totalpayoff self.p1totalvolunteer = sum(1 if self.p1_volunteer == "True" else 0 for self in self.in_all_rounds()) self.p2totalvolunteer = sum(1 if self.p2_volunteer == "True" else 0 for self in self.in_all_rounds()) class Player(BasePlayer): code = models.IntegerField() totalpayoff = models.CurrencyField() skip = models.BooleanField( choices=[ [False, 'Continued'], [True, 'Skipped'], ] ) satisfaction_y = models.StringField( choices=['不満である', 'どちらかといえば不満である', 'どちらでもない', 'どちらかといえば満足である', '満足である'], label='あなたは、ペアになった相手がレバーを引いた回数に関して、どのくらい満足していますか', widget=widgets.RadioSelect) satisfaction_p = models.StringField( choices=['不満である', 'どちらかといえば不満である', 'どちらでもない', 'どちらかといえば満足である', '満足である'], label='ペアになった相手は、あなたがレバーを引いた回数に関して、どのくらい満足していると思いますか', widget=widgets.RadioSelect) sex = models.StringField( choices=['男性', '女性', 'その他'], label='あなたの性別を教えてください', widget=widgets.RadioSelect) age = models.IntegerField( label='あなたの年齢を半角数字でご入力ください', min=18, max=99) mail = models.StringField( label='あなたのメールアドレスをご入力ください')