ブラックジャックプログラムの作成@Python

ゲーム

ベーシックストラテジーを元にPythonでブラックジャックのプログラムを作成した。

from operator import truediv
import random

def main():
    """ 
    メイン関数
    ©nekonisi.info
    """
    init()
    for i in range(10000):
        game()
        deal()

    print("Player Win " + str(player.win))
    print("Player Lose " + str(player.lose))

def game():
    """
    ゲームプレイ
    """
    # 最初にディーラーがカードを2枚ドロー
    dealer.draw(deck.pop())
    dealer.draw(deck.pop())
    openCard = dealer.hand[0]

    print("Open Card is " + str(openCard))

    # 次にプレイヤーがカードを2枚ドロー
    player.draw(deck.pop())
    player.draw(deck.pop())

    # マニュアルモード
    # player.openHand()
    # player.say()
    # print("cmd? Hit:1 Stand:2")
    # cmd = input()

    # while cmd == "1":
    #     player.hit(deck.pop())
    #     player.say()
    #     if (player.score > 21 or player.score == 21):
    #         break
    #     print("cmd? Hit:1 Stand:2")
    #     cmd = input()

    # オートマ(ベーシックストラテジー)
    cnt = 0
    while cnt <= 10:
        if player.score <= 11:
            player.hit(deck.pop())
        elif player.score == 12:
            if (4 <= openCard.num and 6 <= openCard.num):
                player.hit(deck.pop())
        elif player.score == 13:
            if (player.softFlg == True or 6 < openCard.num):
                player.hit(deck.pop())
        elif 14 <= player.score <= 16:
            if (player.softFlg == True or 6 < openCard.num):
                player.hit(deck.pop())
        elif player.score == 17 and player.softFlg == True:
            player.hit(deck.pop())
        elif player.score == 18 and player.softFlg == True and 9 <= openCard.num:
            player.hit(deck.pop())
        cnt += 1
        
    # ディーラーは17未満ならヒットし続ける
    while dealer.score < 17: dealer.hit(deck.pop()) player.say() dealer.say() def deal(): """ 決着 """ if player.score > 21: # Player Busted!
        print(player.name + " Lose...")
        player.lose += 1
    elif player.score == dealer.score:
        print("Draw!")
    elif (dealer.score > 21 or player.score > dealer.score):
        print(player.name + " Win!")
        player.win += 1
    else:
        print(player.name + " Lose...")
        player.lose += 1
    # スコアリセット
    player.__init__()
    dealer.__init__()
    # 10枚以下になったらカードを初期化
    if len(deck) < 10: deck.__init__() def init(): """ 初期化 """ global deck global player global dealer # デッキクラスの初期化 deck = Deck() # PlayerおよびDealderの初期化 player = Player() dealer = Dealer() class Deck(list): """ デッキクラス、リスト型を拡張 Cardオブジェクトを52枚持つ """ def __init__(self): for suit in ['♠', '♣', '♡', '♢']: for num in range(1, 14): self.append(Card(num, suit)) random.shuffle(self) class Card: """ カードクラス """ def __init__(self, num, suit): """初期化(数、マーク)""" self.num = num self.suit = suit def __repr__(self): return self.suit + str(self.num) class Human: """ 人間基盤クラス """ def __init__(self): self.hand = [] self.name = "" self.score = 0 self.softFlg = False # ソフトカードがあるかどうかのフラグ def draw(self, card): """ draw Parameters ---------- card : Card ヒットしたCardインスタンス """ self.hand.append(card) self.calculate() def hit(self, card): """ ヒット Parameters ---------- card : Card ヒットしたCardインスタンス """ self.draw(card) print(self.name + " draw " + str(card)) def calculate(self): """ スコア計算 """ self.score = 0 for card in self.hand: if card.num >= 10: # 10と絵柄の場合
                self.score += 10
            elif card.num == 1: # Aの場合
                self.softFlg = True
                self.score +=11
            else:
                self.score += card.num
        
        # 21をオーバーする場合はAを-10する
        for card in self.hand:
            if card.num == 1:
                if self.score > 21:
                    self.softFlg = False
                    self.score -= 10

    def say(self):
        """
        スコアを公開する
        """
        print(self.name + "`s score is " + str(self.score))
        if self.score == 21:
            print(self.name + " is BJ!")
        elif self.score > 21:
            print(self.name + " Busted!")

    def openHand(self):
        """
        手札を公開する
        """
        print(self.name + "`s hand are ")
        for card in self.hand:
            print(str(card))

class Dealer(Human):
    """ディーラークラス"""
    def __init__(self):
        super().__init__()
        self.name = "Dealer"

class Player(Human):
    """プレイヤークラス"""
    win = 0 # 勝数
    lose = 0 # 負け数

    def __init__(self):
        super().__init__()
        self.name = "Player"

if __name__ == "__main__":
    main()

実行結果を見れば負けることが一目瞭然!

Player Win 4281
Player Lose 4800

コメント

タイトルとURLをコピーしました