from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from .models import Constants, Player class Purchase(Page): form_model = 'player' form_fields = ['purchase_num', 'purchase_price'] def is_displayed(self): flag = True # ラウンドナンバーが1,4,7...のときは3で割ると余り1になる。 # この性質を使って1, 4, 7...と3ラウンドごとに初期配分を独立させる。 # if self.round_number % 3 == 1: # flag = True # else: # return False # 1200枠以上になってたらis_displayedはFalseでページスキップ if self.group.can_haibun: return False return flag def error_message(self, values): # print('values is', values) if values['purchase_num'] * values['purchase_price'] > Constants.shihonkin: message_text = ''' 入札価格と希望購入枠の積が%s以下になるようにしてください ''' % Constants.shihonkin return message_text # 実験説明のラウンド数、ターン数にoTreeのラウンド数を変換する用 def vars_for_template(self): round_num = (self.round_number + 2) // 3 turn_num = self.round_number % 3 if turn_num == 0: turn_num = 3 return dict( round_num = round_num, turn_num = turn_num ) class PurchaseWaitPage(WaitPage): def is_displayed(self): flag = True # ラウンドナンバーが1,4,7...のときは3で割ると余り1になる。 # この性質を使って1, 4, 7...と3ラウンドごとに初期配分を独立させる。 # if self.round_number % 3 == 1: # flag = True # else: # return False # 1200枠以上になってたらis_displayedはFalseでページスキップ if self.group.can_haibun: return False return flag after_all_players_arrive = 'do_shoki_haibun' class Purchase_result1(Page): def is_displayed(self): flag = True # ラウンドナンバーが1,4,7...のときは3で割ると余り1になる。 # この性質を使って1, 4, 7...と3ラウンドごとに初期配分を独立させる。 # if self.round_number % 3 == 1: # flag = True # else: # return False # 1200枠以上になってたらis_displayedはFalseでページスキップ if self.group.can_haibun: return False return flag # 実験説明のラウンド数、ターン数にoTreeのラウンド数を変換する用 def vars_for_template(self): round_num = (self.round_number + 2) // 3 turn_num = self.round_number % 3 if turn_num == 0: turn_num = 3 return dict( round_num = round_num, turn_num = turn_num ) class Purchase_result2(Page): # def is_displayed(self): # ラウンドナンバーが1,4,7...のときは3で割ると余り1になる。 # この性質を使って1, 4, 7...と3ラウンドごとに初期配分を独立させる。 # if self.round_number % 3 == 1: # return True # else: # return False # 実験説明のラウンド数、ターン数にoTreeのラウンド数を変換する用 def vars_for_template(self): round_num = (self.round_number + 2) // 3 turn_num = self.round_number % 3 if turn_num == 0: turn_num = 3 return dict( round_num = round_num, turn_num = turn_num, players = self.group.get_players() ) class Invest(Page): form_model = 'player' form_fields = ['invest'] def is_displayed(self): flag = False if self.group.can_haibun: flag = True if self.player.invest == 'はい': flag = False return flag def before_next_page(self): if self.player.invest == 'はい': self.player.shojikin -= Constants.invest_price # 実験説明のラウンド数、ターン数にoTreeのラウンド数を変換する用 def vars_for_template(self): round_num = (self.round_number + 2) // 3 turn_num = self.round_number % 3 if turn_num == 0: turn_num = 3 return dict( round_num = round_num, turn_num = turn_num ) class Seisan(Page): form_model = 'player' form_fields = ['seisan'] def before_next_page(self): if self.player.invest == 'はい': if self.player.seisan == '拡大': self.player.waku_num -= Constants.expand_need_ticket self.player.shojikin += self.player.expand_profit elif self.player.seisan == '通常': self.player.waku_num -= Constants.normal_need_ticket self.player.shojikin += self.player.normal_profit elif self.player.seisan == '縮小': self.player.waku_num -= Constants.shrink_need_ticket self.player.shojikin += self.player.shrink_profit else: if self.player.seisan == '拡大': self.player.waku_num -= Constants.expand_need self.player.shojikin += self.player.expand_profit elif self.player.seisan == '通常': self.player.waku_num -= Constants.normal_need self.player.shojikin += self.player.normal_profit elif self.player.seisan == '縮小': self.player.waku_num -= Constants.shrink_need self.player.shojikin += self.player.shrink_profit if self.player.waku_num < 0: self.player.shisan += self.player.shojikin + self.player.waku_num * 300 else: # 均一価格方式にするときは下の処理要注意 self.player.shisan += self.player.shojikin kansan_price = round(self.player.purchase_price * 0.9 ) kansan_okane = kansan_price * self.player.waku_num self.player.shisan += kansan_okane self.player.calc_B() # 実験説明のラウンド数、ターン数にoTreeのラウンド数を変換する用 def vars_for_template(self): round_num = (self.round_number + 2) // 3 turn_num = self.round_number % 3 if turn_num == 0: turn_num = 3 return dict( round_num = round_num, turn_num = turn_num ) class Round_result(Page): # 実験説明のラウンド数、ターン数にoTreeのラウンド数を変換する用 def vars_for_template(self): round_num = (self.round_number + 2) // 3 turn_num = self.round_number % 3 if turn_num == 0: turn_num = 3 return dict( round_num = round_num, turn_num = turn_num, fusoku = -self.player.waku_num, kansan_price = round(self.player.purchase_price * 0.9 ) ) # かなり無理矢理感あるが、これで1200枠になるまでループさせることができる shoki_lst = [] for _ in range(30): shoki_lst.append(Purchase) shoki_lst.append(PurchaseWaitPage) shoki_lst.append(Purchase_result1) class Lastpage(Page): def is_displayed(self): return self.round_number==6 page_sequence = [ *shoki_lst, Purchase_result2, Invest, Seisan, Round_result, Lastpage ]