BlackjackをPythonで生成してみた

### この記事の目的は、Blackjackという手持ちのカードの数字の合計が、21を超えない範囲で21に近い方が勝ちというカードゲームをどのようにPythonを使って生成するかが主旨だ。

![Screenshot 2024-06-12 at 14.23.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518583/b7581bb2-c384-90e4-89ad-f966f364dccd.png)

この3行のコードをわかりやすく説明しよう。

まず、Pythonの組み込みモジュール"random”をインポート
"replit"のモジュールから"clear”関数をインポート
"art"というモジュールから"logo"という変数または関数をインポート

### Deal Card関数
```py
def deal_card():
  cards = [11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10]
  card = random.choice(cards)
  return card
```

この関数はデッキ（トランプの山）からランダムに1枚のカードを返します。cardsリストには、エース（11）、数値カード（2-10）、フェイスカード（10）が含まれています。
random.choice(cards)はcardsリストからランダムに1枚のカードを選びます。

### "calculate score" 関数
```py
def calculate_score(cards):
  if sum(cards) == 21 and len(cards) == 2:
    return 0
  if 11 in cards and sum(cards) > 21:
    cards.remove(11)
    cards.append(1)
  return sum(cards)
```

この関数はカードのリストを受け取り、その合計スコアを返します。
もしカードの合計が21で、かつ2枚だけなら、ブラックジャックとして0を返します。
エース（11）が含まれていて、合計が21を超えた場合、エースの値を1に変更します。
最終的にカードの合計を返します。

### "compare" 関数
```py
def compare(user_score, computer_score):
  if user_score > 21 and computer_score > 21:
    return "You went over. You lose 😤"
  if user_score == computer_score:
    return "Draw 🙃"
  elif computer_score == 0:
    return "Lose, opponent has Blackjack 😱"
  elif user_score == 0:
    return "Win with a Blackjack 😎"
  elif user_score > 21:
    return "You went over. You lose 😭"
  elif computer_score > 21:
    return "Opponent went over. You win 😁"
  elif user_score > computer_score:
    return "You win 😃"
  else:
    return "You lose 😤"
```

#### ここのコードの説明：
この関数はユーザーとコンピュータのスコアを比較し、ゲームの結果を返します。
両者が21を超えた場合、ユーザーの負け。
スコアが同じなら引き分け。
コンピュータがブラックジャック（0）の場合、ユーザーの負け。
ユーザーがブラックジャック（0）の場合、ユーザーの勝ち。
ユーザーが21を超えた場合、ユーザーの負け。
コンピュータが21を超えた場合、ユーザーの勝ち。
ユーザーのスコアが高ければユーザーの勝ち、それ以外はユーザーの負け。

### "play game" 関数
```py
def compare(user_score, computer_score):
  if user_score > 21 and computer_score > 21:
    return "You went over. You lose 😤"
  if user_score == computer_score:
    return "Draw 🙃"
  elif computer_score == 0:
    return "Lose, opponent has Blackjack 😱"
  elif user_score == 0:
    return "Win with a Blackjack 😎"
  elif user_score > 21:
    return "You went over. You lose 😭"
  elif computer_score > 21:
    return "Opponent went over. You win 😁"
  elif user_score > computer_score:
    return "You win 😃"
  else:
    return "You lose 😤"

def play_game():

  print(logo)

  user_cards = []
  computer_cards = []
  is_game_over = False

  for _ in range(2):
    user_cards.append(deal_card())
    computer_cards.append(deal_card())

  while not is_game_over:
    user_score = calculate_score(user_cards)
    computer_score = calculate_score(computer_cards)
    print(f"   Your cards: {user_cards}, current score: {user_score}")
    print(f"   Computer's first card: {computer_cards[0]}")

    if user_score == 0 or computer_score == 0 or user_score > 21:
      is_game_over = True
    else:
      user_should_deal = input("Type 'y' to get another card, type 'n' to pass: ")
      if user_should_deal == "y":
        user_cards.append(deal_card())
      else:
        is_game_over = True

  while computer_score != 0 and computer_score < 17:
    computer_cards.append(deal_card())
    computer_score = calculate_score(computer_cards)

  print(f"   Your final hand: {user_cards}, final score: {user_score}")
  print(f"   Computer's final hand: {computer_cards}, final score: {computer_score}")
  print(compare(user_score, computer_score))
```

#### ここのコードの説明
この関数はブラックジャックのゲームをプレイします。
初期設定としてユーザーとコンピュータにそれぞれ2枚のカードを配ります。
ユーザーがカードを引くかどうかを決め、引く場合はカードを追加し、そうでなければゲーム終了。
コンピュータのスコアが17未満の場合、カードを引き続けます。
最終的な手札とスコアを表示し、compare関数を使って結果を表示します。

### メインループ
```py
while input("Do you want to play a game of Blackjack? Type 'y' or 'n': ") == "y":
  clear()
  play_game()
```

このループはユーザーにブラックジャックをプレイするかどうかを尋ね、'y'と答えた場合、新しいゲームを開始します。

以上が、ブラックジャックゲームのコードの説明となる。わかりやすいように、実際に私がこのコードを使いブラックジャックを遊んでいるスクリーンショットを添付しておく。

![Screenshot 2024-06-12 at 14.32.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518583/671357ac-1c8a-96a2-4826-3c20fc10ea34.png)
ここで、yと選択したら、ゲームを続行できる。
しかし、nと選択したら、ゲームプレイが出来なくなる。
もちろん、私はyと入力した。

![Screenshot 2024-06-12 at 14.33.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518583/f948f25b-3b3c-aca9-9854-38fdc45663cf.png)

21を超えない範囲で、21に近い方が勝ちというゲームのため、私は、8を入力した。

9 + 8 = 17で、以下の写真では、パソコンが選択したカードの総和が25であったため、
ユーザー、つまり私の勝ちとなった。
![Screenshot 2024-06-12 at 14.36.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518583/2239edd8-5d11-8467-5506-6ea3e2b5d1d5.png)

### 引用元：

https://github.com/dericsadrs/100-Days-of-Code-Complete-Python-Pro-BootCamp/tree/master/Day%2011

皆さんもこのプログラムコードを参考にして、トランプゲームの一種であるBlackjackを遊んだらどうでしょうか。