from typing import Any, Union from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) author = 'Your name here' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'kinken' players_per_group = None num_rounds = 5 price_list=[[2000],[1700,1950,2200,2550],[1900,2450,2650,2800],[2000,2650,3050,3500],[2400,3050,3550,3800]] class Subsession(BaseSubsession): Treatment = models.IntegerField() def creating_session(self): self.Treatment = self.session.config['Treatment'] import random for p in self.get_players(): p.dividend=random.choice([5,30,45,80]) p.stock_price=random.choice(Constants.price_list[self.round_number-1]) class Group(BaseGroup): pass class Player(BasePlayer): # 株を買う量 buy_num=models.IntegerField(min=0,label='',blank=True) # 株を売る量 sell_num=models.IntegerField(min=0,label='',blank=True) # blank=Trueでフォームを空白にできてしまうため、Pagesでエラーの定義 # 残ってる所持金 remaining=models.IntegerField() # 一株あたり配当 dividend=models.IntegerField() # トータルの配当 total_dividend=models.IntegerField() # 株価 stock_price=models.IntegerField() # 資本金 total_money=models.IntegerField() # もってる株数 total_stock=models.IntegerField() # 株主優待の数 benefit = models.IntegerField() final_money=models.IntegerField() # フィールド初期化用 def initial_score(self): self.total_money=1500000 self.total_stock=0 self.sell_num = 0 # 前のラウンドからのお金と株数引継ぎ用 def take_over(self): # 現在のラウンドナンバー curr_round = self.round_number # 次のラウンドナンバー next_round = self.round_number + 1 self.in_round(next_round).total_money = self.in_round(curr_round).remaining self.in_round(next_round).total_stock = self.in_round(curr_round).total_stock # いろいろ計算用 def calculate_score(self): # 買った場合 if self.buy_num>0: # 現在の株数 self.total_stock = self.total_stock +self.buy_num # 配当の計算 self.total_dividend = self.total_stock * self.dividend # 所持金の計算 self.remaining = self.total_money - self.buy_num * self.stock_price + self.total_dividend # 売った場合 elif self.sell_num>0: # 現在の株数 self.total_stock = self.total_stock - self.sell_num # 配当の計算 self.total_dividend = self.total_stock * self.dividend # 所持金の計算 self.remaining = self.total_money + self.sell_num * self.stock_price + self.total_dividend else: # 配当の計算 self.total_dividend = self.total_stock * self.dividend # 所持金の計算 self.remaining = self.total_money + self.total_dividend # 株主優待の計算 if self.total_stock < 100: self.benefit = 0 elif 100 <= self.total_stock <= 499: self.benefit = 1 else: self.benefit = 3 def final_score(self): self.final_money = self.remaining + self.total_stock * 3500 #株主優待受け取りボタン get = models.CharField(initial=None, choices=['受け取る'], label='', widget=widgets.RadioSelectHorizontal)