from otree.api import * from array import * from csv import writer, reader list_data=[] class C(BaseConstants): NAME_IN_URL = 'knapsack' PLAYERS_PER_GROUP = None NUM_ROUNDS = 9 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): name = models.StringField(label='enter your name') timeTaken =models.StringField(label='') survivalPoints =models.StringField(label='') weight =models.StringField(label='') submissions =models.StringField(label='') maxValue =models.StringField(label='') maxWeight =models.StringField(label='') totalScore = models.IntegerField() totalScorePercent = models.FloatField() # FUNCTIONS # PAGES class welcome(Page): form_model = 'player' @staticmethod def vars_for_template(player): boardNumber = player.round_number return dict( boardNumber= boardNumber, ) class play(Page): form_model = 'player' form_fields = ['timeTaken','survivalPoints','weight','submissions','maxValue','maxWeight'] @staticmethod def vars_for_template(player): boardNumber = player.round_number round_message = '' if boardNumber == 1: round_message = 'This is a practice round.' else: round_message = f'This is round {boardNumber - 1} out of {C.NUM_ROUNDS - 1}' return dict( items= getItems(boardNumber), maxWeight = getMaxWeight(boardNumber), maxValue = getMaxValue(boardNumber), roundMessage = round_message ) class practice_completed(Page): form_model = 'player' @staticmethod def vars_for_template(player): boardNumber = player.round_number return dict( boardNumber = boardNumber, ) class endPage(Page): form_model = 'player' @staticmethod def vars_for_template(player): boardNumber = player.round_number if(player.field_maybe_none('timeTaken') and player.field_maybe_none('timeTaken') != ''): list_data.append(player.timeTaken) if(player.field_maybe_none('survivalPoints') and player.field_maybe_none('survivalPoints') != ''): list_data.append(player.survivalPoints) if(player.field_maybe_none('weight') and player.field_maybe_none('weight') != ''): list_data.append(player.weight) if(player.field_maybe_none('submissions') and player.field_maybe_none('submissions') != ''): list_data.append(player.submissions) if(player.field_maybe_none('maxValue') and player.field_maybe_none('maxValue') != ''): list_data.append(player.maxValue) if(player.field_maybe_none('maxWeight') and player.field_maybe_none('maxWeight') != ''): list_data.append(player.maxWeight) # if(boardNumber ==5): # with open('KnapsackRecords.csv', 'a', newline='') as f_object: # writer_object = writer(f_object) # writer_object.writerow(list_data) # f_object.close() totalScore = 0 for i, p in enumerate(player.in_all_rounds()): if i != 0: survivalPoints = p.field_maybe_none('survivalPoints') maxValue = p.field_maybe_none('maxValue') print(survivalPoints, maxValue) if (survivalPoints == maxValue): totalScore += 1 print(f'total score: {totalScore}') totalScorePercentage = (totalScore / (C.NUM_ROUNDS - 1)) * 100 player.totalScorePercent= totalScorePercentage player.totalScore= totalScore return dict( boardNumber= boardNumber, numRounds = C.NUM_ROUNDS, list = list_data, totalScorePercentage = totalScorePercentage ) page_sequence = [welcome, practice_completed, play, endPage] def getItems(boardNumber): boards = [ [1,2,3], [1,2,3,4,5], [1,2,3,4,5,6], [1,2,3,4,5,6,7], [1,2,3,4,5,6,7], [1,2,3,4,5,6,7,8], [1,2,3,4,5,6,7,8], [1,2,3,4,5,6,7,8,9], [1,2,3,4,5,6,7,8,9] ] itemsArray =[] for item in boards[boardNumber-1]: itemsArray.append(itemList(item)) return itemsArray; def getMaxWeight(boardNumber): weights = [8,10,18,19,24,20,23,25,33] return weights[boardNumber-1] def getMaxValue(boardNumber): values = [20,28,43,51,59,49,56,62,77] return values[boardNumber-1] def itemList(itemNumber): items = [ ['rainCoat',2,5,'Rain coat'], ['pocketKnife',1,3,'Pocket knife'], ['mineralWater',6,15,'Mineral water'], ['gloves',1,5,'Gloves'], ['sleepingBag',4,6,'Sleeping bag'], ['tent',9,18,'Tent'], ['portableStove',5,8,'Portable stove'], ['cannedFood',8,20,'Canned Food'], ['snacks',3,8,'Snacks'] ] return items[itemNumber-1]