from otree.api import * doc = """ This is a one-shot "Prisoner's Dilemma". Two players are asked separately whether they want to cooperate or defect. Their choices directly determine the payoffs. """ class C(BaseConstants): NAME_IN_URL = 'prisoner' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 1 INSTRUCTIONS_TEMPLATE = 'prisoner/instructions.html' PAYOFF_A = 0 PAYOFF_B = 2 PAYOFF_C = 4 PAYOFF_D = 6 class Subsession(BaseSubsession): #Cを選んだ人数 c_number = models.IntegerField(initial=0) #dを選んだ人数 d_number = models.IntegerField(initial=0) #cを選んだ人の割合 c_number_per = models.FloatField(initial=0) #dを選んだ人数の割合 d_number_per = models.FloatField(initial=0) #cを選んだ人の総利得 c_total_pay = models.FloatField(initial=0) #dを選んだ人数の総利得 d_total_pay = models.FloatField(initial=0) #cを選んだ人の平均利得 c_ave_pay = models.FloatField(initial=0) #dを選んだ人数の平均利得 d_ave_pay = models.FloatField(initial=0) class Group(BaseGroup): pass class Player(BasePlayer): cooperate = models.FloatField( choices=[[1, '黙秘'], [2, '告白'], [0, '放棄']], doc="""あなたの選択""", widget=widgets.RadioSelect, initial=0, max=2, min=0 ) per = models.FloatField(initial=0) other_se = models.FloatField() #studentnumber=models.StringField(doc="""学籍番号。""",label="学籍番号を入力してください。") def other_player(player: Player): return player.get_others_in_group()[0] def set_payoffs(group: Group): for p in group.get_players(): set_payoff(p) def set_payoff(player: Player): payoff_matrix = { (2, 1): C.PAYOFF_A, (1, 1): C.PAYOFF_B, (2, 2): C.PAYOFF_C, (1, 2): C.PAYOFF_D, (0, 1): 0, (0, 0): 0, (1, 0): 0, (2, 0): 0, (0, 2): 0, } other = other_player(player) player.per = payoff_matrix[(player.cooperate, other.cooperate)] player.other_se = other.cooperate # PAGES #class studnumb(Page): # @staticmethod # def is_displayed(player: Player): # return player.round_number == 1 # form_model = 'player' # form_fields = ['studentnumber'] class Introduction(Page): timeout_seconds = 100 class Decision(Page): form_model = 'player' form_fields = ['cooperate'] class ResultsWaitPage(WaitPage): after_all_players_arrive = set_payoffs class ResultsWaitPage2(WaitPage): wait_for_all_groups = True @staticmethod def after_all_players_arrive(subsession): for p in subsession.get_players(): if p.cooperate == 1: subsession.c_number = subsession.c_number + 1 elif p.cooperate == 2: subsession.d_number = subsession.d_number + 1 subsession.c_number_per = subsession.c_number / ( subsession.c_number + subsession.d_number ) subsession.d_number_per = subsession.d_number / ( subsession.c_number + subsession.d_number ) class Results(Page): @staticmethod def vars_for_template(player: Player): opponent = other_player(player) return dict( opponent=opponent, same_choice=player.cooperate == opponent.cooperate, my_decision=player.field_display('cooperate'), opponent_decision=opponent.field_display('cooperate'), ) def js_vars(player): subsession_infor = player.subsession#該当playerがいるsubsessionデータを抽出 return dict( c_per = subsession_infor.c_number_per, d_per = subsession_infor.d_number_per ) page_sequence = [#studnumb, Decision, ResultsWaitPage,ResultsWaitPage2, Results]