ベーシックストラテジーを元に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
コメント