from otree.api import * import random import statistics class Constants(BaseConstants): name_in_url = 'app_4_rating_norm' players_per_group = None num_rounds = 1 # 理解性测试答案 question1_answer = 725 question2_answer = 125 question3_answer = 370 question4_answer = 120 question5_answer = 390 question6_answer = 190 class Subsession(BaseSubsession): pass def norm_rating(label): return models.IntegerField( choices=[0, 1, 2, 3, 4, 5], label=label, widget=widgets.RadioSelect, ) def understanding(label): return models.IntegerField( min=0, max=825, label=label, ) class Group(BaseGroup): pass class Player(BasePlayer): # 输入理解性测试答案 question1_entered = understanding('若买方在好的外部经济环境下出价55购买K产品,外部经济状态为好,买方收益为') question2_entered = understanding('此时卖方收益为') question3_entered = understanding('若买方在好的外部经济环境下出价65购买K产品,外部经济状态为不好,买方重新出价70购买G/L产品,卖方提供2单位G产品,3单位L产品,买方收益为') question4_entered = understanding('此时卖方收益为') question5_entered = understanding('若买方在好的外部经济环境下出价35购买K产品,外部经济状态为不好,买方重新出价90购买G/L产品,卖方提供4单位G产品,1单位L产品,买方收益为') question6_entered = understanding('此时卖方收益为') # 计算player猜对rating的数量和收益 score = models.IntegerField() score_payoff = models.CurrencyField() # norm_rating_for_price R_P_60 = norm_rating('若买方出价60,请基于公认的社会道德规范,对买方此行为进行打分') R_P_70 = norm_rating('若买方出价70,请基于公认的社会道德规范,对买方此行为进行打分') R_P_80 = norm_rating('若买方出价80,请基于公认的社会道德规范,对买方此行为进行打分') R_P_90 = norm_rating('若买方出价90,请基于公认的社会道德规范,对买方此行为进行打分') R_P_100 = norm_rating('若买方出价100,请基于公认的社会道德规范,对买方此行为进行打分') R_P_110 = norm_rating('若买方出价110,请基于公认的社会道德规范,对买方此行为进行打分') # P=60,norm_rating_for_quantity R_Q_0_P_60 = norm_rating('若买方出价60,卖方提供0单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_1_P_60 = norm_rating('若买方出价60,卖方提供1单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_2_P_60 = norm_rating('若买方出价60,卖方提供2单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_3_P_60 = norm_rating('若买方出价60,卖方提供3单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_4_P_60 = norm_rating('若买方出价60,卖方提供4单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_5_P_60 = norm_rating('若买方出价60,卖方提供5单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') # P=70,norm_rating_for_quantity R_Q_0_P_70 = norm_rating('若买方出价70,卖方提供0单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_1_P_70 = norm_rating('若买方出价70,卖方提供1单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_2_P_70 = norm_rating('若买方出价70,卖方提供2单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_3_P_70 = norm_rating('若买方出价70,卖方提供3单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_4_P_70 = norm_rating('若买方出价70,卖方提供4单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_5_P_70 = norm_rating('若买方出价70,卖方提供5单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') # P=80,norm_rating_for_quantity R_Q_0_P_80 = norm_rating('若买方出价80,卖方提供0单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_1_P_80 = norm_rating('若买方出价80,卖方提供1单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_2_P_80 = norm_rating('若买方出价80,卖方提供2单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_3_P_80 = norm_rating('若买方出价80,卖方提供3单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_4_P_80 = norm_rating('若买方出价80,卖方提供4单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_5_P_80 = norm_rating('若买方出价80,卖方提供5单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') # P=90,norm_rating_for_quantity R_Q_0_P_90 = norm_rating('若买方出价90,卖方提供0单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_1_P_90 = norm_rating('若买方出价90,卖方提供1单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_2_P_90 = norm_rating('若买方出价90,卖方提供2单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_3_P_90 = norm_rating('若买方出价90,卖方提供3单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_4_P_90 = norm_rating('若买方出价90,卖方提供4单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_5_P_90 = norm_rating('若买方出价90,卖方提供5单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') # P=100,norm_rating_for_quantity R_Q_0_P_100 = norm_rating('若买方出价100,卖方提供0单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_1_P_100 = norm_rating('若买方出价100,卖方提供1单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_2_P_100 = norm_rating('若买方出价100,卖方提供2单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_3_P_100 = norm_rating('若买方出价100,卖方提供3单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_4_P_100 = norm_rating('若买方出价100,卖方提供4单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_5_P_100 = norm_rating('若买方出价100,卖方提供5单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') # P=110,norm_rating_for_quantity R_Q_0_P_110 = norm_rating('若买方出价110,卖方提供0单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_1_P_110 = norm_rating('若买方出价110,卖方提供1单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_2_P_110 = norm_rating('若买方出价110,卖方提供2单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_3_P_110 = norm_rating('若买方出价110,卖方提供3单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_4_P_110 = norm_rating('若买方出价110,卖方提供4单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_5_P_110 = norm_rating('若买方出价110,卖方提供5单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') # Functions def creating_session(subsession): # 每一轮角色保持不变 subsession.group_randomly() for p in subsession.get_players(): p.participant.app_payoffs = {} def set_payoffs(group): players = group.subsession.get_players() for player in players: player.score = 0 # price rating的分数 R_P_60_all = [p.R_P_60 for p in players] R_P_60_mode = statistics.mode(R_P_60_all) if player.R_P_60 == R_P_60_mode: player.score += 1 R_P_70_all = [p.R_P_70 for p in players] R_P_70_mode = statistics.mode(R_P_70_all) if player.R_P_70 == R_P_70_mode: player.score += 1 R_P_80_all = [p.R_P_80 for p in players] R_P_80_mode = statistics.mode(R_P_80_all) if player.R_P_80 == R_P_80_mode: player.score += 1 R_P_90_all = [p.R_P_90 for p in players] R_P_90_mode = statistics.mode(R_P_90_all) if player.R_P_90 == R_P_90_mode: player.score += 1 R_P_100_all = [p.R_P_100 for p in players] R_P_100_mode = statistics.mode(R_P_100_all) if player.R_P_100 == R_P_100_mode: player.score += 1 R_P_110_all = [p.R_P_110 for p in players] R_P_110_mode = statistics.mode(R_P_110_all) if player.R_P_110 == R_P_110_mode: player.score += 1 # P=60时,quantity rating的分数 R_Q_0_P_60_all = [p.R_Q_0_P_60 for p in players] R_Q_0_P_60_mode = statistics.mode(R_Q_0_P_60_all) if player.R_Q_0_P_60 == R_Q_0_P_60_mode: player.score += 1 R_Q_1_P_60_all = [p.R_Q_1_P_60 for p in players] R_Q_1_P_60_mode = statistics.mode(R_Q_1_P_60_all) if player.R_Q_1_P_60 == R_Q_1_P_60_mode: player.score += 1 R_Q_2_P_60_all = [p.R_Q_2_P_60 for p in players] R_Q_2_P_60_mode = statistics.mode(R_Q_2_P_60_all) if player.R_Q_2_P_60 == R_Q_2_P_60_mode: player.score += 1 R_Q_3_P_60_all = [p.R_Q_3_P_60 for p in players] R_Q_3_P_60_mode = statistics.mode(R_Q_3_P_60_all) if player.R_Q_3_P_60 == R_Q_3_P_60_mode: player.score += 1 R_Q_4_P_60_all = [p.R_Q_4_P_60 for p in players] R_Q_4_P_60_mode = statistics.mode(R_Q_4_P_60_all) if player.R_Q_4_P_60 == R_Q_4_P_60_mode: player.score += 1 R_Q_5_P_60_all = [p.R_Q_5_P_60 for p in players] R_Q_5_P_60_mode = statistics.mode(R_Q_5_P_60_all) if player.R_Q_5_P_60 == R_Q_5_P_60_mode: player.score += 1 # P=70时,quantity rating的分数 R_Q_0_P_70_all = [p.R_Q_0_P_70 for p in players] R_Q_0_P_70_mode = statistics.mode(R_Q_0_P_70_all) if player.R_Q_0_P_70 == R_Q_0_P_70_mode: player.score += 1 R_Q_1_P_70_all = [p.R_Q_1_P_70 for p in players] R_Q_1_P_70_mode = statistics.mode(R_Q_1_P_70_all) if player.R_Q_1_P_70 == R_Q_1_P_70_mode: player.score += 1 R_Q_2_P_70_all = [p.R_Q_2_P_70 for p in players] R_Q_2_P_70_mode = statistics.mode(R_Q_2_P_70_all) if player.R_Q_2_P_70 == R_Q_2_P_70_mode: player.score += 1 R_Q_3_P_70_all = [p.R_Q_3_P_70 for p in players] R_Q_3_P_70_mode = statistics.mode(R_Q_3_P_70_all) if player.R_Q_3_P_70 == R_Q_3_P_70_mode: player.score += 1 R_Q_4_P_70_all = [p.R_Q_4_P_70 for p in players] R_Q_4_P_70_mode = statistics.mode(R_Q_4_P_70_all) if player.R_Q_4_P_70 == R_Q_4_P_70_mode: player.score += 1 R_Q_5_P_70_all = [p.R_Q_5_P_70 for p in players] R_Q_5_P_70_mode = statistics.mode(R_Q_5_P_70_all) if player.R_Q_5_P_70 == R_Q_5_P_70_mode: player.score += 1 # P=80时,quantity rating的分数 R_Q_0_P_80_all = [p.R_Q_0_P_80 for p in players] R_Q_0_P_80_mode = statistics.mode(R_Q_0_P_80_all) if player.R_Q_0_P_80 == R_Q_0_P_80_mode: player.score += 1 R_Q_1_P_80_all = [p.R_Q_1_P_80 for p in players] R_Q_1_P_80_mode = statistics.mode(R_Q_1_P_80_all) if player.R_Q_1_P_80 == R_Q_1_P_80_mode: player.score += 1 R_Q_2_P_80_all = [p.R_Q_2_P_80 for p in players] R_Q_2_P_80_mode = statistics.mode(R_Q_2_P_80_all) if player.R_Q_2_P_80 == R_Q_2_P_80_mode: player.score += 1 R_Q_3_P_80_all = [p.R_Q_3_P_80 for p in players] R_Q_3_P_80_mode = statistics.mode(R_Q_3_P_80_all) if player.R_Q_3_P_80 == R_Q_3_P_80_mode: player.score += 1 R_Q_4_P_80_all = [p.R_Q_4_P_80 for p in players] R_Q_4_P_80_mode = statistics.mode(R_Q_4_P_80_all) if player.R_Q_4_P_80 == R_Q_4_P_80_mode: player.score += 1 R_Q_5_P_80_all = [p.R_Q_5_P_80 for p in players] R_Q_5_P_80_mode = statistics.mode(R_Q_5_P_80_all) if player.R_Q_5_P_80 == R_Q_5_P_80_mode: player.score += 1 # P=90时,quantity rating的分数 R_Q_0_P_90_all = [p.R_Q_0_P_90 for p in players] R_Q_0_P_90_mode = statistics.mode(R_Q_0_P_90_all) if player.R_Q_0_P_90 == R_Q_0_P_90_mode: player.score += 1 R_Q_1_P_90_all = [p.R_Q_1_P_90 for p in players] R_Q_1_P_90_mode = statistics.mode(R_Q_1_P_90_all) if player.R_Q_1_P_90 == R_Q_1_P_90_mode: player.score += 1 R_Q_2_P_90_all = [p.R_Q_2_P_90 for p in players] R_Q_2_P_90_mode = statistics.mode(R_Q_2_P_90_all) if player.R_Q_2_P_90 == R_Q_2_P_90_mode: player.score += 1 R_Q_3_P_90_all = [p.R_Q_3_P_90 for p in players] R_Q_3_P_90_mode = statistics.mode(R_Q_3_P_90_all) if player.R_Q_3_P_90 == R_Q_3_P_90_mode: player.score += 1 R_Q_4_P_90_all = [p.R_Q_4_P_90 for p in players] R_Q_4_P_90_mode = statistics.mode(R_Q_4_P_90_all) if player.R_Q_4_P_90 == R_Q_4_P_90_mode: player.score += 1 R_Q_5_P_90_all = [p.R_Q_5_P_90 for p in players] R_Q_5_P_90_mode = statistics.mode(R_Q_5_P_90_all) if player.R_Q_5_P_90 == R_Q_5_P_90_mode: player.score += 1 # P=100时,quantity rating的分数 R_Q_0_P_100_all = [p.R_Q_0_P_100 for p in players] R_Q_0_P_100_mode = statistics.mode(R_Q_0_P_100_all) if player.R_Q_0_P_100 == R_Q_0_P_100_mode: player.score += 1 R_Q_1_P_100_all = [p.R_Q_1_P_100 for p in players] R_Q_1_P_100_mode = statistics.mode(R_Q_1_P_100_all) if player.R_Q_1_P_100 == R_Q_1_P_100_mode: player.score += 1 R_Q_2_P_100_all = [p.R_Q_2_P_100 for p in players] R_Q_2_P_100_mode = statistics.mode(R_Q_2_P_100_all) if player.R_Q_2_P_100 == R_Q_2_P_100_mode: player.score += 1 R_Q_3_P_100_all = [p.R_Q_3_P_100 for p in players] R_Q_3_P_100_mode = statistics.mode(R_Q_3_P_100_all) if player.R_Q_3_P_100 == R_Q_3_P_100_mode: player.score += 1 R_Q_4_P_100_all = [p.R_Q_4_P_100 for p in players] R_Q_4_P_100_mode = statistics.mode(R_Q_4_P_100_all) if player.R_Q_4_P_100 == R_Q_4_P_100_mode: player.score += 1 R_Q_5_P_100_all = [p.R_Q_5_P_100 for p in players] R_Q_5_P_100_mode = statistics.mode(R_Q_5_P_100_all) if player.R_Q_5_P_100 == R_Q_5_P_100_mode: player.score += 1 # P=110时,quantity rating的分数 R_Q_0_P_110_all = [p.R_Q_0_P_110 for p in players] R_Q_0_P_110_mode = statistics.mode(R_Q_0_P_110_all) if player.R_Q_0_P_110 == R_Q_0_P_110_mode: player.score += 1 R_Q_1_P_110_all = [p.R_Q_1_P_110 for p in players] R_Q_1_P_110_mode = statistics.mode(R_Q_1_P_110_all) if player.R_Q_1_P_110 == R_Q_1_P_110_mode: player.score += 1 R_Q_2_P_110_all = [p.R_Q_2_P_110 for p in players] R_Q_2_P_110_mode = statistics.mode(R_Q_2_P_110_all) if player.R_Q_2_P_110 == R_Q_2_P_110_mode: player.score += 1 R_Q_3_P_110_all = [p.R_Q_3_P_110 for p in players] R_Q_3_P_110_mode = statistics.mode(R_Q_3_P_110_all) if player.R_Q_3_P_110 == R_Q_3_P_110_mode: player.score += 1 R_Q_4_P_110_all = [p.R_Q_4_P_110 for p in players] R_Q_4_P_110_mode = statistics.mode(R_Q_4_P_110_all) if player.R_Q_4_P_110 == R_Q_4_P_110_mode: player.score += 1 R_Q_5_P_110_all = [p.R_Q_5_P_110 for p in players] R_Q_5_P_110_mode = statistics.mode(R_Q_5_P_110_all) if player.R_Q_5_P_110 == R_Q_5_P_110_mode: player.score += 1 # 计算seller/buyer每一轮的收益:交易收益+预测收益+rating收益 player.score_payoff = cu(10) * player.score class Welcome(Page): pass class Welcome_design(Page): pass class task(Page): form_model = 'player' form_fields = ['question1_entered', 'question2_entered', 'question3_entered', 'question4_entered', 'question5_entered', 'question6_entered'] @staticmethod def error_message(player, values): if values['question1_entered'] != Constants.question1_answer: return '计算有误,请仔细检查并更正!' if values['question2_entered'] != Constants.question2_answer: return '计算有误,请仔细检查并更正!' if values['question3_entered'] != Constants.question3_answer: return '计算有误,请仔细检查并更正!' if values['question4_entered'] != Constants.question4_answer: return '计算有误,请仔细检查并更正!' if values['question5_entered'] != Constants.question5_answer: return '计算有误,请仔细检查并更正!' if values['question6_entered'] != Constants.question6_answer: return '计算有误,请仔细检查并更正!' class Rating_Price_Bad(Page): form_model = 'player' form_fields = ['R_P_60', 'R_P_70', 'R_P_80', 'R_P_90', 'R_P_100', 'R_P_110'] class Rating_Quantity_P_60(Page): form_model = 'player' form_fields = ['R_Q_0_P_60', 'R_Q_1_P_60', 'R_Q_2_P_60', 'R_Q_3_P_60', 'R_Q_4_P_60', 'R_Q_5_P_60'] class Rating_Quantity_P_70(Page): form_model = 'player' form_fields = ['R_Q_0_P_70', 'R_Q_1_P_70', 'R_Q_2_P_70', 'R_Q_3_P_70', 'R_Q_4_P_70', 'R_Q_5_P_70'] class Rating_Quantity_P_80(Page): form_model = 'player' form_fields = ['R_Q_0_P_80', 'R_Q_1_P_80', 'R_Q_2_P_80', 'R_Q_3_P_80', 'R_Q_4_P_80', 'R_Q_5_P_80'] class Rating_Quantity_P_90(Page): form_model = 'player' form_fields = ['R_Q_0_P_90', 'R_Q_1_P_90', 'R_Q_2_P_90', 'R_Q_3_P_90', 'R_Q_4_P_90', 'R_Q_5_P_90'] class Rating_Quantity_P_100(Page): form_model = 'player' form_fields = ['R_Q_0_P_100', 'R_Q_1_P_100', 'R_Q_2_P_100', 'R_Q_3_P_100', 'R_Q_4_P_100', 'R_Q_5_P_100'] class Rating_Quantity_P_110(Page): form_model = 'player' form_fields = ['R_Q_0_P_110', 'R_Q_1_P_110', 'R_Q_2_P_110', 'R_Q_3_P_110', 'R_Q_4_P_110', 'R_Q_5_P_110'] class WaitForResults(WaitPage): after_all_players_arrive = set_payoffs class Results(Page): pass class WaitforAPP5(WaitPage): @staticmethod def after_all_players_arrive(group: Group): for p in group.get_players(): participant = p.participant participant.past_group_id = group.id participant.app_payoffs['app_4_rating_norm'] = p.score_payoff page_sequence = [ Welcome, Welcome_design, task, Rating_Price_Bad, Rating_Quantity_P_60, Rating_Quantity_P_70, Rating_Quantity_P_80, Rating_Quantity_P_90, Rating_Quantity_P_100, Rating_Quantity_P_110, WaitForResults, Results, WaitforAPP5 ]