from otree.api import * import random class Constants(BaseConstants): # 用 dataframe import random import pandas as pd SV_grouping_fix = pd.DataFrame([(2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0), (0, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0), (0, 0, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0), (0, 0, 0, 2, 2, 2, 2, 2, 1, 1, 1, 1), (1, 0, 0, 0, 2, 2, 2, 2, 2, 1, 1, 1), (1, 1, 0, 0, 0, 2, 2, 2, 2, 2, 1, 1), (1, 1, 1, 0, 0, 0, 2, 2, 2, 2, 2, 1), (1, 1, 1, 1, 0, 0, 0, 2, 2, 2, 2, 2), (2, 1, 1, 1, 1, 0, 0, 0, 2, 2, 2, 2), (2, 2, 1, 1, 1, 1, 0, 0, 0, 2, 2, 2), (2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 2, 2), (2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 2), (2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0), (0, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0), (0, 0, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0), (0, 0, 0, 2, 2, 2, 2, 2, 1, 1, 1, 1), (1, 0, 0, 0, 2, 2, 2, 2, 2, 1, 1, 1), (1, 1, 0, 0, 0, 2, 2, 2, 2, 2, 1, 1), (1, 1, 1, 0, 0, 0, 2, 2, 2, 2, 2, 1), (1, 1, 1, 1, 0, 0, 0, 2, 2, 2, 2, 2), (2, 1, 1, 1, 1, 0, 0, 0, 2, 2, 2, 2), (2, 2, 1, 1, 1, 1, 0, 0, 0, 2, 2, 2), (2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 2, 2), (2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 2), ], columns=('Player1', 'Player2', 'Player3', 'Player4', 'Player5', 'Player6', 'Player7', 'Player8', 'Player9', 'Player10', 'Player11', 'Player12')) print(SV_grouping_fix) SV_grouping_fix_T = pd.DataFrame(SV_grouping_fix.values.T) print(SV_grouping_fix_T) import numpy as np SV_grouping_random1_T = pd.DataFrame(np.random.permutation((2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0), ), columns=['1_T']) SV_grouping_random2_T = pd.DataFrame(np.random.permutation((2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0), ), columns=['2_T']) SV_grouping_random3_T = pd.DataFrame(np.random.permutation((2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0), ), columns=['3_T']) SV_grouping_random4_T = pd.DataFrame(np.random.permutation((2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0), ), columns=['4_T']) SV_grouping_random5_T = pd.DataFrame(np.random.permutation((2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0), ), columns=['5_T']) SV_grouping_random6_T = pd.DataFrame(np.random.permutation((2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0), ), columns=['6_T']) print(SV_grouping_random1_T) SV_grouping_random_T = pd.concat( [SV_grouping_random1_T, SV_grouping_random2_T, SV_grouping_random3_T, SV_grouping_random4_T, SV_grouping_random5_T, SV_grouping_random6_T], sort=False, axis=1) print(SV_grouping_random_T) SV_grouping_random = pd.DataFrame(SV_grouping_random_T.values.T, columns=( 'Player1', 'Player2', 'Player3', 'Player4', 'Player5', 'Player6', 'Player7', 'Player8', 'Player9', 'Player10', 'Player11', 'Player12')) print(SV_grouping_random) SV_grouping_T = pd.concat([SV_grouping_fix_T, SV_grouping_random_T], sort=False, axis=1) # 創好 30 rows * 12 columns 的 dataframe SV_grouping = pd.DataFrame(SV_grouping_T.values.T, columns=( 'Player1', 'Player2', 'Player3', 'Player4', 'Player5', 'Player6', 'Player7', 'Player8', 'Player9', 'Player10', 'Player11', 'Player12')) print('SV_U_seq 的 30 回合為') print(SV_grouping) # 多少 rounds num_rounds = len(SV_grouping) # 打亂 round_order = list(range(1, num_rounds+1)) random.shuffle(round_order) # SV_grouping_shuffle = SV_grouping.sample(frac=1) print('SV_U_seq 洗亂的 30 回合為') print(SV_grouping_shuffle) #用 excel import csv import math # use this if you want a 3 rounds game # with open('SV_U_seq/SV_group_3.csv', 'r') as para: #use this if you want a 30 rounds game # with open('SV_U_seq/SV_group.csv', 'r') as para: # para = list(csv.DictReader(para)) # print(para) # num_rounds = len(para) # number of row #總回合數 = csv 裡有多少 rows # print(num_rounds) # players_per_group = len(para[0]) - 1 # number of column-1 #設定受試者人數 # print(players_per_group) # round_order = list(range(1, num_rounds + 1)) # random.shuffle(round_order) name_in_url = 'SV_U_seq' players_per_group = 12 # 報酬 exchange_rate = 14 attendance_fee = 100 # 定義乘數 MULTIPLIER1 = 12 MULTIPLIER2 = 9 MULTIPLIER3 = 2 class Subsession(BaseSubsession): # 記錄抽到的 round selected_round = models.IntegerField(initial=0) round_row = models.IntegerField(initial=0) class Group(BaseGroup): # 隨機抽三種情形的一種 random_table = models.IntegerField(initial=0) # 計算票數 num_vote_alpha = models.IntegerField(initial=0) num_vote_beta = models.IntegerField(initial=0) num_vote_gamma = models.IntegerField(initial=0) vote_result = models.IntegerField(min=1, max=3, initial=1) vote_result_str = models.StringField(initial='a') # 判斷現在第幾回合 round_index = models.IntegerField(initial=0) class Player(BasePlayer): vote = models.IntegerField( choices=[[1, ' α '], [2, ' β '], [3, ' γ ']], widget=widgets.RadioSelectHorizontal, label="您想要選擇哪一個選項?", initial=0, ) # 定義random_table變數在class Player, a類=1, b類=2, c類=3 random_group = models.IntegerField(min=1, max=3) # 判斷玩家在第幾階段, 1:第一階段, 0:第二階段 is_S1 = models.IntegerField(min=0, max=1, initial=0) # 紀錄抽到的回合是哪個table ( 5/4/3, 4/3/5, 3/5/4 ) random_table = models.IntegerField(initial=0) # 紀錄抽到的是哪個回合 random_round = models.IntegerField(initial=0) player_in_selected_round = models.IntegerField(initial=0) # 紀錄抽到回合的總票數 ( alpha, beta, gamma ) num_vote_alpha = models.IntegerField(initial=0) num_vote_beta = models.IntegerField(initial=0) num_vote_gamma = models.IntegerField(initial=0) # 紀錄抽到的回合的法幣 final_payoff = models.IntegerField(initial=0) # 紀錄抽到的回合的新台幣 total_pay_yuan = models.IntegerField(initial=0) is_large_team = models.BooleanField(initial=0) # 判斷是否在大組 is_med_team = models.BooleanField(initial=0) # 判斷是否在中組 is_small_team = models.BooleanField(initial=0) # 判斷是否在小組 team_num = models.IntegerField(initial=3) # 紀錄大/中/小組,2=大,1=中,0=小 # FUNCTIONS **(一個function只能做一件事)** # 抽三種環境 def random_tables(group: Group): group.random_table = random.randint(1, 3) def creating_session(subsession: Subsession): global S1_big, S1_med, selected_round import random session = subsession.session # subsession.round_row = Constants.round_order[subsession.round_number-1] # 現在第幾回合就抽第幾 row if subsession.round_number == 1: selected_round = Constants.SV_grouping_shuffle.iloc[0] elif subsession.round_number == 2: selected_round = Constants.SV_grouping_shuffle.iloc[1] elif subsession.round_number == 3: selected_round = Constants.SV_grouping_shuffle.iloc[2] elif subsession.round_number == 4: selected_round = Constants.SV_grouping_shuffle.iloc[3] elif subsession.round_number == 5: selected_round = Constants.SV_grouping_shuffle.iloc[4] elif subsession.round_number == 6: selected_round = Constants.SV_grouping_shuffle.iloc[5] elif subsession.round_number == 7: selected_round = Constants.SV_grouping_shuffle.iloc[6] elif subsession.round_number == 8: selected_round = Constants.SV_grouping_shuffle.iloc[7] elif subsession.round_number == 9: selected_round = Constants.SV_grouping_shuffle.iloc[8] elif subsession.round_number == 10: selected_round = Constants.SV_grouping_shuffle.iloc[9] elif subsession.round_number == 11: selected_round = Constants.SV_grouping_shuffle.iloc[10] elif subsession.round_number == 12: selected_round = Constants.SV_grouping_shuffle.iloc[11] elif subsession.round_number == 13: selected_round = Constants.SV_grouping_shuffle.iloc[12] elif subsession.round_number == 14: selected_round = Constants.SV_grouping_shuffle.iloc[13] elif subsession.round_number == 15: selected_round = Constants.SV_grouping_shuffle.iloc[14] elif subsession.round_number == 16: selected_round = Constants.SV_grouping_shuffle.iloc[15] elif subsession.round_number == 17: selected_round = Constants.SV_grouping_shuffle.iloc[16] elif subsession.round_number == 18: selected_round = Constants.SV_grouping_shuffle.iloc[17] elif subsession.round_number == 19: selected_round = Constants.SV_grouping_shuffle.iloc[18] elif subsession.round_number == 20: selected_round = Constants.SV_grouping_shuffle.iloc[19] elif subsession.round_number == 21: selected_round = Constants.SV_grouping_shuffle.iloc[20] elif subsession.round_number == 22: selected_round = Constants.SV_grouping_shuffle.iloc[21] elif subsession.round_number == 23: selected_round = Constants.SV_grouping_shuffle.iloc[22] elif subsession.round_number == 24: selected_round = Constants.SV_grouping_shuffle.iloc[23] elif subsession.round_number == 25: selected_round = Constants.SV_grouping_shuffle.iloc[24] elif subsession.round_number == 26: selected_round = Constants.SV_grouping_shuffle.iloc[25] elif subsession.round_number == 27: selected_round = Constants.SV_grouping_shuffle.iloc[26] elif subsession.round_number == 28: selected_round = Constants.SV_grouping_shuffle.iloc[27] elif subsession.round_number == 29: selected_round = Constants.SV_grouping_shuffle.iloc[28] elif subsession.round_number == 30: selected_round = Constants.SV_grouping_shuffle.iloc[29] for p in subsession.get_players(): p.is_large_team = selected_round['Player' + str(p.id_in_group)] == 2 p.is_med_team = selected_round['Player' + str(p.id_in_group)] == 1 p.is_small_team = selected_round['Player' + str(p.id_in_group)] == 0 # list all_list = [p.id_in_group for p in subsession.get_players()] # 創大組的 list large_list = [] for p in subsession.get_players(): if p.is_large_team == 1: large_list.append(p.id_in_group) if len(large_list) == 5: # 創好大組的 List S1_big = random.sample(large_list, 2) print(large_list) # 創中組的 list med_list = [] for p in subsession.get_players(): if p.is_med_team == 1: med_list.append(p.id_in_group) if len(med_list) == 4: # 創好中組的 List S1_med = random.sample(med_list, 2) print(med_list) # 創小組的 list small_list = [] for p in subsession.get_players(): if p.is_small_team == 1: small_list.append(p.id_in_group) if len(small_list) == 3: # 創好小組的 List print(small_list) #可以用但要改成 迴圈 每回合都要有結果 # 抽第一階段4人 # S1_big = random.sample(large_list, 2) # S1_med = random.sample(med_list, 2) S1 = list(S1_big + S1_med) # 第二階段8人 S2 = list(set(all_list) - set(S1)) for p in subsession.get_players(): if p.id_in_group in S1: p.is_S1 = 1 elif p.id_in_group in S2: p.is_S1 = 0 print(S1) print(S2) for p in subsession.get_players(): # a=5, b=4, c=3 if p.group.random_table == 1: if p.is_large_team == 1: # 如果id = 抽到的5人 (大組) p.random_group = 1 p.random_table = 1 elif p.is_med_team == 1: # 如果id = 抽到的4人 (中組) p.random_group = 2 p.random_table = 1 elif p.is_small_team == 1: # 如果id = 抽到的3人 (小組) p.random_group = 3 p.random_table = 1 # a=4, b=3, c=5 elif p.group.random_table == 2: if p.is_large_team == 1: # 如果id = 抽到的五人 p.random_group = 3 p.random_table = 2 elif p.is_med_team == 1: # 如果id = 抽到的4人 p.random_group = 1 p.random_table = 2 elif p.is_small_team == 1: # 如果id = 抽到的3人 p.random_group = 2 p.random_table = 2 # a=3, b=5, c=4 elif p.group.random_table == 3: if p.is_large_team == 1: # 如果id = 抽到的五人 p.random_group = 2 p.random_table = 3 elif p.is_med_team == 1: # 如果id = 抽到的4人 p.random_group = 3 p.random_table = 3 elif p.is_small_team == 1: # 如果id = 抽到的3人 p.random_group = 1 p.random_table = 3 # grouping_list = [2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0] # #事先排好 # for i in range(1, 25): # round_order = i # grouping_list.insert(0, grouping_list.pop()) # print(grouping_list) # # #隨機抽 # for i in range(25, 31): # round_order = i # random.shuffle(grouping_list) # print(grouping_list) # # #抽該回合要用哪個 list # round_order_list = list(range(1, 31)) # random.shuffle(round_order_list) # for i in range(1, 31): # round_order_draw = round_order_list[0] # 該回合要用哪一種抽法 # if len(round_order_list) >= 1: # del round_order_list[0] # if round_order_draw == round_order: # # # #對應 player_id 和 grouping_list + 判斷大中小組 # #接在抽完 grouping_list 後 # all_list = [p.id_in_group for p in subsession.get_players()] # large_list = [] # med_list = [] # small_list = [] # for p in subsession.get_players(): # team_num = grouping_list[p.id_in_group - 1] # if team_num == 2: # p.is_large_team = 1 # large_list.append(p.id_in_group) # if len(large_list) == 5: # 創好大組的 List # S1_big = random.sample(large_list, 2) # elif team_num == 1: # p.is_med_team = 1 # med_list.append(p.id_in_group) # if len(med_list) == 4: # 創好中組的 List # S1_med = random.sample(med_list, 2) # elif team_num == 0: # p.is_small_team = 1 # small_list.append(p.id_in_group) # # S1 = list(S1_big + S1_med) # S2 = list(set(all_list) - set(S1)) # # for p in subsession.get_players(): # if p.id_in_group in S1: # p.is_S1 = 1 # elif p.id_in_group in S2: # p.is_S1 = 0 # print(S1) # print(S2) # # for p in subsession.get_players(): # # a=5, b=4, c=3 # if p.group.random_table == 1: # if p.is_large_team == 1: # 如果id = 抽到的5人 (大組) # p.random_group = 1 # p.random_table = 1 # elif p.is_med_team == 1: # 如果id = 抽到的4人 (中組) # p.random_group = 2 # p.random_table = 1 # elif p.is_small_team == 1: # 如果id = 抽到的3人 (小組) # p.random_group = 3 # p.random_table = 1 # # # a=4, b=3, c=5 # elif p.group.random_table == 2: # if p.is_large_team == 1: # 如果id = 抽到的五人 # p.random_group = 3 # p.random_table = 2 # elif p.is_med_team == 1: # 如果id = 抽到的4人 # p.random_group = 1 # p.random_table = 2 # elif p.is_small_team == 1: # 如果id = 抽到的3人 # p.random_group = 2 # p.random_table = 2 # # # a=3, b=5, c=4 # elif p.group.random_table == 3: # if p.is_large_team == 1: # 如果id = 抽到的五人 # p.random_group = 2 # p.random_table = 3 # elif p.is_med_team == 1: # 如果id = 抽到的4人 # p.random_group = 3 # p.random_table = 3 # elif p.is_small_team == 1: # 如果id = 抽到的3人 # p.random_group = 1 # p.random_table = 3 # # 原本的抽大、中、小組 # def grouping(group: Group): # 判斷要用哪種抽法 # # # # 從12人中抽5(大)、再4(中)、再3(小) # # 產生id: 1-12 # p_id0 = list(range(1, 13)) # print(p_id0) # # # 抽5人 # random_big = random.sample(p_id0, 5) # print(random_big) # # p_id1 = list(set(p_id0) - set(random_big)) # print(p_id1) # # # 抽4人 # random_med = random.sample(p_id1, 4) # print(random_med) # # # 抽3人 # random_smol = list(set(p_id1) - set(random_med)) # print(random_smol) # # # 抽第一階段4人 # S1_big = random.sample(random_big, 2) # S1_med = random.sample(random_med, 2) # print(S1_big) # print(S1_med) # # S1 = list(S1_big + S1_med) # # # 第二階段8人 # S2 = list(set(p_id0) - set(S1)) # # print(S1) # print(S2) # # # 開始分組5/4/3 # players = group.get_players() # 定義players for 下行的迴圈 # # for p in players: # # a=5, b=4, c=3 # if p.group.random_table == 1: # if p.id_in_group in random_big: # 如果id = 抽到的5人 # p.random_group = 1 # p.random_table = 1 # elif p.id_in_group in random_med: # 如果id = 抽到的4人 # p.random_group = 2 # p.random_table = 1 # elif p.id_in_group in random_smol: # 如果id = 抽到的3人 # p.random_group = 3 # p.random_table = 1 # # # a=4, b=3, c=5 # elif p.group.random_table == 2: # if p.id_in_group in random_big: # 如果id = 抽到的五人 # p.random_group = 3 # p.random_table = 2 # elif p.id_in_group in random_med: # 如果id = 抽到的4人 # p.random_group = 1 # p.random_table = 2 # elif p.id_in_group in random_smol: # 如果id = 抽到的3人 # p.random_group = 2 # p.random_table = 2 # # # a=3, b=5, c=4 # elif p.group.random_table == 3: # if p.id_in_group in random_big: # 如果id = 抽到的五人 # p.random_group = 2 # p.random_table = 3 # elif p.id_in_group in random_med: # 如果id = 抽到的4人 # p.random_group = 3 # p.random_table = 3 # elif p.id_in_group in random_smol: # 如果id = 抽到的3人 # p.random_group = 1 # p.random_table = 3 # # for p in players: # if p.id_in_group in S1: # p.is_S1 = 1 # elif p.id_in_group in S2: # p.is_S1 = 0 def count_votes(group: Group): # 統計總票數 players = group.get_players() # 定義players for 下行的迴圈 votes = [p.vote for p in players] # 定義votes是player這個class下的vote變數,每個受試者跑迴圈紀錄投下的票 group.num_vote_alpha = votes.count(1) # 計算alpha總票數 group.num_vote_beta = votes.count(2) # 計算beta總票數 group.num_vote_gamma = votes.count(3) # 計算gamma總票數 for p in players: p.num_vote_alpha = group.num_vote_alpha p.num_vote_beta = group.num_vote_beta p.num_vote_gamma = group.num_vote_gamma # 判斷誰贏(計算票數) # alpha贏 if group.num_vote_alpha > group.num_vote_beta and group.num_vote_alpha > group.num_vote_gamma: group.vote_result_str = "本回合選項 α 為最多人選擇的選項" group.vote_result = 1 return 'Candidate α wins' # beta贏 elif group.num_vote_beta > group.num_vote_alpha and group.num_vote_beta > group.num_vote_gamma: group.vote_result_str = "本回合選項 β 為最多人選擇的選項" group.vote_result = 2 return 'Candidate β wins' # gamma贏 elif group.num_vote_gamma > group.num_vote_alpha and group.num_vote_gamma > group.num_vote_beta: group.vote_result_str = "本回合選項 γ 為最多人選擇的選項" group.vote_result = 3 return 'Candidate γ wins' # a, b平手 elif group.num_vote_alpha == group.num_vote_beta and group.num_vote_alpha > group.num_vote_gamma: # 隨機抽1,2 group.vote_result = random.randint(1, 2) # 抽到a贏 if group.vote_result == 1: group.vote_result_str = "選項 α 和 選項 β 平手,由電腦隨機抽出的結果是:選項 α 為最多人選擇的選項" return 'tie Candidate α wins' # 抽到b贏 elif group.vote_result == 2: group.vote_result_str = "選項 α 和 選項 β 平手,由電腦隨機抽出的結果是:選項 β 為最多人選擇的選項" return 'tie Candidate β wins' # a, r平手 elif group.num_vote_alpha == group.num_vote_gamma and group.num_vote_alpha > group.num_vote_beta: # 隨機抽1,3 list = [1, 3] group.vote_result = random.choice(list) # 抽到a贏 if group.vote_result == 1: group.vote_result_str = "選項 α 和 選項 γ 平手,由電腦隨機抽出的結果是:選項 α 為最多人選擇的選項" return 'tie Candidate α wins' # 抽到r贏 elif group.vote_result == 3: group.vote_result_str = "選項 α 和 選項 γ 平手,由電腦隨機抽出的結果是:選項 γ 為最多人選擇的選項" return 'tie Candidate γ wins' # b, r平手 elif group.num_vote_gamma == group.num_vote_beta and group.num_vote_beta > group.num_vote_alpha: # 隨機抽2,3 group.vote_result = random.randint(2, 3) # 抽到b贏 if group.vote_result == 2: group.vote_result_str = "選項 β 和 選項 γ 平手,由電腦隨機抽出的結果是:選項 β 為最多人選擇的選項" return 'tie Candidate β wins' # 抽到r贏 elif group.vote_result == 3: group.vote_result_str = "選項 β 和 選項 γ 平手,由電腦隨機抽出的結果是:選項 γ 為最多人選擇的選項" return 'tie Candidate γ wins' # a, b, r三人平手 elif group.num_vote_alpha == group.num_vote_beta and group.num_vote_alpha == group.num_vote_gamma and group.num_vote_beta == group.num_vote_gamma: # 隨機抽1, 2, 3 group.vote_result = random.randint(1, 3) # 抽到a贏 if group.vote_result == 1: group.vote_result_str = "選項 α 、選項 β 、選項 γ 三者平手,由電腦隨機抽出的結果是:選項 α 為最多人選擇的選項" return 'tie Candidate α wins' # 抽到b贏 elif group.vote_result == 2: group.vote_result_str = "選項 α 、選項 β 、選項 γ 三者平手,由電腦隨機抽出的結果是:選項 β 為最多人選擇的選項" return 'tie Candidate β wins' # 抽到r贏 elif group.vote_result == 3: group.vote_result_str = "選項 α 、選項 β 、選項 γ 三者平手,由電腦隨機抽出的結果是:選項 γ 為最多人選擇的選項" return 'tie Candidate γ wins' def set_payoffs(group: Group): players = group.get_players() # 定義players for 下行的迴圈 # 計算每人每回合報酬 for p in players: # alpha贏 if p.group.vote_result == 1: # Voter type a if p.random_group == 1: p.payoff = 1 * Constants.MULTIPLIER1 # Voter type b elif p.random_group == 2: p.payoff = 1 * Constants.MULTIPLIER2 # Voter type c elif p.random_group == 3: p.payoff = 1 * Constants.MULTIPLIER3 # beta贏 elif group.vote_result == 2: # Voter type a if p.random_group == 1: p.payoff = 1 * Constants.MULTIPLIER3 # Voter type b elif p.random_group == 2: p.payoff = 1 * Constants.MULTIPLIER1 # Voter type c elif p.random_group == 3: p.payoff = 1 * Constants.MULTIPLIER2 # gamma贏 elif group.vote_result == 3: # Voter type a if p.random_group == 1: p.payoff = 1 * Constants.MULTIPLIER2 # Voter type b elif p.random_group == 2: p.payoff = 1 * Constants.MULTIPLIER3 # Voter type c elif p.random_group == 3: p.payoff = 1 * Constants.MULTIPLIER1 # 抽結算回合 def draw_round(subsession: Subsession): if subsession.round_number == Constants.num_rounds: subsession.selected_round = random.randint(1, Constants.num_rounds) for p in subsession.get_players(): p.random_round = subsession.selected_round # PAGES class Ready(Page): pass class Game1S1(Page): form_model = 'player' form_fields = ['vote'] # 定義產生的表格是甚麼形式。ex.'vote'是在class Player那邊定義的 @staticmethod def is_displayed(player): return player.is_S1 == 1 class S2Notice(Page): def is_displayed(player): return player.is_S1 == 0 class Game1S2(Page): form_model = 'player' form_fields = ['vote'] # 定義產生的表格是甚麼形式。ex.'vote'是在class Player那邊定義的 @staticmethod def is_displayed(player): return player.is_S1 == 0 def vars_for_template(player): group = player.group return dict( alpha=group.num_vote_alpha, # 計算alpha總票數 beta=group.num_vote_beta, # 計算beta總票數 gamma=group.num_vote_gamma, # 計算gamma總票數 ) class ResultsWaitPage_Table(WaitPage): after_all_players_arrive = random_tables # 抽表格 body_text = "等待所有實驗參與者開始實驗..." class ResultsWaitPage_session(WaitPage): wait_for_all_groups = True after_all_players_arrive = creating_session # 分組方式:事先排/隨機抽 body_text = "等待所有實驗參與者開始實驗..." # class ResultsWaitPage_Group(WaitPage): # after_all_players_arrive = grouping # 分組方式:隨機抽 # body_text = "等待所有實驗參與者開始實驗..." class ResultsWaitPage_Vote1(WaitPage): # 統計票數 after_all_players_arrive = count_votes body_text = "等待所有第一階段實驗參與者完成選擇..." class ResultsWaitPage_Vote2(WaitPage): # 統計票數 after_all_players_arrive = count_votes body_text = "等待所有第二階段實驗參與者完成選擇..." class ResultsWaitPage_Payoff(WaitPage): # 算報酬 after_all_players_arrive = set_payoffs body_text = "等待所有第二階段實驗參與者完成選擇..." class ResultsWaitPage_Round(WaitPage): # 抽結算回合 wait_for_all_groups = True after_all_players_arrive = draw_round body_text = "等待所有第二階段實驗參與者完成選擇..." class Result1(Page): def vars_for_template(player): group = player.group return dict( alpha=group.num_vote_alpha, # 計算alpha總票數 beta=group.num_vote_beta, # 計算beta總票數 gamma=group.num_vote_gamma, # 計算gamma總票數 ) class Final_payoff(Page): @staticmethod # 所有回合跑完才結算 def is_displayed(player: Player): return player.round_number == Constants.num_rounds @staticmethod # participant = player,把變數變為 participant 變數 def before_next_page(player: Player, timeout_happened): participant = player.participant player_in_selected_round = player.in_round(player.random_round) participant.SV_U_seq_random_round = player.random_round # 抓抽中回合的報酬(法幣) final_payoff = int(player_in_selected_round.payoff) player.final_payoff = final_payoff total_pay_yuan = final_payoff * Constants.exchange_rate player.total_pay_yuan = total_pay_yuan participant.SV_U_seq_payoff = player.final_payoff # 抓抽中回合的 Type a, b, c的人數 # 用 random table 做判斷 random_table = int(player_in_selected_round.random_table) if random_table == 1: participant.SV_U_seq_num_a = 5 participant.SV_U_seq_num_b = 4 participant.SV_U_seq_num_c = 3 elif random_table == 2: participant.SV_U_seq_num_a = 4 participant.SV_U_seq_num_b = 3 participant.SV_U_seq_num_c = 5 elif random_table == 3: participant.SV_U_seq_num_a = 3 participant.SV_U_seq_num_b = 5 participant.SV_U_seq_num_c = 4 # 判斷受試者看到的報酬表 random_group = int(player_in_selected_round.random_group) if random_group == 1: participant.SV_U_seq_Type = 1 elif random_group == 2: participant.SV_U_seq_Type = 2 elif random_group == 3: participant.SV_U_seq_Type = 3 # 紀錄alpha, beta, gamma總票數 num_vote_alpha = int(player_in_selected_round.num_vote_alpha) num_vote_beta = int(player_in_selected_round.num_vote_beta) num_vote_gamma = int(player_in_selected_round.num_vote_gamma) participant.SV_U_seq_num_vote_alpha = num_vote_alpha participant.SV_U_seq_num_vote_beta = num_vote_beta participant.SV_U_seq_num_vote_gamma = num_vote_gamma class Close(Page): @staticmethod # 所有回合跑完才結算 def is_displayed(player: Player): return player.round_number == Constants.num_rounds @staticmethod def vars_for_template(player): player_in_selected_round = player.in_round(player.random_round) final_payoff = int(player_in_selected_round.payoff) total_pay_yuan = final_payoff * Constants.exchange_rate player.total_pay_yuan = total_pay_yuan return dict( selected_round=player.random_round, total_pay_yuan=player.total_pay_yuan, ) page_sequence = [ ResultsWaitPage_Table, ResultsWaitPage_session, Game1S1, S2Notice, ResultsWaitPage_Vote1, Game1S2, ResultsWaitPage_Vote2, ResultsWaitPage_Payoff, ResultsWaitPage_Round, Final_payoff, ]