Cấu trúc các classes với kế thừa và đa hình Python (phần 7)

Ví dụ 2: Dealer và một Player trong Game Blackjack (tiếp tục)

Sau đây là một mẫu chạy của chương trình:

>>> from blackjack import Blackjack
>>> game = Blackjack()
>>> game.play()
Player:
2 of Spades, 5 of Spades
7 points Dealer:
5 of Hearts
Do you want a hit? [y/n]: y
Player:
2 of Spades, 5 of Spades, King of Hearts
17 points
Do you want a hit? [y/n]: n
Dealer:
5 of Hearts, Queen of Hearts, 7 of Diamonds
22 points
Dealer busts and you win

Khi một Player object được tạo, nó nhận 2 cards. Một Player object có thể bị hit với card khác,
có thể được yêu cầu cho các điểm trong tay nó, và có thể được yêu cầu cho trình bày string của nó. Sau
đây là code cho Player class, theo sau bởi một giải thích ngắn:

from cards import Deck, Card
class Player(object):

“””This class represents a player in
a blackjack game.”””
def __init__(self, cards):

self.cards = cards

def __str__(self):

“””Returns string rep of cards and points.”””
result = “, “.join(map(str, self.cards))
result += “\n ” + str(self.getPoints()) + ” points”
return result

def hit(self, card):

self.cards.append(card)

def getPoints(self ) :

“””Returns the number of points in the hand.”””
count = 0
for card in self.cards:

if card.rank > 9:

count += 10

elif card.rank == 1:

count += 11

else:

count += card.rank

# Deduct 10 if Ace is available and needed as 1

for card in self.cards:

if count <= 21:

break

elif card.rank == 1:

count -= 10

return count

def hasBlackjack(self):

“””Dealt 21 or not.”””
return len(self.cards) == 2 and self.getPoints() == 21

Vấn đề tính toán các điểm trong tay player gặp phức tạp bởi thực tế rằng một ace có thể đếm như 1 hoặc
11. Phương thức getPoints giải quyết vấn đề này bằng cách trước tiên tính tổng các points sử dụng một
ace như 11. Nếu đếm ban đầu này là lớn hơn 21, thì có một cần để đếm một ace, nếu có một cái, như một 1.
Vòng lặp thứ hai hoàn thành cái này bằng cách đếm các aces như vậy miễn là chúng là có sẵn và được cần.
Các phương thức không yêu cầu comment.

Chia sẻ