from otree.api import * import random import csv import time c = Currency doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'cardflip_exp' players_per_group = None num_trials=1 lamda=0.1 para=[1,100] search_cost=1 num_rounds = 20 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): end_frag = models.CurrencyField(initial=0) result = models.CurrencyField(initial=0) search_num = models.IntegerField(initial=0) recall = models.IntegerField(initial=0) update_frag = models.IntegerField(initial=0) current_best_value = models.IntegerField(initial=0) current_value = models.IntegerField(initial=0) seaquence = models.LongStringField(initial='0') start= models.FloatField(initial=0.0) time = models.LongStringField(initial='0') pass CDF = [] #csvファイルを指定 MyPath = "Exp_para.csv" #csvファイルを読み込み with open(MyPath) as f: reader = csv.reader(f) #csvファイルのデータをループ total=0 for row in reader: #配列へ格納 total=total+float(row[0]) CDF.append(total) # Function def make_random(): para_a=Constants.para[0] para_b=Constants.para[1] rand=random.random() tmp=len([i for i in CDF if i < rand])+1 return int(tmp) def get_state(player: Player): return dict( current_best_value=player.current_best_value, current_value=player.current_value, result=player.result, end_frag=player.end_frag, search_num=player.search_num, total_cost=player.search_num*Constants.search_cost ) card_state={} for i in range(1,21): card_state["card_"+str(i)]="" def result_history(player: Player): return [int(p.result) for p in player.in_all_rounds()] def num_history(player: Player): return [int(p.search_num) for p in player.in_all_rounds()] # PAGES class Search(Page): def vars_for_template(player: Player): return dict(Round_number=player.round_number,Result=player.result) # html to サーバー @staticmethod def live_method(player: Player,data): if data["conti"]: player.time=player.time+","+str(time.time()-player.start) player.search_num=player.search_num+1 current_value=make_random() player.seaquence= player.seaquence+","+str(current_value) player.update_frag=0 # 初期化 if current_value >= player.current_best_value: player.update_frag=1 # 最大値の更新 player.current_best_value=current_value player.current_value=current_value player.result=player.current_best_value-player.search_num*Constants.search_cost return {player.id_in_group : dict(get_state(player),update=player.update_frag,clicked=True,index=data["card_position"])} else: if player.start==0: player.start= float(time.time()) if data["finish"]==1: player.time=player.time+","+str(time.time()-player.start) player.end_frag=1 return {player.id_in_group : dict(get_state(player),update=0,clicked=False)} def before_next_page(self, timeout_happened): self.participant.vars[Constants.name_in_url+'_result'] = result_history(self) self.participant.vars[Constants.name_in_url+'_num'] = num_history(self) pass class Finish(Page): def is_displayed(player): return player.round_number==Constants.num_rounds @staticmethod def app_after_this_page(self, upcoming_apps): self.participant.vars[Constants.name_in_url+'_order']=len(upcoming_apps) pass page_sequence = [Search,Finish]