-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathplayer.py
166 lines (141 loc) · 5.08 KB
/
player.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
from card import Card
class BlackjackPlayer:
'''ブラックジャックのプレイヤーを表すクラス
Attributes:
----------
balance: int
プレイヤーの残高
hand: list
プレイヤーの手札
dealer_card: Card
ディーラーの1枚目のカード
last_dealer_hand: [Card]
ディーラーが開いた手のリスト
round: int
デッキがシャッフルされてからのラウンド数
Methods:
-------
place_bet(balance)
残高の範囲で賭け金を指定する。0を指定するとゲームを終了する
start_turn(round)
プレイヤーのターンを開始する。roundはデッキがシャッフルされてからのラウンド数
receive_hand(hand)
プレイヤーの手札を記録する
look_dealer_hand(card)
ディーラーの1枚目のカードを記録する
finish_dealer_hand(card)
ディーラーが開いたカードを記録する
input(message)
プレイヤーがヒットかスタンドかの選択をする
notify_result(result, bet_amount)
通知された結果に応じてプレイヤーの残高を更新する
'''
def __init__(self, balance):
'''
Parameters:
----------
balance: int
プレイヤーの残高
'''
self.balance = balance
self.hand = []
def __str__(self):
'''手札と合計を文字列として返す
Returns:
-------
str
手札と合計を表す文字列
'''
return f"手札: {self.hand} 合計: {Card.sum(self.hand)}" # プレイヤーの手札と合計を文字列として返す
def place_bet(self, balance):
'''プレイヤーの賭け金を設定する。0を指定するとゲームを終了する
Parameters:
----------
balance: int
プレイヤーの残高
Returns:
-------
bet_amount: int
プレイヤーが賭けた金額
'''
while True:
try:
bet_amount = int(input(f"賭け金を入力してください。(残高: ${balance}) "))
except ValueError:
print("無効な入力です。")
continue
else:
return bet_amount
def start_turn(self, round):
'''ターンを開始する。シャッフルされてからのラウンド数を受け取って記録する。
手札はリセットする。
Parameters:
----------
round: int
デッキがシャッフルされてからのラウンド数
'''
self.round = round
self.hand = [] # プレイヤーの手札をリセット
def receive_hand(self, hand):
'''配られた手札を記録する
Parameters:
----------
hand: list
手札を表すCardクラスのインスタンスのリスト
'''
self.hand = hand # プレイヤーの手札を記録
def look_dealer_hand(self, card):
'''ディーラーの1枚目のカードを記録する
Parameters:
----------
card: Card
ディーラーの1枚目のカードを表すCardクラスのインスタンス
'''
self.dealer_card = card # ディーラーの1枚目のカードを記録
def finish_dealer_hand(self, hand):
'''ディーラーが開いたカードを記録する
Parameters:
----------
card: Card
ディーラーが開いたカードを表すCardクラスのインスタンス
'''
self.last_dealer_hand = hand.copy() # ディーラーが開いたカードを記録
def input(self, message):
''' プレイヤーにヒットかスタンドを選択させる
Parameters:
----------
message: str
プレイヤーに表示するメッセージ
Returns:
-------
choice: str
プレイヤーが選択した行動 hitかstand
'''
while True:
choice = input(message)
if choice in ["hit", "stand"]:
return choice
else:
print("無効な入力です。")
continue
def notify_result(self, result, bet_amount):
'''プレイヤーの残高を結果によって更新する。結果は以下のいずれか
- win: プレイヤーが勝利した場合
- lose: プレイヤーが敗北した場合
- push: 引き分けの場合
- それ以外: 無効な結果の場合
Parameters:
----------
result: str
結果を表す文字列
bet_amount: int
プレイヤーが賭けた金額
'''
if result == "win":
self.balance += bet_amount
elif result == "lose":
self.balance -= bet_amount
elif result == "push":
pass
else:
print("無効な結果です。")