from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import random import csv import numpy doc = """ This is a one-shot "Prisoner's Dilemma". Two players are asked separately whether they want to cooperate or defect. Their choices directly determine the payoffs. """ SUPERGROUP_NUM_ERR = 'Wrong number of players per supergroup' class Constants(BaseConstants): name_in_url = 'strategic_draft1f' players_per_group = 2 players_per_supergroup = 2 #assert players_per_supergroup % players_per_group == 0, \ # SUPERGROUP_NUM_ERR num_rounds = 1 ### RANDOM SELECTION of DG --> To be set to (1,39) randomly_selected_round_DG = random.randint(1, 10) conversion_rate = 0.0020 print(randomly_selected_round_DG) dg1_X_pointsA = 940 dg1_X_pointsB = 150 dg1_Y_pointsA = 800 dg1_Y_pointsB = 510 dg2_X_pointsA = 970 dg2_X_pointsB = 490 dg2_Y_pointsA = 770 dg2_Y_pointsB = 170 dg3_X_pointsA = 1060 dg3_X_pointsB = 330 dg3_Y_pointsA = 680 dg3_Y_pointsB = 330 dg4_X_pointsA = 990 dg4_X_pointsB = 480 dg4_Y_pointsA = 750 dg4_Y_pointsB = 180 dg5_X_pointsA = 930 dg5_X_pointsB = 510 dg5_Y_pointsA = 810 dg5_Y_pointsB = 150 dg6_X_pointsA = 430 dg6_X_pointsB = 1030 dg6_Y_pointsA = 230 dg6_Y_pointsB = 710 dg7_X_pointsA = 370 dg7_X_pointsB = 1060 dg7_Y_pointsA = 290 dg7_Y_pointsB = 680 dg8_X_pointsA = 350 dg8_X_pointsB = 1060 dg8_Y_pointsA = 310 dg8_Y_pointsB = 680 dg9_X_pointsA = 1010 dg9_X_pointsB = 190 dg9_Y_pointsA = 730 dg9_Y_pointsB = 470 dg10_X_pointsA = 420 dg10_X_pointsB = 1040 dg10_Y_pointsA = 240 dg10_Y_pointsB = 700 # def slice_list(input): # ppg = Constants.players_per_group # output = [input[i:i+ppg] for i in range(0, len(input), ppg)] # for o in output: # assert len(o) != ppg, SUPERGROUP_NUM_ERR # return output class Subsession(BaseSubsession): def creating_session(self): if self.round_number == 1: assert len(self.get_players()) % \ Constants.players_per_supergroup == 0, \ SUPERGROUP_NUM_ERR ### RANDOM IDs --> nell'originale vengono lette da participant vars # nel demo generate randomly ora: # import itertools # random_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] # random.shuffle(random_list) # random_ids = itertools.cycle(random_list) # for p in self.get_players(): # p.participant.vars['id_random'] = next(random_ids) # for g in self.get_groups(): # for p in g.get_players(): # if p.participant.vars['id_random'] == 1 or p.participant.vars['id_random'] == 2: # p.participant.vars['supergroup_task3'] = int(1) # elif p.participant.vars['id_random'] == 3 or p.participant.vars['id_random'] == 4: # p.participant.vars['supergroup_task3'] = int(2) # else: # p.participant.vars['supergroup_task3'] = int(3) for g in self.get_groups(): for p in g.get_players(): if p.participant.vars['id_random'] == 1 or p.participant.vars['id_random'] == 6: p.participant.vars['supergroup_task3'] = int(1) elif p.participant.vars['id_random'] == 2 or p.participant.vars['id_random'] == 7: p.participant.vars['supergroup_task3'] = int(2) elif p.participant.vars['id_random'] == 3 or p.participant.vars['id_random'] == 8: p.participant.vars['supergroup_task3'] = int(3) elif p.participant.vars['id_random'] == 4 or p.participant.vars['id_random'] == 5: p.participant.vars['supergroup_task3'] = int(4) elif p.participant.vars['id_random'] == 9 or p.participant.vars['id_random'] == 14: p.participant.vars['supergroup_task3'] = int(5) elif p.participant.vars['id_random'] == 10 or p.participant.vars['id_random'] == 15: p.participant.vars['supergroup_task3'] = int(6) elif p.participant.vars['id_random'] == 11 or p.participant.vars['id_random'] == 16: p.participant.vars['supergroup_task3'] = int(7) else: p.participant.vars['supergroup_task3'] = int(8) subgroups_task3 = set([p.vars['supergroup_task3'] for p in self.session.get_participants()]) new_matrix = [] for s in subgroups_task3: A = [p for p in self.get_players() if p.participant.vars['supergroup_task3'] == s] random.shuffle(A) #sliced_supergroup = slice_list(A) new_matrix.append(A) print(new_matrix) self.set_group_matrix(new_matrix) class Group(BaseGroup): def set_other_player_choice(self): for p in self.get_players(): p.set_other_player_choice() class Player(BasePlayer): supergroup_task3 = models.StringField() id_random = models.IntegerField() randomly_selected_round_DG = models.IntegerField() dg_decision_1 = models.StringField() dg_decision_2 = models.StringField() dg_decision_3 = models.StringField() dg_decision_4 = models.StringField() dg_decision_5 = models.StringField() dg_decision_6 = models.StringField() dg_decision_7 = models.StringField() dg_decision_8 = models.StringField() dg_decision_9 = models.StringField() dg_decision_10 = models.StringField() selected_decision_as_dictator = models.StringField() dictator_pointsA = models.IntegerField() dictator_pointsB = models.IntegerField() dictator_pointsA_eur = models.FloatField() dictator_pointsA_eur_to_show = models.FloatField() dictator_pointsB_eur = models.FloatField() dictator_pointsB_eur_to_show = models.FloatField() selected_decision_as_receiver = models.StringField() points_as_receiver = models.IntegerField() points_as_receiver_eur = models.FloatField() points_as_receiver_eur_to_show = models.FloatField() def other_player(self): return self.get_others_in_group()[0] def set_other_player_choice(self): self.selected_decision_as_receiver = self.other_player().selected_decision_as_dictator self.points_as_receiver = self.other_player().dictator_pointsB # supergroup_task1 = models.LongStringField() # supergroup_task2 = models.LongStringField() # id_random = models.IntegerField() # # decision_guess_task1_r1 = models.IntegerField() # decision_guess_task1_r5 = models.IntegerField() # decision_guess_task2_m1_r1 = models.IntegerField() # cooprate_task1_r1 = models.IntegerField() # cooprate_task1_r5 = models.IntegerField() # cooprate_task2_m1_r1 = models.IntegerField() # # payoff_task1_r1_int = models.IntegerField() # payoff_task1_r2_int = models.IntegerField() # payoff_task1_r3_int = models.IntegerField() # payoff_task1_r4_int = models.IntegerField() # payoff_task1_r5_int = models.IntegerField() # cum_payoff_task2_int_m1 = models.IntegerField() # # task2_m1_length = models.IntegerField() # # randomly_selected_round = models.IntegerField() # round_with_guess = models.IntegerField() # # payoff_int = models.IntegerField() # payoff_eur = models.FloatField() # payoff_eur_to_show = models.FloatField() # # cooprate_task1_r1_class = models.IntegerField() # cooprate_task1_r5_class = models.IntegerField() # cooprate_task2_m1_r1_class = models.IntegerField() # decision_guess_task1_r1_premium = models.IntegerField() # decision_guess_task1_r5_premium = models.IntegerField() # decision_guess_task2_m1_r1_premium = models.IntegerField() # decision_guess_premium = models.IntegerField() # # payoff_final = models.FloatField() # payoff_final_to_show = models.FloatField() # cooprate_task1_r2 = models.IntegerField() # cooprate_task1_r3 = models.IntegerField() # cooprate_task1_r4 = models.IntegerField() # decision_task1_r1 = models.IntegerField() # decision_task1_r2 = models.IntegerField() # decision_task1_r3 = models.IntegerField() # decision_task1_r4 = models.IntegerField() # decision_task1_r5 = models.IntegerField() # decision_task1_type_r1 = models.StringField() # decision_task1_type_r2 = models.StringField() # decision_task1_type_r3 = models.StringField() # decision_task1_type_r4 = models.StringField() # decision_task1_type_r5 = models.StringField() # def random_round(self): # self.randomly_selected_round = Constants.randomly_selected_round # if self.randomly_selected_round == 1: # self.participant.vars['payoff_int'] = int(self.participant.vars['payoff_task1_r1_int']) # elif self.randomly_selected_round == 2: # self.participant.vars['payoff_int'] = int(self.participant.vars['payoff_task1_r2_int']) # elif self.randomly_selected_round == 3: # self.participant.vars['payoff_int'] = int(self.participant.vars['payoff_task1_r3_int']) # elif self.randomly_selected_round == 4: # self.participant.vars['payoff_int'] = int(self.participant.vars['payoff_task1_r4_int']) # else: # self.participant.vars['payoff_int'] = int(self.participant.vars['payoff_task1_r5_int'])