from otree.api import (BaseConstants, models, BaseSubsession, BaseGroup, BasePlayer) class Constants(BaseConstants): name_in_url = 'four_players_1_period_pair' players_per_group = 4 num_rounds = 1 first_pay = 25 sec_pay = 15 other_pay = 5 class Subsession(BaseSubsession): pass class Group(BaseGroup): def set_payoffs(self): players = self.get_players() for p in players: p.total_score = p.participant.vars.get("total_score") scores = [p.participant.vars["total_score"] for p in players] points = [Constants.first_pay, Constants.sec_pay, Constants.other_pay, Constants.other_pay] order = sorted(range(len(scores)), key=lambda i: scores[i], reverse=True) payoffs = [0] * len(players) rank_names = ["ראשון", "שני", "שלישי", "רביעי"] places = [""] * len(players) i = 0 while i < len(players): j = i while j < len(players) and scores[order[j]] == scores[order[i]]: j += 1 avg_pay = sum(points[i:j]) / (j - i) for k in range(i, j): idx = order[k] payoffs[idx] = avg_pay if j - i == 1: places[idx] = rank_names[i] else: places[idx] = f"תיקו עבור מקום {rank_names[i]}" i = j for p, payoff, place in zip(players, payoffs, places): p.payoff = payoff p.place = place p.participant.vars['total_payout'] = payoff class Player(BasePlayer): total_score = models.FloatField() place = models.StringField()