from otree.api import * doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'tsumitate_investment' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 4 #決算が好景気(0)不景気(1) SETTLEMENT = [0, 1, 0, 1] #決算が好景気の時のメッセージと悪景気の時のメッセージ SETTLEMENT_MESSAGE = [ '株式市場は盛り上がっており、株式Aと株式Bは共に好決算です!', '株式市場は盛り上がっておらず、株式Aと株式Bは共に悪決算です...' ] #株式Aと株式Bの株価増減 CAPITAL_A = [300, 100] CAPITAL_B = [400, 0] #株式Aの初期値 STOCK_PRICE_A = 4000 #株式Bの初期値 STOCK_PRICE_B = 4000 #インフルエンサーが登場するタイミング 0は登場しない 1が登場する INFLUENCER = [0, 0, 1, 1] #インフルエンサーのメッセージ INFLUENCER_MESSAGE = [ '', '株Bを絶対に買うべきだよーん!' ] #most_choicedから、どのポートフォリオが選択されたかを返す PORTFOLIO = ['BBBB', 'ABBB', 'AABB', 'AAAB', 'AAAA'] class Subsession(BaseSubsession): pass class Group(BaseGroup): most_choiced = models.IntegerField() class Player(BasePlayer): income_stock_choice = models.IntegerField( choices=[ [4, '株式Aを4、株式Bを0積立投資する'], [3, '株式Aを3、株式Bを1積立投資する'], [2, '株式Aを2、株式Bを2積立投資する'], [1, '株式Aを1、株式Bを3積立投資する'], [0, '株式Aを0、株式Bを4積立投資する'] ], verbose_name='あなたが投資する株式のポートフォリオを選んでください。' ) def set_payoff(player:Player): number_A = 0 number_B = 0 amount_A = 0 amount_B = 0 #株式AとBの初期値 stock_price_A = C.STOCK_PRICE_A stock_price_B = C.STOCK_PRICE_B #トータルの株式数*株価から、取得時の株価を引いて利得にする #トータルの株式数*株価の計算 for i in range(player.round_number): #ラウンドiでのプレイヤーを定義 prev_player = player.in_round(i+1) #ラウンドiでプレイヤーが保有している株式数を計算 number_A = number_A + prev_player.income_stock_choice number_B = number_B + 4 - prev_player.income_stock_choice #取得にかかった費用(新しい計算式) amount_A = amount_A + prev_player.income_stock_choice * stock_price_A amount_B = amount_B + (4 - prev_player.income_stock_choice) * stock_price_B stock_price_A = stock_price_A + C.CAPITAL_A[C.SETTLEMENT[prev_player.round_number - 1]] stock_price_B = stock_price_B + C.CAPITAL_B[C.SETTLEMENT[prev_player.round_number - 1]] #訂正版 income_A = number_A * stock_price_A - amount_A income_B = number_B * stock_price_B - amount_B income_total = income_A + income_B player.payoff = income_total def set_payoffs(group: Group): #プレイヤーをリストに入れる a = group.get_players() b = [] #各々のプレイヤーが選択したポートフォリオをリストに格納する for i in range(len(a)): b.append(a[i-1].income_stock_choice) #ポートフォリオが選択された数を辞書に入れる c = {'4': b.count(4), '3': b.count(3), '2': b.count(2), '1': b.count(1), '0': b.count(0)} #一番選択されたポートフォリオの番号を数字で most_choiced に代入 group.most_choiced = int(max(c, key=c.get)) for p in group.get_players(): set_payoff(p) # PAGES class MyPage(Page): pass class ResultsWaitPage(WaitPage): after_all_players_arrive = set_payoffs class DecisionInvestment(Page): form_model = 'player' form_fields = [ 'income_stock_choice' ] class Results(Page): @staticmethod # 誰か使い方を教えて下さい def vars_for_template(player: Player): return dict( my_decision = player.field_display('income_stock_choice'), market_g_b = C.SETTLEMENT_MESSAGE[C.SETTLEMENT[player.round_number - 1]], year = player.round_number, most_choiced = C.PORTFOLIO[player.group.most_choiced] ) page_sequence = [DecisionInvestment, ResultsWaitPage, Results]