from otree.api import Currency as c, currency_range from ._builtin import Page from .models import Constants import datetime, json, time import random import math def per_sec(): choice1 = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6] random.shuffle(choice1) return choice1 def per_move(): choice2 = [0.1, 0.2, 0.5, 0.75, 1] random.shuffle(choice2) return choice2 class instructions1(Page): def vars_for_template(self): if self.round_number == 1: self.participant.vars['move'] = per_move() self.participant.vars['sec'] = per_sec() return dict( min_num_of_moves=self.round_number + 6, endowment=(self.round_number + 6) * 0.5 + 10, per_move_ins=0.50, # self.participant.vars['move'][self.round_number - 1], per_10sec_ins=self.participant.vars['sec'][self.round_number - 1], ) def before_next_page(self): self.participant.vars['sssss'] = time.time() class Game1(Page): form_model = 'player' form_fields = ['puzzle_solved', 'total_payoff', 'time_spent', 'num_of_moves', 'min_num_of_moves', 'board_history', 'deduction_per_second', 'deduction_all_seconds', 'deduction_per_move', 'deduction_all_moves', 'time_between_moves', 'endowment'] timeout_seconds = 3000 timer_text = 'Time Left to Next Deduction:' def before_next_page(self): if self.player.puzzle_solved == 1: self.player.time_spent = math.floor(time.time() - self.participant.vars['sssss']) self.player.total_payoff = round((self.player.endowment - (self.player.time_spent // 10 * self.player.deduction_per_second) - (self.player.deduction_per_move * self.player.num_of_moves)),2) self.player.deduction_all_moves = self.player.deduction_per_move * self.player.num_of_moves self.player.deduction_all_seconds = self.player.time_spent // 10 * self.player.deduction_per_second if self.player.total_payoff <0: self.player.total_payoff = 0 else: self.player.total_payoff = self.player.total_payoff self.player.deduction_all_seconds = round((self.player.time_spent // 10 * self.player.deduction_per_second), 2) if self.timeout_happened: self.player.time_spent = self.timeout_seconds self.player.total_payoff = self.player.endowment - (self.timeout_seconds / 10 * self.player.deduction_per_second)\ - (self.player.deduction_per_move * self.player.num_of_moves) if self.player.total_payoff <0: self.player.total_payoff = 0 else: self.player.total_payoff = self.player.total_payoff self.player.deduction_all_seconds = round((self.timeout_seconds / 10 * self.player.deduction_per_second),2) def vars_for_template(self) -> dict: return dict( endowment=(self.round_number + 6) * 0.5 + 10, min_num_of_moves=self.round_number + 6, per_move_ins=0.50, # self.participant.vars['move'][self.round_number - 1], per_10sec_ins=self.participant.vars['sec'][self.round_number - 1], ) def js_vars(self): if self.round_number == 1: # 10 steps return { 'timeout': self.timeout_seconds, 'game_id': self.round_number, 'per_move': 0.50, # self.participant.vars['move'][self.round_number - 1], 'per_10sec': self.participant.vars['sec'][self.round_number - 1], 'endowment': 15, 'min_num_of_moves': 10, 'player_id': self.player.id, 'the_player': self.player.id == 1, 'board': [ [5, 1, 3], [2, 6, 8], [4, 7, None], ] } if self.round_number == 2: # 9 steps return { 'timeout': self.timeout_seconds, 'game_id': self.round_number, 'per_move': 0.50, # self.participant.vars['move'][self.round_number - 1], 'per_10sec': self.participant.vars['sec'][self.round_number - 1], 'endowment': 14.5, 'min_num_of_moves': 9, 'player_id': self.player.id, 'the_player': self.player.id == 1, 'board': [ [1, None, 2], [7, 5, 3], [8, 4, 6], ] } if self.round_number == 3: # 10 steps return { 'timeout': self.timeout_seconds, 'game_id': self.round_number, 'per_move': 0.50, # self.participant.vars['move'][self.round_number - 1], 'per_10sec': self.participant.vars['sec'][self.round_number - 1], 'endowment': 15, 'min_num_of_moves': 10, 'player_id': self.player.id, 'the_player': self.player.id == 1, 'board': [ [None, 5, 2], [1, 4, 6], [7, 3, 8], ] } if self.round_number == 4: # 9 steps return { 'timeout': self.timeout_seconds, 'game_id': self.round_number, 'per_move': 0.50, # self.participant.vars['move'][self.round_number - 1], 'per_10sec': self.participant.vars['sec'][self.round_number - 1], 'endowment': 14.5, 'min_num_of_moves': 9, 'player_id': self.player.id, 'the_player': self.player.id == 1, 'board': [ [1, 3, 5], [8, 2, None], [4, 7, 6], ] } if self.round_number == 5: # 10 steps return { 'timeout': self.timeout_seconds, 'game_id': self.round_number, 'per_move': 0.50, # self.participant.vars['move'][self.round_number - 1], 'per_10sec': self.participant.vars['sec'][self.round_number - 1], 'endowment': 15, 'min_num_of_moves': 10, 'player_id': self.player.id, 'the_player': self.player.id == 1, 'board': [ [None, 2, 5], [1, 6, 3], [4, 7, 8], ] } def paying_round(self): choice3 = random.randint(1, Constants.num_rounds) return choice3 class Results(Page): form_model = 'player' form_fields = ['paying_round', 'final_payoff'] def vars_for_template(self): if self.round_number == 1: self.participant.vars['paying_round'] = paying_round(self) if self.round_number < self.participant.vars['paying_round']: self.participant.vars['final_payoff'] = 0 else: self.participant.vars['final_payoff'] = self.player.in_round(self.participant.vars['paying_round']).total_payoff return dict( paying_round=self.participant.vars['paying_round'], final_payoff=self.participant.vars['final_payoff'], player_in_all_rounds=self.player.in_all_rounds(), player_in_previous_round=self.player.in_previous_rounds(), endowment=(self.round_number + 6) * 0.5 + 10, payoff=self.participant.vars['final_payoff'], ) def js_vars(self): return { 'paying_round': self.participant.vars['paying_round'], 'final_payoff': self.participant.vars['final_payoff'] } page_sequence = [instructions1, Game1, Results, ]