from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import numpy as np import random author = 'Masaki Suyama' doc = """ Conducting cyberball with ostracism """ class Constants(BaseConstants): name_in_url = 'cyberRMob_ost' players_per_group = None num_rounds = 10 prob1 = [0.7,0.3] # 個々の変数で参加者にPCがボールをパスする確率を調整 prob2 = [0.15,0.85] # 個々の変数で参加者にPCがボールをパスする確率を調整 # [x,y]のうちxが参加者にパスする確率、yがもうひとりのPCにパスする確率 fromX = ["Z","Y"] # Xがどちらに投げるかを決める際に使う変数 fromY = ["Z","X"] # Yがどちらに投げるかを決める際に使う変数 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): throw = models.StringField( #参加者どのPCにボール渡すか決めるフィールド choices = ["X","Y"], widget = widgets.RadioSelect ) exit_game = models.BooleanField(initial = False) # 参加者がゲームを抜けるために使うフィールド location = models.StringField(initial = "Z") # 参加者に提示されないフィールド。ボールの位置を記録するために使用。 def loc_ball(self): # ボールの場所を取得するための関数 if self.round_number < 5: if self.in_round(self.round_number-1).location == "Z": self.location = self.throw return self.location, print('from PPT, location is ', self.location) # うまく作動しているかを確認するためにprintしている elif self.in_round(self.round_number-1).location == "X": randthrow = np.random.choice(C.FROMX,p=C.PROB1) self.location = str(randthrow) return self.location, print('from X, location is ', self.location) # うまく作動しているかを確認するためにprintしている elif self.in_round(self.round_number-1).location == "Y": randthrow = np.random.choice(C.FROMY,p=C.PROB1) self.location = str(randthrow) return self.location, print('from Y, location is ', self.location) # うまく作動しているかを確認するためにprintしている else: return None # エラーがあるか確認するため else: if self.in_round(self.round_number-1).location == "Z": self.location = self.throw return self.location, print('from PPT, location is ', self.location) # うまく作動しているかを確認するためにprintしている elif self.in_round(self.round_number-1).location == "X": randthrow = np.random.choice(C.FROMX,p=C.PROB2) self.location = str(randthrow) return self.location, print('from X, location is ', self.location) # うまく作動しているかを確認するためにprintしている elif self.in_round(self.round_number-1).location == "Y": randthrow = np.random.choice(C.FROMY,p=C.PROB2) self.location = str(randthrow) return self.location, print('from Y, location is ', self.location) # うまく作動しているかを確認するためにprintしている else: return None # エラーがあるか確認するため def location_in_prev(self): #2ラウンド目以降、必ずlocationが前のラウンドでボールを受け取ったプレイヤーから始まるようにするための関数 while self.round_number >=2: return self.in_round(self.round_number-1).location def vars_for_template(self): #2ラウンド以降、ボールがどこにあるのかを参加者の画面に映し出すための関数 if self.round_number >= 2: a = self.in_round(self.round_number-1).location else: a = "Z" if self.round_number >= 2: b = self.location else: b = "Z" return dict(a=a,b=b) p = models.FloatField( initial = random.uniform(0,1.5) )