import random from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) class Constants(BaseConstants): name_in_url = 'blackjack1' players_per_group = None num_rounds = 15 instructions_template = 'blackjack1/instructions.html' coin_template = 'blackjack1/coin_rules.html' rule_template = 'blackjack1/rules.html' class Subsession(BaseSubsession): def creating_session(self): if self.round_number == 1: for p in self.get_players(): import random p.treatment = random.randint(1, 2) else: for p in self.get_players(): p.treatment = p.in_round(1).treatment class Group(BaseGroup): pass class Player(BasePlayer): treatment = models.IntegerField(min=1, max=2) player_stock = models.IntegerField(initial=100) player_stock1 = models.IntegerField(min=0, max=200) player_first = models.IntegerField(min=1, max=10) player_second = models.IntegerField(min=1, max=10) player_sum = models.IntegerField(min=2, max=100) player_coin = models.IntegerField(initial=0, min=1, max=100) more_card1 = models.BooleanField(choices=[[0, '引かない'], [1, '引く']]) more_card2 = models.BooleanField(choices=[[0, '引かない'], [1, '引く']]) more_card3 = models.BooleanField(choices=[[0, '引かない'], [1, '引く']]) more_card4 = models.BooleanField(choices=[[0, '引かない'], [1, '引く']]) more_card5 = models.BooleanField(choices=[[0, '引かない'], [1, '引く']]) more_card6 = models.BooleanField(choices=[[0, '引かない'], [1, '引く']]) more_card7 = models.BooleanField(choices=[[0, '引かない'], [1, '引く']]) newcard1 = models.IntegerField(min=1, max=10) newcard2 = models.IntegerField(min=1, max=10) newcard3 = models.IntegerField(min=1, max=10) newcard4 = models.IntegerField(min=1, max=10) newcard5 = models.IntegerField(min=1, max=10) newcard6 = models.IntegerField(min=1, max=10) player_result1 = models.IntegerField(min=player_sum) player_result2 = models.IntegerField(min=player_result1) player_result3 = models.IntegerField(min=player_result2) player_result4 = models.IntegerField(min=player_result3) player_result5 = models.IntegerField(min=player_result4) player_result6 = models.IntegerField(min=player_result5) player_result7 = models.IntegerField(min=player_result6) computer_first = models.IntegerField(initial=random.randint(1, 10), min=1, max=10) computer_second = models.IntegerField(initial=random.randint(1, 10), min=1, max=10) computer_newcard1 = models.IntegerField(initial=random.randint(1, 10), min=1, max=10) computer_newcard2 = models.IntegerField(initial=random.randint(1, 10), min=1, max=10) computer_newcard3 = models.IntegerField(initial=random.randint(1, 10), min=1, max=10) computer_newcard4 = models.IntegerField(initial=random.randint(1, 10), min=1, max=10) computer_newcard5 = models.IntegerField(initial=random.randint(1, 10), min=1, max=10) computer_newcard6 = models.IntegerField(initial=random.randint(1, 10), min=1, max=10) computer_newcard7 = models.IntegerField(initial=random.randint(1, 10), min=1, max=10) computer_newcard8 = models.IntegerField(initial=random.randint(1, 10), min=1, max=10) computer_sum = models.IntegerField(min=2, max=24) result = models.StringField(initial='結果') coin_result = models.IntegerField(min=0, max=200) result_id = models.IntegerField(initial=1, min=1, max=7) result_num = models.IntegerField(min=0, max=3) basic_coin = models.IntegerField(min=0) lose_num = models.IntegerField() burst_num = models.IntegerField() lose_num_sum = models.IntegerField() draw_num = models.IntegerField() win_num = models.IntegerField() rate = models.FloatField() result_add = models.IntegerField(min=0, max=3) result_if = models.IntegerField(min=0, max=3) add_win = models.IntegerField() if_win = models.IntegerField() add_rate = models.FloatField(min=0.0, max=100.0) if_rate = models.FloatField(min=0.0, max=100.0) def computer_card(self): self.computer_first = random.randint(1, 10) self.computer_second = random.randint(1, 10) self.computer_sum = self.computer_first + self.computer_second while self.computer_sum < 15: self.computer_newcard1 = random.randint(1,10) self.computer_sum += self.computer_newcard1 if self.computer_sum >= 15: break self.computer_newcard2 = random.randint(1,10) self.computer_sum += self.computer_newcard2 if self.computer_sum >= 15: break self.computer_newcard3 = random.randint(1,10) self.computer_sum += self.computer_newcard3 if self.computer_sum >= 15: break self.computer_newcard4 = random.randint(1,10) self.computer_sum += self.computer_newcard4 if self.computer_sum >= 15: break self.computer_newcard5 = random.randint(1,10) self.computer_sum += self.computer_newcard5 if self.computer_sum >= 15: break self.computer_newcard6 = random.randint(1,10) self.computer_sum += self.computer_newcard6 if self.computer_sum >= 15: break self.computer_newcard7 = random.randint(1,10) self.computer_sum += self.computer_newcard7 if self.computer_sum >= 15: break self.computer_newcard8 = random.randint(1,10) self.computer_sum += self.computer_newcard8 if self.computer_sum >= 15: break return self.computer_first, self.computer_sum def player_card(self): self.player_first = random.randint(1, 10) self.player_second = random.randint(1, 10) self.newcard1 = random.randint(1, 10) self.newcard2 = random.randint(1, 10) self.newcard3 = random.randint(1, 10) self.newcard4 = random.randint(1, 10) self.newcard5 = random.randint(1, 10) self.newcard6 = random.randint(1, 10) self.player_sum = self.player_first + self.player_second self.player_result1 = self.player_sum self.player_result2 = self.player_result1 + self.newcard1 self.player_result3 = self.player_result2 + self.newcard2 self.player_result4 = self.player_result3 + self.newcard3 self.player_result5 = self.player_result4 + self.newcard4 self.player_result6 = self.player_result5 + self.newcard5 self.player_result7 = self.player_result6 + self.newcard6 return self.player_first, self.player_second, self.newcard1, self.newcard2, self.newcard3, self.newcard4, self.newcard5, self.newcard6, self.player_sum, self.player_result1, self.player_result2, self.player_result3, self.player_result4, self.player_result5, self.player_result6, self.player_result7 # カード一枚追加 def more_card_action1(self): if self.more_card1 == 1: self.result_id = 2 return self.result_id # カード二枚追加 def more_card_action2(self): if self.more_card2 == 1: self.result_id = 3 return self.result_id # カード三枚追加 def more_card_action3(self): if self.more_card3 == 1: self.result_id = 4 return self.result_id # カード四枚追加 def more_card_action4(self): if self.more_card4 == 1: self.result_id = 5 return self.result_id # カード五枚追加 def more_card_action5(self): if self.more_card5 == 1: self.result_id = 6 return self.result_id # カード六枚追加 def more_card_action6(self): if self.more_card6 == 1: self.result_id = 7 return self.result_id def judge1(self): # 双方がバースト if self.player_result1 > 20 and self.computer_sum > 20: self.player_stock1 = self.player_stock self.result_num = 1 return self.result_num, self.player_stock1 # pはバースト、(cはバーストしてない) elif self.player_result1 > 20 and self.computer_sum <= 20: self.player_stock1 = self.player_stock - self.player_coin self.result_num = 3 return self.result_num, self.player_stock1 # pはバーストしてない、cはバースト elif self.player_result1 <= 20 and self.computer_sum > 20: self.player_stock1 = self.player_stock + self.player_coin self.result_num = 2 return self.result_num, self.player_stock1 elif self.player_result1 == self.computer_sum: self.player_stock1 = self.player_stock self.result_num = 1 return self.result_num, self.player_stock1 elif self.player_result1 > self.computer_sum: self.player_stock1 = self.player_stock + self.player_coin self.result_num = 2 return self.result_num, self.player_stock1 elif self.player_result1 < self.computer_sum: self.player_stock1 = self.player_stock - self.player_coin self.result_num = 0 return self.result_num, self.player_stock1 else: self.player_stock1 = self.player_stock - self.player_coin self.result_num = 0 return self.result_num, self.player_stock1 def judge2(self): # 双方がバースト if self.player_result2 > 20 and self.computer_sum > 20: self.player_stock1 = self.player_stock self.result_num = 1 return self.result_num, self.player_stock1 # pはバースト、(cはバーストしてない) elif self.player_result2 > 20 and self.computer_sum <= 20: self.player_stock1 = self.player_stock - self.player_coin self.result_num = 3 return self.result_num, self.player_stock1 # pはバーストしてない、cはバースト elif self.player_result2 <= 20 and self.computer_sum > 20: self.player_stock1 = self.player_stock + self.player_coin self.result_num = 2 return self.result_num, self.player_stock1 elif self.player_result2 == self.computer_sum: self.player_stock1 = self.player_stock self.result_num = 1 return self.result_num, self.player_stock1 elif self.player_result2 > self.computer_sum: self.player_stock1 = self.player_stock + self.player_coin self.result_num = 2 return self.result_num, self.player_stock1 elif self.player_result2 < self.computer_sum: self.player_stock1 = self.player_stock - self.player_coin self.result_num = 0 return self.result_num, self.player_stock1 else: self.player_stock1 = self.player_stock - self.player_coin self.result_num = 0 return self.result_num, self.player_stock1 def judge3(self): # 双方がバースト if self.player_result3 > 20 and self.computer_sum > 20: self.player_stock1 = self.player_stock self.result_num = 1 return self.result_num, self.player_stock1 # pはバースト、(cはバーストしてない) elif self.player_result3 > 20 and self.computer_sum <= 20: self.player_stock1 = self.player_stock - self.player_coin self.result_num = 3 return self.result_num, self.player_stock1 # pはバーストしてない、cはバースト elif self.player_result3 <= 20 and self.computer_sum > 20: self.player_stock1 = self.player_stock + self.player_coin self.result_num = 2 return self.result_num, self.player_stock1 elif self.player_result3 == self.computer_sum: self.player_stock1 = self.player_stock self.result_num = 1 return self.result_num, self.player_stock1 elif self.player_result3 > self.computer_sum: self.player_stock1 = self.player_stock + self.player_coin self.result_num = 2 return self.result_num, self.player_stock1 elif self.player_result3 < self.computer_sum: self.player_stock1 = self.player_stock - self.player_coin self.result_num = 0 return self.result_num, self.player_stock1 else: self.player_stock1 = self.player_stock - self.player_coin self.result_num = 0 return self.result_num, self.player_stock1 def judge4(self): # 双方がバースト if self.player_result4 > 20 and self.computer_sum > 20: self.player_stock1 = self.player_stock self.result_num = 1 return self.result_num, self.player_stock1 # pはバースト、(cはバーストしてない) elif self.player_result4 > 20 and self.computer_sum <= 20: self.player_stock1 = self.player_stock - self.player_coin self.result_num = 3 return self.result_num, self.player_stock1 # pはバーストしてない、cはバースト elif self.player_result4 <= 20 and self.computer_sum > 20: self.player_stock1 = self.player_stock + self.player_coin self.result_num = 2 return self.result_num, self.player_stock1 elif self.player_result4 == self.computer_sum: self.player_stock1 = self.player_stock self.result_num = 1 return self.result_num, self.player_stock1 elif self.player_result4 > self.computer_sum: self.player_stock1 = self.player_stock + self.player_coin self.result_num = 2 return self.result_num, self.player_stock1 elif self.player_result4 < self.computer_sum: self.player_stock1 = self.player_stock - self.player_coin self.result_num = 0 return self.result_num, self.player_stock1 else: self.player_stock1 = self.player_stock - self.player_coin self.result_num = 0 return self.result_num, self.player_stock1 def judge5(self): # 双方がバースト if self.player_result5 > 20 and self.computer_sum > 20: self.player_stock1 = self.player_stock self.result_num = 1 return self.result_num, self.player_stock1 # pはバースト、(cはバーストしてない) elif self.player_result5 > 20 and self.computer_sum <= 20: self.player_stock1 = self.player_stock - self.player_coin self.result_num = 3 return self.result_num, self.player_stock1 # pはバーストしてない、cはバースト elif self.player_result5 <= 20 and self.computer_sum > 20: self.player_stock1 = self.player_stock + self.player_coin self.result_num = 2 return self.result_num, self.player_stock1 elif self.player_result5 == self.computer_sum: self.player_stock1 = self.player_stock self.result_num = 1 return self.result_num, self.player_stock1 elif self.player_result5 > self.computer_sum: self.player_stock1 = self.player_stock + self.player_coin self.result_num = 2 return self.result_num, self.player_stock1 elif self.player_result5 < self.computer_sum: self.player_stock1 = self.player_stock - self.player_coin self.result_num = 0 return self.result_num, self.player_stock1 else: self.player_stock1 = self.player_stock - self.player_coin self.result_num = 0 return self.result_num, self.player_stock1 def judge6(self): # 双方がバースト if self.player_result6 > 20 and self.computer_sum > 20: self.player_stock1 = self.player_stock self.result_num = 1 return self.result_num, self.player_stock1 # pはバースト、(cはバーストしてない) elif self.player_result6 > 20 and self.computer_sum <= 20: self.player_stock1 = self.player_stock - self.player_coin self.result_num = 3 return self.result_num, self.player_stock1 # pはバーストしてない、cはバースト elif self.player_result6 <= 20 and self.computer_sum > 20: self.player_stock1 = self.player_stock + self.player_coin self.result_num = 2 return self.result_num, self.player_stock1 elif self.player_result6 == self.computer_sum: self.player_stock1 = self.player_stock self.result_num = 1 return self.result_num, self.player_stock1 elif self.player_result6 > self.computer_sum: self.player_stock1 = self.player_stock + self.player_coin self.result_num = 2 return self.result_num, self.player_stock1 elif self.player_result6 < self.computer_sum: self.player_stock1 = self.player_stock - self.player_coin self.result_num = 0 return self.result_num, self.player_stock1 else: self.player_stock1 = self.player_stock - self.player_coin self.result_num = 0 return self.result_num, self.player_stock1 def judge7(self): # 双方がバースト if self.player_result7 > 20 and self.computer_sum > 20: self.player_stock1 = self.player_stock self.result_num = 1 return self.result_num, self.player_stock1 # pはバースト、(cはバーストしてない) elif self.player_result7 > 20 and self.computer_sum <= 20: self.player_stock1 = self.player_stock - self.player_coin self.result_num = 3 return self.result_num, self.player_stock1 # pはバーストしてない、cはバースト elif self.player_result7 <= 20 and self.computer_sum > 20: self.player_stock1 = self.player_stock + self.player_coin self.result_num = 2 return self.result_num, self.player_stock1 elif self.player_result7 == self.computer_sum: self.player_stock1 = self.player_stock self.result_num = 1 return self.result_num, self.player_stock1 elif self.player_result7 > self.computer_sum: self.player_stock1 = self.player_stock + self.player_coin self.result_num = 2 return self.result_num, self.player_stock1 elif self.player_result7 < self.computer_sum: self.player_stock1 = self.player_stock - self.player_coin self.result_num = 0 return self.result_num, self.player_stock1 else: self.player_stock1 = self.player_stock - self.player_coin self.result_num = 0 return self.result_num, self.player_stock1 def vs_result1(self): if self.result_id == 1: self.coin_result = self.judge1()[1] return self.coin_result def vs_result2(self): if self.result_id == 2: self.coin_result = self.judge2()[1] return self.coin_result def vs_result3(self): if self.result_id == 3: self.coin_result = self.judge3()[1] return self.coin_result def vs_result4(self): if self.result_id == 4: self.coin_result = self.judge4()[1] return self.coin_result def vs_result5(self): if self.result_id == 5: self.coin_result = self.judge5()[1] return self.coin_result def vs_result6(self): if self.result_id == 6: self.coin_result = self.judge6()[1] return self.coin_result def vs_result7(self): if self.result_id == 7: self.coin_result = self.judge7()[1] return self.coin_result def conversion(self): if self.result_num == 0: self.result = '負け' return self.result elif self.result_num == 1: self.result = '引き分け' return self.result elif self.result_num == 2: self.result = '勝ち' return self.result else: self.result = '負け(バースト)' return self.result def final_payment(self): self.basic_coin = self.player_stock * Constants.num_rounds return self.basic_coin def win_rate(self): self.rate = round((self.win_num / Constants.num_rounds) * 100, 1) return self.rate def one_chance(self): if self.result_num == 0: self.result_id += 1 if self.result_id == 2: self.result_add = self.judge2()[0] return self.result_add elif self.result_id == 3: self.result_add = self.judge3()[0] return self.result_add elif self.result_id == 4: self.result_add = self.judge4()[0] return self.result_add elif self.result_id == 5: self.result_add = self.judge5()[0] return self.result_add elif self.result_id == 6: self.result_add = self.judge6()[0] return self.result_add elif self.result_id == 7: self.result_add = self.judge7()[0] return self.result_add elif self.result_num == 3: self.result_id -= 1 if self.result_id == 1: self.result_if = self.judge1()[0] return self.result_if elif self.result_id == 2: self.result_if = self.judge2()[0] return self.result_if elif self.result_id == 3: self.result_if = self.judge3()[0] return self.result_if elif self.result_id == 4: self.result_if = self.judge4()[0] return self.result_if elif self.result_id == 5: self.result_if = self.judge5()[0] return self.result_if elif self.result_id == 6: self.result_if = self.judge6()[0] return self.result_if else: pass def fix(self): if self.result == '勝ち': self.result_num = 2 return self.result_num elif self.result == '引き分け': self.result_num = 1 return self.result_num elif self.result == '負け': self.result_num = 0 return self.result_num else: self.result_num = 3 return self.result_num def lose_rate(self): if self.lose_num == 0: self.add_rate = 0.0 return self.add_rate else: self.add_rate = round((self.add_win / self.lose_num) * 100, 1) return self.add_rate def burst_rate(self): if self.burst_num == 0: self.if_rate = 0.0 return self.if_rate else: self.if_rate = round((self.if_win / self.burst_num) * 100, 1) return self.if_rate def lose_number(self): self.lose_num_sum = self.lose_num + self.burst_num return self.lose_num_sum