from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from .models import Constants import random global real_value_random real_value_random = [14500,17800,4050,23500,9500] global e_random e_random = [2175,2670,607,3525,1425] class information(Page): form_model = 'player' form_fields = ['name'] def is_displayed(self): return self.round_number == 1 class instruct(Page): def is_displayed(self): return self.round_number == 1 class O_1(Page): def vars_for_template(self): group=self.group player=self.player if(self.subsession.round_number==1 or self.subsession.round_number==6): group.real_value = real_value_random[0] group.e = e_random[0] elif(self.subsession.round_number==2 or self.subsession.round_number==7): group.real_value = real_value_random[1] group.e = e_random[1] elif(self.subsession.round_number==3 or self.subsession.round_number==8): group.real_value = real_value_random[2] group.e = e_random[2] elif(self.subsession.round_number==4 or self.subsession.round_number==9): group.real_value = real_value_random[3] group.e = e_random[3] else: group.real_value = real_value_random[4] group.e = e_random[4] print('real_value:',self.group.real_value) print('e:',self.group.e) player.look_value=random.randrange(group.real_value-group.e,group.real_value+group.e,10) return{ 'e':group.e, 'look_value':player.look_value, } class O_2(WaitPage): def after_all_players_arrive(self): pass class O_min(Page): form_model = 'player' form_fields = ['bid'] def is_displayed(self): return self.round_number <= 5 def vars_for_template(self): group=self.group p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) p3 = group.get_player_by_id(3) p4 = group.get_player_by_id(4) p5 = group.get_player_by_id(5) ranking=[p1.look_value,p2.look_value,p3.look_value,p4.look_value,p5.look_value] ranking.sort() print(ranking) group.min_value=ranking[0] print('ranking:',group.min_value) return{ 'e':group.e, 'look_value':self.player.look_value, 'min':group.min_value, } class instruct_median(Page): def is_displayed(self): return self.round_number == 6 class O_median(Page): form_model = 'player' form_fields = ['bid'] def is_displayed(self): return self.round_number > 5 def vars_for_template(self): group=self.group p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) p3 = group.get_player_by_id(3) p4 = group.get_player_by_id(4) p5 = group.get_player_by_id(5) ranking=[p1.look_value,p2.look_value,p3.look_value,p4.look_value,p5.look_value] ranking.sort() print(ranking) group.median_value=ranking[2] print('中央値:',group.median_value) return{ 'e':group.e, 'look_value':self.player.look_value, 'min':group.median_value, } class ResultsWaitPage(WaitPage): def after_all_players_arrive(self): pass class Results(Page): def vars_for_template(self): group = self.group player = self.player if(self.round_number > 1): self.player.name=self.player.in_round(self.round_number - 1).name p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) p3 = group.get_player_by_id(3) p4 = group.get_player_by_id(4) p5 = group.get_player_by_id(5) details = {p1.bid:p1,p2.bid:p2,p3.bid:p3,p4.bid:p4,p5.bid:p5} details_name = {p1.bid:p1.name,p2.bid:p2.name,p3.bid:p3.name,p4.bid:p4.name,p5.bid:p5.name} ranking = [p1.bid,p2.bid,p3.bid,p4.bid,p5.bid] ranking.sort(reverse=True) # 勝者の名前と落札額を取得 group.winner = details_name[ranking[0]] group.second_bid_value = ranking[1] # 勝者の呪いかどうかの判定 if(group.second_bid_value <= group.real_value): group.result=False #勝者の呪いではない else: group.result=True #勝者の呪いである if(group.result==True): print('勝者の呪い!!') selif='落札者は損失を被った' else: print('適切な取引') selif='落札者は利益を得た' # 各プレイヤーの利益計算 if(details[ranking[0]]): details[ranking[0]].benefit = group.real_value - group.second_bid_value if(player.benefit == None): player.benefit = 0 return{ 'winner':group.winner, 'buy':group.second_bid_value, 'selif':selif, 'benefit':player.benefit, 'real':self.group.real_value, } page_sequence = [ information, instruct, O_1, O_2, O_min, instruct_median, O_median, ResultsWaitPage, Results ]