# from _typeshed import Self from django.utils.translation import npgettext from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import random from otree.models import player author = '' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'stage1' players_per_group = 5 num_rounds = 5 # 感染したときの罰金 penalty = 10 # 店舗のキャパ capacity = 10 multiplier = 2 endowment = 10 instruction_summary = '../_templates/Instruction1_Summary.html' class Subsession(BaseSubsession): def creating_session(self): import random groups = self.get_groups() # [Group1, Group2, Group3] # 店舗の混み具合を初期化 for group in groups: group.period1_visitor = random.randint(1,2) group.period2_visitor = random.randint(1,3) group.period3_visitor = random.randint(2,3) group.period4_visitor = random.randint(4,5) group.period5_visitor = random.randint(3,4) group.period6_visitor = random.randint(1,2) for p in self.get_players(): p.ransuu = random.random() class Group(BaseGroup): # 現在の店にいる人 # 9:00~12:00 period1_visitor = models.IntegerField() # 12:00~14:00 period2_visitor = models.IntegerField() # 14:00~16:00 period3_visitor = models.IntegerField() # 16:00~18:00 period4_visitor = models.IntegerField() # 18:00~20:00 period5_visitor = models.IntegerField() # 20:00~22:00 period6_visitor = models.IntegerField() period1_point = models.IntegerField() period2_point = models.IntegerField() period3_point = models.IntegerField() period4_point = models.IntegerField() period5_point = models.IntegerField() period6_point = models.IntegerField() # 利得の計算用関数 def cal_ritoku(self): # 同グループのプレイヤーを取得 players = self.get_players() # プレイヤーのそれぞれの選択を保存する用リストの作成 period_list = [] # それぞれのプレイヤーの選択をリストに追加 for player in players: period_list.append(player.period) # それぞれの時間帯を何人のプレイヤーが選択しているか計算 period1_num = period_list.count('period1') period2_num = period_list.count('period2') period3_num = period_list.count('period3') period4_num = period_list.count('period4') period5_num = period_list.count('period5') period6_num = period_list.count('period6') # それぞれの時間帯の混雑率(感染率)を計算 period1_konzatu = (period1_num + self.period1_visitor)/Constants.capacity period2_konzatu = (period2_num + self.period2_visitor)/Constants.capacity period3_konzatu = (period3_num + self.period3_visitor)/Constants.capacity period4_konzatu = (period4_num + self.period4_visitor)/Constants.capacity period5_konzatu = (period5_num + self.period5_visitor)/Constants.capacity period6_konzatu = (period6_num + self.period6_visitor)/Constants.capacity # 感染したかどうかを判定する処理 for player in players: if player.period == 'period1': if player.ransuu < period1_konzatu: player.is_infected = 1 if player.period == 'period2': if player.ransuu < period2_konzatu: player.is_infected = 1 if player.period == 'period3': if player.ransuu < period3_konzatu: player.is_infected = 1 if player.period == 'period4': if player.ransuu < period4_konzatu: player.is_infected = 1 if player.period == 'period5': if player.ransuu < period5_konzatu: player.is_infected = 1 if player.period == 'period6': if player.ransuu < period6_konzatu: player.is_infected = 1 # それぞれの時間帯を選択したときに貰える基礎ポイントの計算 self.period1_point = self.period1_visitor * Constants.multiplier self.period2_point = self.period2_visitor * Constants.multiplier self.period3_point = self.period3_visitor * Constants.multiplier self.period4_point = self.period4_visitor * Constants.multiplier self.period5_point = self.period5_visitor * Constants.multiplier self.period6_point = self.period6_visitor * Constants.multiplier # 実際の利得の計算 for player in players: if player.period == 'period1': player.point = self.period1_point if player.period == 'period2': player.point = self.period2_point if player.period == 'period3': player.point = self.period3_point if player.period == 'period4': player.point = self.period4_point if player.period == 'period5': player.point = self.period5_point if player.period == 'period6': player.point = self.period6_point # 感染しているかどうかで利得の式を分岐 if player.is_infected == 1: player.ritoku = player.point - Constants.penalty + Constants.endowment else: player.ritoku = player.point + Constants.endowment # rank_konzatu = [] class Player(BasePlayer): # どの時間帯を選んだか保存用 period = models.StringField( choices = [ ['period1', '9:00~12:00'], ['period2', '12:00~14:00'], ['period3', '14:00~16:00'], ['period4', '16:00~18:00'], ['period5', '18:00~20:00'], ['period6', '20:00~22:00'], ], label='', widget=widgets.RadioSelectHorizontal ) # 利得保存用 ritoku = models.IntegerField() # 1だったら感染 is_infected = models.IntegerField(initial=0) total_ritoku = models.IntegerField() point = models.IntegerField() ransuu = models.FloatField()