import csv from django.core.validators import MaxValueValidator, MinValueValidator from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import numpy as np import random from typing import List author = ' ' doc = """ Public goods with punishment, roughly based on Fehr & Gaechter 2000. """ class Constants(BaseConstants): name_in_url = 'pgg_test' players_per_group = None num_rounds = 1 # ENDOWMENT = 20 endowment_low = c(20) endowment_high = c(40) ENDOWMENT = [20, 20, 40, 40] MULTIPLIER = 1.6 MAX_SCORE = 100 token_per_RMB = 3 class Subsession(BaseSubsession): treatment = models.FloatField() def creating_session(self): if self.session.config['treatment'] == 'Baseline': self.session.vars['treatment'] = 1 elif self.session.config['treatment'] == 'SocialScore': self.session.vars['treatment'] = 2 elif self.session.config['treatment'] == 'SocialScorePunish': self.session.vars['treatment'] = 3 elif self.session.config['treatment'] == 'SocialScorePunishRank': self.session.vars['treatment'] = 4 elif self.session.config['treatment'] == 'AIScore': self.session.vars['treatment'] = 5 elif self.session.config['treatment'] == 'AIScorePunish': self.session.vars['treatment'] = 6 self.treatment = self.session.vars['treatment'] self.session.vars['q1'] = 1 self.session.vars['q2'] = 0 self.session.vars['q3'] = 25 self.session.vars['q4'] = 0 self.session.vars['q5'] = 2 self.session.vars['q6'] = 0 self.session.vars['q7'] = 60 self.session.vars['q72'] = 0 self.session.vars['q8'] = 4 self.session.vars['q82'] = 1 class Group(BaseGroup): pass class Player(BasePlayer): # for quiz q1 = models.IntegerField(widget=widgets.RadioSelect, choices=[ (0, '正确'), (1, '错误') ]) q2 = models.IntegerField(widget=widgets.RadioSelect, choices=[ (0, '正确'), (1, '错误') ]) q3 = models.IntegerField() q4 = models.IntegerField(widget=widgets.RadioSelect, choices=[ (0, '8'), (1, '20'), (2, '25'), (3, '32') ]) q5 = models.IntegerField(widget=widgets.RadioSelect, choices=[ (0, '20'), (1, '24'), (2, '44'), (3, '60') ]) q6 = models.IntegerField(widget=widgets.RadioSelect, choices=[ (0, '正确'), (1, '错误') ]) q7 = models.IntegerField() q72 = models.IntegerField(widget=widgets.RadioSelect, choices=[ (0, '正确'), (1, '错误') ]) q8 = models.IntegerField() q82 = models.IntegerField(widget=widgets.RadioSelect, choices=[ (0, '玩家1'), (1, '玩家2'), (2, '玩家3'), (3, '玩家4') ]) errors = models.IntegerField(initial=0)