#初めに
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クラスだけがあるといった中途半端な状態となっている)
もう一度オブジェクト指向を勉強し直して再度挑戦したいです。
オブジェクト指向って難しく考えてしまって難しいぞ!