from otree.api import * doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'asia_disease' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 class Subsession(BaseSubsession): #「死亡」の下でAを選んだ被験者の人数 die_number_cho_a = models.IntegerField(initial=0) #「死亡」の下でBを選んだ被験者の人数 die_number_cho_b = models.IntegerField(initial=0) #「生存」の下でAを選んだ被験者の人数 alive_number_cho_a = models.IntegerField(initial=0) #「生存」の下でBを選んだ被験者の人数 alive_number_cho_b = models.IntegerField(initial=0) #「死亡」の下でAを選んだ被験者の割合(小数) die_per_a = models.FloatField(initial=0) #「生存」の下でAを選んだ被験者の割合(小数) alive_per_a = models.FloatField(initial=0) #「死亡」の下でAを選んだ被験者の割合(%のため) die_per_a_p = models.FloatField(initial=0) #「生存」の下でAを選んだ被験者の割合(%のため) alive_per_a_p = models.FloatField(initial=0) #「死亡」の下でAを選んだ被験者の割合(%のため) die_per_b_p = models.FloatField(initial=0) #「生存」の下でAを選んだ被験者の割合(%のため) alive_per_b_p = models.FloatField(initial=0) class Group(BaseGroup): #「死亡」の下でAを選んだ被験者の人数 #die_number_cho_a = models.IntegerField(initial=0) #「死亡」の下でBを選んだ被験者の人数 #die_number_cho_b = models.IntegerField(initial=0) #「生存」の下でAを選んだ被験者の人数 #alive_number_cho_a = models.IntegerField(initial=0) #「生存」の下でBを選んだ被験者の人数 #alive_number_cho_b = models.IntegerField(initial=0) #「死亡」の下でAを選んだ被験者の割合(小数) #die_per_a = models.FloatField() #「生存」の下でAを選んだ被験者の割合(小数) #alive_per_a = models.FloatField() #「死亡」の下でAを選んだ被験者の割合(%のため) #die_per_a_p = models.FloatField() #「生存」の下でAを選んだ被験者の割合(%のため) #alive_per_a_p = models.FloatField() #「死亡」の下でAを選んだ被験者の割合(%のため) #die_per_b_p = models.FloatField() #「生存」の下でAを選んだ被験者の割合(%のため) #alive_per_b_p = models.FloatField() pass class Player(BasePlayer): selection_a = models.IntegerField( label="あなたの選択:", widget=widgets.RadioSelect, initial=0, choices=[ [1,'プログラムAを採用する。200人が助かる。'], [2,'プログラムBを採用する。1/3の確率で600人全員が助か り、2/3の確率で1人も助からない。'] ] ) selection_d = models.IntegerField( label="あなたの選択:", widget=widgets.RadioSelect, initial=0, choices=[ [1,'プログラムCを採用する。400人が死亡する。'], [2,'プログラムDを採用する。1/3の確率で1人も死亡しない が、2/3の確率で600人全員死亡する。'] ] ) #die_number_cho_a_player = models.IntegerField() #die_number_cho_b_player = models.IntegerField() #alive_number_cho_a_player = models.IntegerField() #alive_number_cho_b_player = models.IntegerField() # PAGES class wait_for_attend(WaitPage): pass class asia_disease_a(Page): timeout_seconds = 40 form_model = "player" form_fields=["selection_a"] class asia_disease_d(Page): timeout_seconds = 40 form_model = "player" form_fields=["selection_d"] class ResultsWaitPage(WaitPage): def after_all_players_arrive(group: Group): subsession_infor = group.subsession player_infor = subsession_infor.get_players() for p in player_infor: if p.selection_a == 1: subsession_infor.alive_number_cho_a = subsession_infor.alive_number_cho_a + 1 elif p.selection_a == 2: subsession_infor.alive_number_cho_b = subsession_infor.alive_number_cho_b + 1 for p in player_infor: if p.selection_d == 1: subsession_infor.die_number_cho_a = subsession_infor.die_number_cho_a + 1 elif p.selection_d == 2: subsession_infor.die_number_cho_b = subsession_infor.die_number_cho_b + 1 subsession_infor.alive_per_a = round(subsession_infor.alive_number_cho_a/(subsession_infor.alive_number_cho_a + subsession_infor.alive_number_cho_b),4) subsession_infor.die_per_a = round(subsession_infor.die_number_cho_a/(subsession_infor.die_number_cho_a + subsession_infor.die_number_cho_b),4) subsession_infor.alive_per_a_p = subsession_infor.alive_per_a * 100 subsession_infor.die_per_a_p = subsession_infor.die_per_a * 100 subsession_infor.alive_per_b_p = 100 - subsession_infor.alive_per_a_p subsession_infor.die_per_b_p = 100 - subsession_infor.die_per_a_p #for p in player_infor: # p.alive_number_cho_a_player = subsession_infor.alive_number_cho_a # p.alive_number_cho_b_player = subsession_infor.alive_number_cho_b #groupを超えてAを選んだ人の数を統計したい場合 # subsession_A = group.subsession # player_id_se = subsession_A.get_players() # for p in player_id_se: # if p.selection_a == 1: # group.alive_number_cho_a = group.alive_number_cho_a + 1 # elif p.selection_a == 2: # group.alive_number_cho_b = group.alive_number_cho_b + 1 class Results(Page): #@staticmethod def js_vars(player): subsession_infor = player.subsession#該当playerがいるgroupデータを抽出 return dict( alive_a_p = subsession_infor.alive_per_a_p, alive_b_p = subsession_infor.alive_per_b_p, die_a_p = subsession_infor.die_per_a_p, die_b_p = subsession_infor.die_per_b_p # alive_a = [group.alive_number_cho_a, group.alive_number_cho_b], # die_a = [group.die_number_cho_a, group.die_number_cho_b] #あるいは、testlist = [ player.alive_number_cho_a_player, player.alive_number_cho_b_player ] ) pass class waitpagedy(Page): pass page_sequence = [ #wait_for_attend, asia_disease_a, asia_disease_d, ResultsWaitPage, Results, waitpagedy ]