LoginSignup
4

More than 3 years have passed since last update.

pythonでブラックジャックを作る

Posted at

<はじめに>

最近ネットフリックスに加入しました。(30日間のお試し期間中)洋画は人生でインディージョーンズくらいしか見た事なかったのですが、これを機にオーシャンズ13、オーシャンズ12、オーシャンズ11という映画(ハマったので3本ほぼ連続で)を見ました。そこでカジノが出てくるのですがなんとなくブラックジャックでも作ってみようかと思い、今回のプログラミングに至った次第であります。
※補足
・オーシャンズシリーズを見ている中で「主人公の相棒的なポジションのこの人かっこいいなぁ~演技うめぇなんていう人なんダロォ」と思っていた人がいたんですが、調べたらブラッドピットと出てきました。前述したように洋画も全く見ず、特に芸能にもあまり興味なく、ブラッドピットという名前しか知らなかった自分に若干引きました。

今回作成したもの

ブラックジャックのルール(色々あるようなのですが今回は以下の通りです)
・ディーラーとプレイヤーの対決。
・ジョーカーを除く52枚のトランプを使用。
・トランプの数を足した合計が21に近いほうの勝利。
・初めにディーラー、プレイヤーに2枚のトランプを配る。この際ディーラーのもつ2枚のうち1枚はプレイヤーには分からないように裏に伏せられている。
・プレイヤーは配られた2枚のトランプを見て、カードを追加するかどうか決める。(何枚でも追加可能)
・プレイヤーのトランプの合計が21を超えるとバーストとなり負けが決まる。
・プレイヤーがカードの追加を止めるとディーラーは伏せられていたカードを表にしその合計を求める。合計が17以上になるまでディーラーはカードを引き続ける。
・2~10のカードはその数として扱います。J、Q、Kは10として扱います。Aは1と11の両方の値を持ち、より強い"手"になるように値をとります。

コード全体

import random
available_card = [2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,"J","J","J","J","Q","Q","Q","Q","K","K","K","K","A","A","A","A"]
player_burst = False
dealer_burst = False
check = False
draw = False
dealer_all_card = []
player_all_card = []


def card():
    return random.sample(available_card,1)

def add_dealer_card():
    dealer_all_card.append(selected_dealer_card[0])
def add_player_card():
    player_all_card.append(selected_player_card[0])

def change_dealer_card():
    return "".join(map(str,selected_dealer_card))
def change_player_card():
    return "".join(map(str,selected_player_card))

def remove_dealer_card():
    available_card.remove(selected_dealer_card[0])
def remove_player_card():
    available_card.remove(selected_player_card[0])

times = 1
while times < 3:
    selected_dealer_card = card()
    add_dealer_card()
    remove_dealer_card()

    selected_player_card = card()
    add_player_card()
    remove_player_card()
    times += 1

player_all_card_replace = [10 if i == "J" or i == "Q" or i == "K" else i for i in player_all_card]
player_all_card_replace_replace = [11 if i == "A" else i for i in player_all_card_replace]
player_all_card = player_all_card_replace_replace
player_amount = sum(player_all_card)

print("●ディーラーは"+change_dealer_card()+"と1枚カードを引きました")
print("--------------------------------------------------")
print("〇プレイヤーは"+str(player_all_card[0])+"と"+str(player_all_card[1])+"を引きました")
print("〇プレイヤーの合計は"+str(player_amount)+"です。")
print("--------------------------------------------------")

check = int(input("〇カードを追加しますか? 0:追加しない 1:追加する    "))
print("--------------------------------------------------")

while check:
    selected_player_card = card()
    add_player_card()
    remove_player_card()
    player_all_card_replace = [10 if i == "J" or i == "Q" or i == "K" else i for i in player_all_card]
    player_all_card_replace_replace = [11 if i == "A" else i for i in player_all_card_replace]
    player_all_card = player_all_card_replace_replace
    player_amount = sum(player_all_card)
    if player_amount > 21 and player_all_card.count(11) != 0:
        player_all_card.remove(11)
        player_all_card.append(1)
    player_amount = sum(player_all_card)
    print("〇プレイヤーはカードを引きました")
    print("〇引いたカードは"+change_player_card()+"でした。")
    print("〇合計は"+str(player_amount)+"です。")
    draw = True
    if player_amount > 21:
        check = False
    if check:
        check = int(input("〇カードを追加しますか? 0:追加しない 1:追加する    "))
        print("--------------------------------------------------")
if draw:   
    print("〇プレイヤーの合計は"+str(player_amount)+"です。")
    print("--------------------------------------------------")
if player_amount > 21:
    print("〇プレイヤーはバーストしました・・・")
    player_burst = True
    print("--------------------------------------------------")

dealer_all_card_replace = [10 if i == "J" or i == "Q" or i == "K" else i for i in dealer_all_card]
dealer_all_card_replace_replace = [11 if i == "A" else i for i in dealer_all_card_replace]
dealer_all_card = dealer_all_card_replace_replace
dealer_amount = sum(dealer_all_card)

dealer_amount = sum(dealer_all_card)
print("●ディーラーが引いていたカードは"+str(dealer_all_card[0])+"と"+str(dealer_all_card[1])+"でした。")
print("●ディーラーの合計は"+str(dealer_amount)+"でした。")
print("--------------------------------------------------")

while dealer_amount < 17:
    selected_dealer_card = card()
    add_dealer_card()
    remove_dealer_card()
    dealer_all_card_replace = [10 if i == "J" or i == "Q" or i == "K" else i for i in dealer_all_card]
    dealer_all_card_replace_replace = [11 if i == "A" else i for i in dealer_all_card_replace]
    dealer_all_card = dealer_all_card_replace_replace
    dealer_amount = sum(dealer_all_card)
    if dealer_amount > 21 and dealer_all_card.count(11) != 0:
        dealer_all_card.remove(11)
        dealer_all_card.append(1)
    dealer_amount = sum(dealer_all_card)
    print("●ディーラーは"+change_dealer_card()+"を引きました。")
    print("●ディーラーの合計は"+str(dealer_amount)+"です。")
    print("--------------------------------------------------")

if dealer_amount > 21:
    dealer_burst = True
    print("●ディーラーはバーストしました。")
    print("--------------------------------------------------")

if player_burst:
    print("★ディーラーの勝ちです。")
if not player_burst and not dealer_burst and player_amount < dealer_amount:
    print("★ディーラーの勝ちです。")
if not player_burst and player_amount > dealer_amount:
    print("☆プレイヤーの勝ちです。")
if not player_burst and dealer_burst:
    print("☆プレイヤーの勝ちです。")
if not player_burst and not dealer_burst and player_amount == dealer_amount:
    print("引き分けです。")

補足

Aを1と11の両方の値をとれるようにするのが一番大変だと思います。

player_all_card_replace = [10 if i == "J" or i == "Q" or i == "K" else i for i in player_all_card]
player_all_card_replace_replace = [11 if i == "A" else i for i in player_all_card_replace]

上記のようにしてJ、Q、Kを10に、Aを11に変換しています。

もし、持ち札の中に11が含まれていて、かつ合計が21より大きくなってしまったら以下のようにして11を1に変換しています。

if player_amount > 21 and player_all_card.count(11) != 0:
        player_all_card.remove(11)
        player_all_card.append(1)

おわりに

関数の使い方がまだまだ慣れていないなぁと感じました。洋画ってこんなにおもしろいのかと気づかせてくれたブラピありがとう。
コメントお待ちしています。
最後までお読みいただきありがとうございました。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4