from ast import operator from otree.api import * import numpy as np import numpy.random as random doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'Math' PLAYERS_PER_GROUP = None NUM_ROUNDS = 10 iRowsM = 6 iColsM = 6 dSum = 10 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): dAns1 = models.FloatField() dAns2 = models.FloatField() dOutcome = models.FloatField() dResult = models.FloatField() dRT = models.FloatField() sTableM = models.StringField() sOperator = models.StringField() sTask = models.StringField(initial='Math') # FUNCTIONS def randomMathTable(out,op): iN = C.iColsM*C.iRowsM lContent = [] if op=='+': iX1 = random.randint(1,out*10)/10 iX2 = out-iX1 elif op=='-': iX1 = random.randint(1,out*10)/10 iX2 = out+iX1 elif op=='div': iX1 = random.randint(1,out*10)/10 iX2 = out*iX1 elif op=='tim': iX1 = random.randint(1,out*10)/10 iX2 = out/iX1 lContent.append(format(iX1,'.1f')) lContent.append(format(iX2,'.1f')) iXmax = np.max([iX1,iX2]) #print(iX1,iX2,iXmax) for i in range(iN-2): bRetry = True while bRetry: dNew = random.randint(0,iXmax*10)/10 for x in lContent: if (dNew+float(x)==iXmax): bRetry = True break else: bRetry = False lContent.append(format(dNew,'.1f')) random.shuffle(lContent) return ','.join(lContent) # First Correct n def creating_session(subsession): for player in subsession.get_players(): player.sOperator = op = random.choice(['+','-','tim']) player.dOutcome = out = random.randint(1,100) print(out) player.sTableM = randomMathTable(out, op) # PAGES class Between(Page): template_name = 'global/Between.html' class Math(Page): template_name = 'global/Math.html' form_model = 'player' form_fields = ['dAns1','dAns2','dRT'] @staticmethod def js_vars(player: Player): return dict( dOutcome = player.dOutcome, sOp = player.sOperator, ) @staticmethod def vars_for_template(player: Player): lContent = [] lValues = player.sTableM.split(',') for i in range(C.iRowsM): lRow = lValues[i*C.iColsM:(i+1)*C.iColsM] print(lRow) lContent.append(lRow) sOperator = player.sOperator if sOperator == 'tim': sOperator = '×' elif sOperator == 'div': sOperator = '÷' return dict( lContent = lContent, sOperator = sOperator, dOutcome = player.dOutcome, ) @staticmethod def before_next_page(player: Player, timeout_happened): sOp = player.sOperator if sOp == '+': player.dResult = player.dOutcome - (player.dAns1 + player.dAns2) elif sOp == 'div': player.dResult = player.dOutcome - (player.dAns1 / player.dAns2) elif sOp == 'tim': player.dResult = player.dOutcome - (player.dAns1 * player.dAns2) elif sOp == '-': player.dResult = player.dOutcome - (player.dAns1 - player.dAns2) @staticmethod def is_displayed(player: Player): return player.sTask=='Math' page_sequence = [Between, Math]