1. import code
  2. import random
  3. # Constants
  4. SUITS = ('?', '◇', '?', '?')
  5. RANKS = ('A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K')
  6. CARD_VAL = {'2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, '10':10, 'J':10, 'Q':10, 'K':10, 'A':11}
  7. print("ようこそ、ブラックジャックです。")
  8. print("あなたは、自分のカードが21に近づくようにカードをひくかひかないか賭けをしていただきます。")
  9. people=int(input("何人でプレーしますか。(1〜3名・数字のみ記入)"))
  10. print("かしこまりました。")
  11. print("ルール説明")
  12. print("初めにプレイヤーには2枚ずつのカードが配られます。")
  13. print("その後自分の手持ちカードの合計数をみて、21に近づけるように次のカードをひくかひかないかの選択ができます。")
  14. print("合計数が21に一番近い人が勝ちで、21を超えてしまった人はその時点で負けとなってしまいます。")
  15. print("エースは1か11としてカウントでき、11.12.13は10とします。")
  16. if 1<people<3:
  17.     name1=input("プレイヤー1さん、名前を入力してください。")
  18.     name2=input("プレイヤー2さん、名前を入力してください。")
  19. print("それでは始めます。")
  20. class Card(object):
  21.     
  22.     def __init__(self, suit, rank):
  23.         self.suit = suit
  24.         self.rank = rank
  25.         
  26.     def __str__(self):
  27.         return self.suit + ' ' + self.rank
  28.     
  29. class Deck(object):
  30.     
  31.     def __init__(self):
  32.         self.deck = []
  33.         for suit in SUITS:
  34.             for rank in RANKS:
  35.                 self.deck.append(Card(suit,rank))
  36.                 
  37.     def shuffle(self):
  38.         random.shuffle(self.deck)
  39.         
  40.     def deal(self):
  41.         dealt_card = self.deck.pop()
  42.         return dealt_card
  43.     
  44. class Hand(object):
  45.     
  46.     def __init__(self):
  47.         self.cards = []
  48.         self.value = 0
  49.         self.aces = 0
  50.     
  51.     def add_card(self, card):
  52.         self.cards.append(card)
  53.         self.value += CARD_VAL[card.rank]
  54.         if card.rank == 'A':
  55.             self.aces += 1
  56.     
  57.     def adjust_for_ace(self):
  58.         while self.value > 21 and self.aces:
  59.             self.value -= 10
  60.             self.aces -= 1
  61.         
  62. def hit(deck, hand):
  63.     hand.add_card(deck.deal())
  64.     hand.adjust_for_ace()
  65.     
  66. def ask_hit_or_stand(deck, hand, player_turn):
  67.     while True:
  68.         x = input("\nカードを引きますか?引くときは y 引かないときは n を半角で入力してください。")
  69.         
  70.         if x == 'y':
  71.             hit(deck,hand)
  72.         elif x == 'n':
  73.             print("ディーラーのターンです。")
  74.             player_turn = False
  75.             return player_turn
  76.         else:
  77.             print("引くときは y 引かないときは n を半角で入力してください。")
  78.             continue
  79.         return player_turn
  80. def show_cards_first(player, dealer):
  81.     print("\nディーラー:")
  82.     print('', dealer.cards[0])
  83.     print(" ??")
  84.     print("\nプレーヤー:", *player.cards, sep='\n ')
  85.     
  86. def show_cards_last(player, dealer):
  87.     print("\nディーラー:", *dealer.cards, sep='\n ')
  88.     print("ディーラーの合計:", dealer.value)
  89.     print("\nプレーヤー:", *player.cards, sep='\n ')
  90.     print("プレーヤーの合計", player.value)
  91.     
  92. def player_busts(player, dealer, money):
  93.     print("プレーヤーがバーストしました。")
  94.     money.player_lose()
  95. def player_wins(player, dealer, money):
  96.     print("プレーヤーが勝ちました。")
  97.     money.player_win()
  98. def dealer_busts(player, dealer, money):
  99.     print("ディーラーがバーストしました。")
  100.     money.player_win()
  101.     
  102. def dealer_wins(player, dealer, money):
  103.     print("ディーラーが勝ちました。")
  104.     money.player_lose()
  105.     
  106. def push(player, dealer):
  107.     print("プッシュです。")
  108. def main():
  109.     player_turn = True
  110.     count_game = 0
  111.     count_win = 0
  112.     count_tie = 0
  113.    
  114.     while True:
  115.         count_game += 1
  116.         
  117.         print('\nカードをシャッフルします。')
  118.         deck = Deck()
  119.         deck.shuffle()
  120.         
  121.         
  122.         print('\nカードを配ります。')
  123.         player_hand = Hand()
  124.         player_hand.add_card(deck.deal())
  125.         player_hand.add_card(deck.deal())
  126.         
  127.         dealer_hand = Hand()
  128.         dealer_hand.add_card(deck.deal())
  129.         dealer_hand.add_card(deck.deal())
  130.         # カードを見せる。
  131.         show_cards_first(player_hand, dealer_hand)
  132.         
  133.         print('\nプレーヤーのターンです。')
  134.         while player_turn:
  135.             # プレーヤーがカードを引く。
  136.             player_turn = ask_hit_or_stand(deck, player_hand, player_turn)
  137.             show_cards_first(player_hand, dealer_hand)
  138.             
  139.             # プレーヤーがバースト。
  140.             if player_hand.value > 21:
  141.                 player_busts(player_hand, dealer_hand)
  142.                 break
  143.         
  144.         # プレーヤーがバーストしなければディーラーのターン。
  145.         if player_hand.value <= 21:
  146.             print('\nディーラーのターンです。')
  147.             
  148.             # ディーラーは21以上にならなければカードを引き続ける。
  149.             while dealer_hand.value < 17:
  150.                 hit(deck, dealer_hand)
  151.                 
  152.             # カードを見せる。
  153.             show_cards_last(player_hand,dealer_hand)
  154.             # ディーラがバースト
  155.             if dealer_hand.value > 21:
  156.                 dealer_busts(player_hand, dealer_hand)
  157.                 count_win += 1
  158.             # ディーラーの勝ち
  159.             elif dealer_hand.value > player_hand.value:
  160.                 dealer_wins(player_hand, dealer_hand)
  161.             # プレーヤーの勝ち
  162.             elif dealer_hand.value < player_hand.value:
  163.                 player_wins(player_hand, dealer_hand)
  164.                 count_win += 1
  165.             # 引き分け
  166.             else:
  167.                 push(player_hand,dealer_hand)
  168.                 count_tie += 1
  169.         
  170.         # ゲームを続けるか?
  171.         new_game = input("続けて勝負しますか? 続けるときは y を半角で入力してください。 ")
  172.         if new_game == 'y':
  173.             player_turn=True
  174.             continue
  175.         else:
  176.             print("\nゲームを終了します。")
  177.             break