from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) from numpy.random import choice import random author = 'God sra' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'delegative_voting' players_per_group = 3 num_rounds = 2 class Subsession(BaseSubsession): def creating_session(self): self.group_randomly() class Group(BaseGroup): adopted = models.IntegerField(initial=None) good_or_bad = models.IntegerField(initial=None) votes_for_yes = models.IntegerField(initial=0) def make_results_wo_del(self): p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) p3 = self.get_player_by_id(3) players = [p1,p2,p3] ###############good or bad self.good_or_bad = choice([1, 0], 1, [2/3, 1/3]) ###############정보 가진 사람 지정(0~3명) => 실행할 플랜 선택 for i in range(0,3): x = choice([1,0],1,[1/3,2/3])[0] players[i].informed = x #변수에 저장 if self.good_or_bad ==1: y = int([players[i].plan1, players[i].plan2_1][x]) players[i].plan_fi = y elif self.good_or_bad ==0: y = int([players[i].plan1, players[i].plan2_2][x]) players[i].plan_fi = y ###############위임없음, 투표권 [1,1,1] ###############찬반계산 for i in range(0,3): p = players[i] p.votes = 1 if p.plan_fi==1: self.votes_for_yes = self.votes_for_yes + p.votes if self.votes_for_yes>1: self.adopted =1 else: self.adopted =0 ###############payoff계산 if self.adopted==1: for p in players: if self.good_or_bad==1: p.payoff = 5000 elif self.good_or_bad==0: p.payoff = 0 elif self.adopted==0: for p in players: if self.good_or_bad == 1: p.payoff = 0 elif self.good_or_bad == 0: p.payoff = 5000 def make_results(self): p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) p3 = self.get_player_by_id(3) players = [p1,p2,p3] cases = [[1,1,1],[1,1,0],[1,0,1],[1,0,0],[0,1,1],[0,1,0],[0,0,1],[0,0,0]] cases_votes = ["기존정책",[0,0,3],[0,3,0],[0,2,1],[3,0,0],[1,0,2],[2,1,0],[1,1,1]] ###############good or bad self.good_or_bad = choice([1, 0], 1, [2/3, 1/3]) ###############정보 가진 사람 지정(0~3명) => 실행할 플랜 선택 for i in range(0,3): x = choice([1,0],1,[1/3,2/3])[0] players[i].informed = x #변수에 저장 if self.good_or_bad ==1: y = int([players[i].plan1, players[i].plan2_1][x]) players[i].plan_fi = y elif self.good_or_bad ==0: y = int([players[i].plan1, players[i].plan2_2][x]) players[i].plan_fi = y ###############위임여부 조사 => 최종 투표권 갯수 지정 d_case = [0,0,0] for i in range(0,3): if players[i].plan_fi ==3: d_case[i]=1 case_num = [i for i in range(0,8) if d_case==cases[i]][0] ###############찬반계산 if case_num>0: for i in range(0,3): p = players[i] p.votes = cases_votes[case_num][i] if p.plan_fi==1: self.votes_for_yes = self.votes_for_yes + p.votes if self.votes_for_yes>1: self.adopted =1 else: self.adopted =0 else: self.adopted =0 ###############payoff계산 if self.adopted==1: for p in players: if self.good_or_bad==1: p.payoff = 5000 elif self.good_or_bad==0: p.payoff = 0 elif self.adopted==0: for p in players: if self.good_or_bad == 1: p.payoff = 0 elif self.good_or_bad == 0: p.payoff = 5000 class Player(BasePlayer): plan1 = models.IntegerField(widget=widgets.RadioSelectHorizontal, initial=None) plan2_1 = models.IntegerField(widget=widgets.RadioSelectHorizontal, initial=None) #좋은정책일 경우 plan2_2 = models.IntegerField(widget=widgets.RadioSelectHorizontal, initial=None) #나쁜정책일 경우 plan_fi = models.IntegerField(initial=None) informed = models.IntegerField(initial=0) votes = models.IntegerField(initial=1) def informed_players(self): if self.informed == 0: l = [i.id_in_group for i in self.get_others_in_group() if i.informed ==1] if len(l) > 0: output = " " for i in l: output = output + ',' + str(i) return output[2:]+"번 그룹멤버" elif self.informed == 1: l = [i.id_in_group for i in self.get_others_in_group() if i.informed == 1] if len(l) > 0: output = " " for i in l: output = output + ',' + str(i) return "귀하를 비롯한 "+output[2:]+"번 그룹멤버" elif len(l)==0: return "귀하"