from otree.api import * c = cu doc = '' class C(BaseConstants): NAME_IN_URL = 'main' PLAYERS_PER_GROUP = None NUM_ROUNDS = 3 class Subsession(BaseSubsession): pass def plan_a(subsession: Subsession): return 0.4, 0.12, 0.06 def plan_b(subsession: Subsession): return 0.5, 0.07, 0.046 class Group(BaseGroup): pass class Player(BasePlayer): A_or_B = models.StringField(choices=[['A', '方案A'], ['B', '方案B']]) amount = models.IntegerField() reason = models.StringField(choices=[['A','个人原因(心态、风险偏好等)'],['B','外部环境(如金融市场表现)'],['C','其它']]) reason1 = models.LongStringField() again = models.BooleanField() endowment_change = models.FloatField() name = models.LongStringField() def get_endowment(player: Player): if player.round_number == 1: return 100 else: init = 100 for i in range(1, player.round_number): init += player.in_round(i).endowment_change return init def investment_result(player: Player): session = player.session subsession = player.subsession choose = player.A_or_B amount = player.amount if choose == "A": p, win_rate, lose_rate = plan_a(subsession) else: p, win_rate, lose_rate = plan_b(subsession) import random test = random.random() if test <= p: player.endowment_change = amount * win_rate else: player.endowment_change = amount * lose_rate * (-1) def amount_choices(player: Player): init = 0 choices = [] while init <= get_endowment(player): choices.append(init) init += 10 return choices def get_plan_str(player: Player, plan): if plan=='A': p, win_rate, lose_rate = plan_a(player.subsession) else: p, win_rate, lose_rate = plan_b(player.subsession) return "请按照走势图进行选择" def result_str(player: Player): if player.endowment_change > 0: return "投资成功,收益为{}".format(player.endowment_change) else: return "投资失败,损失为{}".format(-player.endowment_change) class Choose(Page): form_model = 'player' form_fields = ['A_or_B', 'amount'] @staticmethod def before_next_page(player: Player, timeout_happened): investment_result(player) @staticmethod def vars_for_template(player): return dict( amount=get_endowment(player), plan_a=get_plan_str(player, "A"), plan_b=get_plan_str(player, "B"), ) class Survey(Page): form_model = 'player' form_fields = ['reason','reason1','name', 'again'] @staticmethod def is_displayed(player: Player): return player.round_number != 3 @staticmethod def vars_for_template(player): return dict( result=result_str(player), ) class End(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 3 @staticmethod def vars_for_template(player): return dict( result=get_endowment(player)+player.endowment_change, ) page_sequence = [Choose, Survey, End]