3
1

More than 3 years have passed since last update.

pythonでブラックジャック作りました!

Posted at

初めに

udemyのオブジェクト指向についての動画を視聴して、
オブジェクト指向おもしれーと思ったので、腕試し代わりにブラックジャックを作ってみました!

前提条件

  • 山札などの概念はなし。
  • Aは常に1として扱う。
  • 5カードはなし、両者バーストはディーラーの勝ち。

コード

import random

CARDS = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]
CARDS_DIC = {"A": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7,
             "8": 8, "9": 9, "10": 10, "J": 10, "Q": 10, "K": 10}


class Hit(list): # プレイヤーかディーラーがヒット

    def __init__(self, list):
        self.list = list

    def player_hit(self):
        self.list.append(random.choice(CARDS))
        print(self.list[-1] + "を引きました")
        show_hand(self.list)

    def dealer_hit(self):

        while True:
            if sum_cards(self.list) >= 17 and sum_cards(self.list) <= 21:
                return False
            elif sum_cards(self.list) < 17:
                self.list.append(random.choice(CARDS))
            else:
                return False


class Interface(list): # 分岐

     def __init__(self, list):
        self.list = list

     def hit_or_stand(self): 
        while True:
            answer = input("hit or stand?:").lower()
            if answer == "hit":
                Hit(self.list).player_hit()
            elif answer == "stand":
                return False
            else:
                print("hitかstandを入力してください")
            if sum_cards(self.list) > 21:
                print("バーストしました")
                return False

def classification(player_list, dealer_list): # 勝敗の判定

    sum_player = sum_cards(player_list)
    sum_dealer = sum_cards(dealer_list)

    if 21 >= sum_player > sum_dealer or sum_dealer > 21 >= sum_player:
        print(f"あなた: {sum_player}")
        print(f"ディーラー: {sum_dealer}")
        print("あなたの勝ちです")

    elif 21 >= sum_dealer > sum_player or sum_player > 21 >= sum_dealer or sum_player and sum_dealer > 21:
        print(f"あなた: {sum_player}")
        print(f"ディーラー: {sum_dealer}")
        print("あなたの負けです")

    else:
        print(f"あなた: {sum_player}")
        print(f"ディーラー: {sum_dealer}")
        print("引き分けです")

def sum_cards(lists): # カードを集計

    sum_card = 0
    for list in lists:
        sum_card += CARDS_DIC[list]

    return sum_card

def show_hand(list): #手札のカードとカードの合計を表示
    player_hand_info = "と".join(list)
    print( "あなたの手札は" + player_hand_info + "です")
    print("合計" + str(sum_cards(list)) + "です")

def main():
    # 1,プレイヤーがカードを引く(2枚)
    player_hand = random.choices(CARDS, k=2)
    player_interface = Interface(player_hand)

    # 2,ディーラーがカードを引く(2枚)
    dealer_hand = random.choices(CARDS, k=2)
    dealer_hit = Hit(dealer_hand)

    print("ゲームスタート")
    print()

    # 3,プレイヤーがヒットかスタンドを選択する(バーストかスタンドするまで)
    print("あなたの番です")
    show_hand(player_hand)
    player_interface.hit_or_stand()
    print()

    #4,ディーラーがヒットかスタンドを選択する(合計が17以上になるまで)
    print("ディーラーの番です")
    dealer_hit.dealer_hit()
    print()

    # 5,判定して終了
    print("判定")
    classification(player_hand, dealer_hand)# メイン処理層

if __name__ == "__main__": 
    main()

処理結果

ゲームスタート

あなたの番です
あなたの手札はKと9です
合計19です
hit or stand?:hit
7を引きました
あなたの手札はKと9と7です
合計26です
バーストしました

ディーラーの番です

判定
あなた: 26
ディーラー: 18
あなたの負けです

反省点

開発の最中にクラスというものが分からなくなり、
結果おかしなコードになってしまったと感じています。(ほかの方が作ったコードと比較すると、私のコードには人物のクラスがなくHitクラスやInterfaceクラスだけがあるといった中途半端な状態となっている)

もう一度オブジェクト指向を勉強し直して再度挑戦したいです。

オブジェクト指向って難しく考えてしまって難しいぞ!

3
1
10

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
3
1